标签:
1 BaseServlet的作用
在开始客户管理系统之前,我们先写一个工具类:BaseServlet。
我们知道,写一个项目可能会出现N多个Servlet,而且一般一个Servlet只有一个方法(doGet或doPost),如果项目大一些,那么Servlet的数量就会很惊人。
为了避免Servlet的“膨胀”,我们写一个BaseServlet。它的作用是让一个Servlet可以处理多种不同的请求。不同的请求调用Servlet的不同方法。我们写好了BaseServlet后,让其他Servlet继承BaseServlet,例如CustomerServlet继承BaseServlet,然后在CustomerServlet中提供add()、update()、delete()等方法,每个方法对应不同的请求。
2 BaseServlet分析
我们知道,Servlet中处理请求的方法是service()方法,这说明我们需要让service()方法去调用其他方法。例如调用add()、mod()、del()、all()等方法!具体调用哪个方法需要在请求中给出方法名称!然后service()方法通过方法名称来调用指定的方法。
无论是点击超链接,还是提交表单,请求中必须要有method参数,这个参数的值就是要请求的方法名称,这样BaseServlet的service()才能通过方法名称来调用目标方法。例如某个链接如下:
<a href=”/xxx/CustomerServlet?method=add”>添加客户</a>
3 代码实例
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>cn.itcast.web.servlet.AServlet</servlet-class> </servlet> <servlet> <servlet-name>BServlet</servlet-name> <servlet-class>cn.itcast.web.servlet.BServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/AServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BServlet</servlet-name> <url-pattern>/BServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
package cn.itcast.web.servlet; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class BaseServlet extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 获取参数,用来识别用户想请求的方法 * 2. 然后判断是否哪一个方法,是哪一个我们就调用哪一个 */ String methodName = req.getParameter("method"); if(methodName == null || methodName.trim().isEmpty()) { throw new RuntimeException("您没有传递method参数!无法确定您想要调用的方法!"); } /* * 得到方法名称,是否可通过反射来调用方法? * 1. 得到方法名,通过方法名再得到Method类的对象! * * 需要得到Class,然后调用它的方法进行查询!得到Method * * 我们要查询的是当前类的方法,所以我们需要得到当前类的Class */ Class c = this.getClass();//得到当前类的class对象 Method method = null; try { method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); } catch (Exception e) { throw new RuntimeException("您要调用的方法:" + methodName + "(HttpServletRequest,HttpServletResponse),它不存在!"); } /* * 调用method表示的方法 */ try { String result = (String)method.invoke(this, req, resp); /* * 获取请求处理方法执行后返回的字符串,它表示转发或重定向的路径! * 帮它完成转发或重定向! */ /* * 如果用户返回的是字符串为null,或为"",那么我们什么也不做! */ if(result == null || result.trim().isEmpty()) { return; } /* * 查看返回的字符串中是否包含冒号,如果没有,表示转发 * 如果有,使用冒号分割字符串,得到前缀和后缀! * 其中前缀如果是f,表示转发,如果是r表示重定向,后缀就是要转发或重定向的路径了! */ if(result.contains(":")) { // 使用冒号分割字符串,得到前缀和后缀 int index = result.indexOf(":");//获取冒号的位置 String s = result.substring(0, index);//截取出前缀,表示操作 String path = result.substring(index+1);//截取出后缀,表示路径 if(s.equalsIgnoreCase("r")) {//如果前缀是r,那么重定向! resp.sendRedirect(req.getContextPath() + path); } else if(s.equalsIgnoreCase("f")) { req.getRequestDispatcher(path).forward(req, resp); } else { throw new RuntimeException("你指定的操作:" + s + ",当前版本还不支持!"); } } else {//没有冒号,默认为转发! req.getRequestDispatcher(result).forward(req, resp); } } catch (Exception e) { System.out.println("您调用的方法:" + methodName + ", 它内部抛出了异常!"); throw new RuntimeException(e); } } }
package cn.itcast.web.servlet; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 在这里给出多个请求处理方法 * 请求处理方法:除了名称以外,都与service方法相同! * @author cxf * */ public class AServlet extends BaseServlet { public void addUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("addUser()..."); throw new IOException("测试一下"); } public void editUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("editUser()..."); } public void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("deleteUser()..."); } public void loadUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("loadUser()..."); } public void findAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("findAll()..."); } }
package cn.itcast.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BServlet extends BaseServlet { public String fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("fun1()..."); return "/index.jsp"; } public String fun2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("fun2()..."); return "r:/index.jsp"; } public String fun3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("fun3()..."); return "d:/WEB-INF/files/a.rmvb"; } }
标签:
原文地址:http://www.cnblogs.com/zhangym/p/5551279.html