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