关于GenericServlet和HttpServlet

1.GenericServlet:
1).是一个Servlet 。是Servlet接口和ServletConfig接口的实现类。但是一个抽象类。其中的service方法为抽象类
2).如果新建的Servlet程序 直接继承GenericServlet会使开发更简洁。
3).具体实现:
①.在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化
②.利用servletConfig 成员变量的方法实现了ServletConfig接口的方法
③.还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化
④.不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(config);,而还是用了ServletConfig接口的方法,
则会出现空指针异常。
⑤.新建的init(){}并非Servlet 的生命周期方法。而init(ServletConfig)是生命周期相关的方法。
public abstract  class MyGenericServlet implements Servlet ,ServletConfig{	
	/*以下方法为Servlet接口的方法*/
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}
	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return servletConfig;
	}
	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}
	private ServletConfig servletConfig;
	@Override
	public void init(ServletConfig arg0) throws ServletException {
		this.servletConfig=arg0;
		init();
	}
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException ;
	
	@Override
	public String getInitParameter(String arg0) {
		// TODO Auto-generated method stub
		return servletConfig.getInitParameter(arg0);
	}
/*以下方法为ServletConfig接口的方法*/
	@Override
	public Enumeration<String> getInitParameterNames() {
		// TODO Auto-generated method stub
		return servletConfig.getInitParameterNames();
	}
	@Override
	public ServletContext getServletContext() {
		// TODO Auto-generated method stub
		return servletConfig.getServletContext();
	} 
	@Override
	public String getServletName() {
		// TODO Auto-generated method stub
		return servletConfig.getServletName();
	}
}
2.HttpServlet
1).是一个Servlet(),继承自GenericServlet。针对于HTTP协议所定制。
2)在service()方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse
并调用了重载的service(HttpServletRequest request, HttpServletResponse response)获取了请求方式:request.getMethod().
根据请求方式又创建了doXXX()方法(XXX代表具体的请求方式 ,比如doGET,doPOST)
代码:
@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		if (arg0 instanceof HttpServletRequest) {
			HttpServletRequest request=(HttpServletRequest)arg0;
			
			if (arg1 instanceof HttpServletResponse) {
				HttpServletResponse response=(HttpServletResponse) arg1;
				service(request,response);//重载
			}
		}
		
		
	}
	private void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		// TODO Auto-generated method stub
		//1.获得请求方式
		String method =request.getMethod();
		//2.根据请求方式在调用对应的处理方法。
		if ("GET".equalsIgnoreCase(method)) {
			doGet(request,response);
		}else if ("POST".equalsIgnoreCase(method)) {
			doPost(request,response);
		}
	}
	private void doPost(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		
	}
	private void doGet(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		
	}	
3).实际开发中, 直接继承HttpServlet,并根据请求方式复写doXXX()方法即可。
4).好处:直接有针对性的覆盖doXXX()方法;直接使用HttpServletRequest和 HttpServletResponse ,不在需要强转。

阅读更多
个人分类: Servlet
上一篇Get和Post请求和如何在Servlet中获取请求信息
下一篇JSP的9个隐含对象
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭