在我们刚开始编写java web程序时,可能会一个jsp页面功能对应一个服务器的servlet。例如对我们的客户表(Customer)实行增删改查时,每个操作对一个servlet。这样的话,不仅使得代码量很大,而且会使得代码不好管理。那我们想到的是,怎么实现JSP页面的多个请求对应一个servlet呢?通过一个servlet完成增删改查等多个功能呢?
例如我的jsp页面中查询数据库中的表customer时,展现的如下图所示
我们需要实现的是在输入框中输入要查找的名字或者地址或者电话时,可以实现模糊查询,点击submit时,可以在当前页面下面显示查询的数据结果,例如输入数据库中有的用户名rose
再点击submit,页面呈现
当点击upadate和Delete,可是实现对用户的信息修改和删除功能。在我们刚开始的学习中,会将这些功能都分别对应一个servlet,现在实现的就是这些功能都对应一个servlet。
第一:我们可以在jsp页面中对from中的action统一格式为<form action="query.do" method="post"><td><a href="addCustomer.jsp">Add a new customer</a></td><td><a href="edit.do?id=<%=customer.getId() %>">Update</a></td>
<td><a href="delete.do?id=<%=customer.getId() %>">Delete</a></td>。都以.do结尾。
那么在我们的一个名为CustomerServlet的web.xml配置文件中可以改写为
那么只要页面中以.do结尾的action在提交后,都会去寻找CustomerServlet。那么我们在CustomerServlet中怎么辨别每一个不同的action呢?我们的做法如下:我们在CustomerServlet中的doGet方法中实现
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取servletpath
String servletPath = request.getServletPath();
//去除路径后缀名中的.do
String methodName = servletPath.substring(1);
methodName = methodName.substring(0, methodName.length()-3);
try {
//利用反射获取methodName 对应的方法
Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class,
HttpServletResponse.class);
//利用反射调用相应的方法
method.invoke(this, request, response);
} catch (Exception e) {
response.sendRedirect("error.jsp");
}
}
这样实现可以根据页面的不同请求,截掉.do,得到不同请求名。但注意的是必须页面中的请求名和seevlet中各实现功能的方法名相同。如页面中是delete.do,那么我们的servlet中的方法名就应该写成delete,这样才能该请求获取相应的功能。