servlet一些小问题

 HttpServlet继承了genericServlet,而genericservlet(抽象类,该抽象类中只有一个抽象方法,那就是service()方法,其他的方法都是非抽象的)实现了servlet,servletconfig,serializable接口。Servlet接口中有有五个抽象方法,分别是init(),gerServletConfig(),service(),getServletInfo(),destroy(),HttpServlet继承了genericServlet,并且只重写了它的service()方法,其他的方法都没有重写,HttpServlet中又自己增加了一些方法,例如doPost(),doGet()等方法。HttpServlet中的service()方法主要是用来处理客户端的请求,如果客户端请求的参数是get,则在service()中调用doGet方法,如果是post,则在service中调用doPost方法,service起到了一个分发请求的作用。一般情况下,我们在编写servlet时只需要继承HttpServlet,重写doGet,doPost方法即可。不用重写service方法,因为这时service方法中会根据客户端的请求自动判断是get请求还是post请求,然后调用对应的方法。

     在商城管理系统的设计中,为了提高代码的简洁性,要设计一个BaseServlet用来作为其他servlet的父类,使每一个模块只需要一个servlet就能满足所有的需求,例如用户模块原本要使用LoginServlet,LogoutServlet,RegisterServlet等等,现在只需要 设计一个UserServlet即可,UserServlet继承了BaseServlet,在UserServlet中只用创建login(),logout(),register()方法等,进行相应需求的开发即可。在页面访问请求的时候,将需要调用业务对应的方法作为method参数的值一并传递即可,例如http://localhost:8080/store_v2.0/UserServlet?method=register但是如上面所说,一般情况下,我们编写的servlet继承自HttpServlet,不需要重写service方法,因为我们的method请求参数不是get,就是post,HttpServlet中的service已经为我们判断了这两个参数。但是现在我们在这个作业中编写的UserServlet里面已经不止有get,post请求了,还有其他的请求,例如login,logout,register等等,这时如果还是继承HttpServlet,那么就无法调用login,logout等请求了。所以需要设计一个BaseServlet来满足请求。BaseServlet继承HttpServlet,重写service方法,在重写的service方法中,进行不同请求的处理。而其他的模块对应的servlet继承BaseServlet即可,但是这又引发了一个新的问题出现了,在整个系统中,有很多模块,用户模块,商品模块等等。用户模块有login,logout,register需求,商品模块有selectone,selectall,selectbyid等需求,不可能把所有的需求都放到BaseServlet中的service方法中,(虽然把这些方法全放到service中,调用起来很容易理解),所以为了方便,在BaseServlet的service方法中使用反射机制,根据客户端请求带来的method的值进行不同的需求调用。下面是BaseServlet的实现方案:

Public classBaseServlet entends HttpServlet{

@Override

Protect void service(HttpServletRequestrequest,HttpServletResponse response){

String methodName =request.getParameter("method");

If(methodName == null ||"".equals(methodName)){

Response.getWriter.println("参数不存在");

Return;

}

//获得子类的Class对象

Class clazz = this.getClass();

//获得子类的方法

Try{

Methodmethod1=clazz.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);

//执行子类的方法

String path =(String)method1.invoke(this,request,response);

If(path != null){

Request.getRequestDispatcher(path).forward(request,response);

}

}catch(Exception e){

E.printStackTrace();

}

}

}

猜你喜欢

转载自blog.csdn.net/kaichekaihanma/article/details/78472273