尚硅谷JavaWeb的自学之路五(MVC案例-1)

MVC的小案例总结(1)

尚硅谷JavaWeb的自学之路五(MVC案例-1)

1.整体的架构:

尚硅谷JavaWeb的自学之路五(MVC案例-1)

2. 多个请求对应一个Servlet

1). Servlet映射为 *.do : 可以接收一切以 .do 结尾的请求

   <servlet-mapping>
      <servlet-name>customerServlet</servlet-name>
      <url-pattern>*.do</url-pattern>
   </servlet-mapping>

2). 在Servlet的 doGet 和 doPost 方法中:

    //1.获取ServletPath:/update.do或/add.do
  String servletPath=request.getServletPath();
  
  //2.去除 / 和 .do ,得到类似于update 或 add 这样的字符串:update 或 add
  String methodName=servletPath.substring(1);
  methodName=methodName.substring(0, methodName.length()-3);
  
  try {
   //3.利用反射获取methodName 对应的方法:update 或 add 对应的Method
   Method method=getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
   //4.利用反射调用对应的方法:调用update 或 add
   method.invoke(this, request,response);
  } catch (Exception e) {
   //e.printStackTrace();
   //若要调用的方法不存在,响应一个error.jsp 页面
   response.sendRedirect("error.jsp");
  }

3. 查询:MVC 的整个流程

query.do  ---> doPost ---> query  ---> JSP

query 方法的代码:
//1.直接调用CustomerDAO 的getForListWithCriteriaCustomer() 方法得到Customer 的集合
   List<Customer> customers=customerDAO.getForListWithCriteriaCustomer(cc);
  
//2.把Customer 的集合放入request中
   request.setAttribute("customers", customers);
  
//3.转发页面到index.jsp (不能使用重定向!)
   request.getRequestDispatcher("/index.jsp").forward(request, response); 

JSP:获取request 中的属性,并且遍历显示

   <%
        List<Customer> customers=(List<Customer>)request.getAttribute("customers");
               for(Customer customer:customers){
    %>
      <tr>
      <td><%= customer.getId() %></td>
      <td><%= customer.getName() %></td>
      <td><%= customer.getAddress() %></td>
      <td><%= customer.getPhone() %></td>
      <td>
        <a href="">UPDATE</a>
        <a href="delete.do?id=<%= customer.getId() %>" class="delete">DELETE</a>
      </td>
     </tr>
    <%  
       }
     %> 

4. 模糊查询:

1). 正常的SQL:
 
  String sql = “SELECT id, name, address, phone FROM customers WHERE " +
                    "name LIKE ? AND address LIKE ? AND phone LIKE ?";

2). 填充占位符的技巧:以 name 属性为例:若name 字段为null ,返回 "%%" ;若不为 null,则返回"%"+name+"%"

public String getName() {
 if(name==null){
  name="%%";
 }else{
  name="%"+name+"%";
 }
 return name;
}

3). 把查询条件封装为一个 JavaBean

public class CriteriaCustomer {

 private String name;
 
 private String address;
 
 private String phone;
 
 //...
}

5. 删除:

1). 超链接:delete.do?id=<%=customer.getId()%>
2). Servlet 的 delete 方法
    ①. 获取 id
    ②. 调用 DAO 执行删除
    ③. 重定向到 query.do(若目标页面不需要读取当前请求的 request 属性,就可以使用重定向),将显示删除后的 Customer 的 List
3). JSP 上的 jQuery 提示:
    确定要删除 xx 的信息吗?