1. 程式人生 > >尚矽谷JavaWeb的自學之路五(MVC案例-1)

尚矽谷JavaWeb的自學之路五(MVC案例-1)

MVC的小案例總結(1)

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 的資訊嗎?