关于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 ,不在需要强转。

关于GenericServlet抽象类的疑问..

10-23

GenericServlet实现了servlet接口的同时,也实现了ServletConfig接口(也同时实现了java.io.Serializable接口)rnServeletConfig 接口中的四个方法,GenericServlet是如下实现的:rn[code=Java]rn/*rn 以下四个方法都是实现的ServletConfig接口中的方法rn public ServletContext getServletContext() rn return getServletConfig().getServletContext();rn rnrn public String getInitParameter(String name) rn return getServletConfig().getInitParameter(name);rn rn rnrn public Enumeration getInitParameterNames() rn return getServletConfig().getInitParameterNames();rn rn rn rn //该方法实现了接口中的getServletName方法rn // 获取在web.xml文件中注册的servlet名称。如果没有在web.xml 中注册的servlet,该方法直接放回该servlet的类名。 rn public String getServletName() rn return config.getServletName(); //此处也可不以写成return getServletConfig().getServletName();???rn rn[/code]rnrnrn上面的最后一个方法:rn在实现getServletName()这个方法时,它调用的是config对象的引用。因为在自身带参数的构造方法中 已经将ServletConfig作为参数传递给私有成员变量config作为引用,所以这个理解起来没问题.rnrn但是它这里为什么不像前面三个方法实现的那样使用getServletConfig().getServletName(); 来实现呢? rn代码可不可以写成这样子:rn[code=Java]rn public String getServletName() rn getServletConfig().getServletName();rn rn[/code]rnrn请高手讲解下......rn

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭