尚硅谷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 的信息吗?