GenericServlet介绍

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

GenericServlet类1.GenericServlet原理分析GenericServlet类是一个抽象类,并且是Servlet接口的实现类,HttpServlet类的父类,下面我们通过一张图来更直观的了解GenericServlet的类结构,如图1-1所示:图1-1GenericServlet类结构通过图1-1发现,GenericServlet类不仅实现了Servlet接口,还实现了ServletConfig接口。因此,在GenericServlet类中一定包含Servlet接口和ServletConfig接口的所有方法.。接下来,我们创建一个类来模拟GenericServlet的功能,详情请参考GenericServlet案例详解,点击此处Example11.zip下载源代码。(1)创建应用Example11,新建一个类MyServlet,该类实现了Servlet接口,具体代码如例1-1所示:例1-1MyServlet.javapublicclassMyServletimplementsServlet{/**成员变量config**/privateServletConfigconfig;publicvoidinit(){}@Overridepublicvoiddestroy(){System.out.println(destroyrun......);}/**返回config,该方法一定在init方法之后执行**/@OverrideServlet接口ServletConfig接口publicServletConfiggetServletConfig(){returnconfig;}@OverridepublicStringgetServletInfo(){returnMyServlet....;}/**init()方法是这些方法中,最先被调用的,在本类构造方法执行后执行.**/@Overridepublicvoidinit(ServletConfigservletConfig)throwsServletException{/**将服务器创建的servletConfig对象赋值给本类的成员变量config,方便在其他方法中使用**/this.config=servletConfig;init();}@Overridepublicvoidservice(ServletRequestarg0,ServletResponsearg1)throwsServletException,IOException{System.out.println(servicerun......);}/**获得Servlet的初始化参数**/publicStringgetInitParameter(Stringname){returnthis.config.getInitParameter(name);}/**获得ServletContext对象**/publicServletContextgetServletContext(){returnthis.config.getServletContext();}publicStringgetServletName(){returnthis.config.getServletName();}}由例1-1可知,当前的MyServlet类中不仅包含了Servlet接口的五个方法,还包含了以下方法:publicServletConfiggetServletContext()publicStringgetInitParameter(Stringname)publicStringgetServletName()由于GenericServlet类实现了ServletConfig接口,那么必然重写了ServletConfig的方法,因此在MyServlet类中也要定义了ServletConfig的相关方法,这些方法的实现都是通过成员变量config调用自身的方法来实现的。另外MyServlet类中还有一个无参的init()方法,该方法不是生命周期方法,它会被生命周期方法init(ServletConfig)方法调用。这样做的目的是为了方便继承MyServlet类的子类,完成自己所需要的初始化工作,而不用再定义一个ServletConfig类型的成员变量。(2)再创建一个Servlet类,让该类继承MyServlet类,具体代码如例1-2所示:例1-2SonServlet.javapublicclassSonServletextendsMyServlet{@Overridepublicvoidinit(ServletConfigconfig){//TODOAuto-generatedmethodstubSystem.out.println(iamsonservlet.......);}@Overridepublicvoidservice(ServletRequestarg0,ServletResponsearg1)throwsServletException,IOException{Stringvalue=getInitParameter(name);}}由例1-2可知,在SonServlet中定义了本类的init(ServletConfig)方法,该方法会覆盖父类的init(ServletConfig)方法。那么第一次访问该Servlet时,服务器会调用子类的init()生命周期方法进行初始化,父类的init()生命周期方法没有被调用,那么父类的config成员就为null,当SonServlet类中的service方法调用父类的getInitParameter()方法时就会出现空指针异常。所以,SonServlet类中不能覆写有参的init()方法,而应该覆写无参的init()方法。这也是为什么在MyServlet类中定义一个无参的init()方法,然后再在有参的init方法中调用无参的init方法的原因。以上案例就是为了方便开发人员开发Servlet,以后就不用去实现Servlet接口。现在我们来看一下GenericServlet的源码,源码的jar包点击此处apache-tomcat-7.0.42-src.zip进行下载。具体代码如例1-3所示:例1-3GenericServlet.javapublicabstractclassGenericServletimplementsServlet,ServletConfig,java.io.Serializable{privatestaticfinallongserialVersionUID=1L;privatetransientServletConfigconfig;publicGenericServlet(){}@Overridepublicvoiddestroy(){}@OverridepublicStringgetInitParameter(Stringname){returngetServletConfig().getInitParameter(name);}@OverridepublicEnumerationStringgetInitParameterNames(){returngetServletConfig().getInitParameterNames();}@OverridepublicServletConfiggetServletConfig(){returnconfig;}@OverridepublicServletContextgetServletContext(){returngetServletConfig().getServletContext();}@OverridepublicStringgetServletInfo(){return;}@Overridepublicvoidinit(ServletConfigconfig)throwsServletException{this.config=config;this.init();}publicvoidinit()throwsServletException{}publicvoidlog(Stringmsg){getServletContext().log(getServletName()+:+msg);}publicvoidlog(Stringmessage,Throwablet){getServletContext().log(getServletName()+:+message,t);}@Overridepublicabstractvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException;@OverridepublicStringgetServletName(){returnconfig.getServletName();}}由例1-3可知,GenericServlet类的原理和我们刚才写的MyServlet类的原理是一样的。继承GenericServlet类比实现Servlet接口更加方便Servlet开发。

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功