Servlet入门

一、Servlet概念

Servletsun公司提供的一门用于开发动态Web资源的技术。简单的理解Servlet就是指实际了javax.servlet.Servlet接口的java类,只个服务端的小程序而已。由于Servlet也是个java Class类,所以必须也要编译,编译后的.class文件要放在应用的WEB-INF文件夹的classes文件中。

二、Servlet的执行过程详解:

Servlet入门

1. 当客户端访问http://localhost:8080/demo1/hello时,web容器tomcat会截获到/hello的地址,会在web.xmlservlet-mapping中进行找是否有/hellourl-pattern

2. 当找到了再获取servlet-name,此时再根据servlet-name去在servlet元素中找servlet-class

3. 若找到了servlet-class后,则tomcat会装载并构造Servlet,并执行Servletinit方法,接着调用servletservive方法。

三、Servlet的生命周期

当客户端发送一个请求而请求的urlServleturl-pattern时,那会web容器会捕获到。此时容器会判断此Servlet是否已经存在了对象。若不存在对象则按如下步骤执行:

1. 容器装载Servlet,执行static

2. 容器构造并创建Servlet对象实例。

3. 容器调用Servletinit方法。

4. 容器将http请求消息信息封闭到HttpServletRequest对象中去,而创建一个HttpServletResponse对象,再将此两个对象作为实参,调用传递到service方法中。

接着容器执行Servletservice方法。此service方法代码有将内容封装设置到response对象相应的属性域中。

5. 容器执行完servlet方法后,下次再来个HTTP请求,则只会从步骤4开始执行。不再构造Servlet对象和init了。而当应用服务被停止(如在tomcatmanage web停止myapp的运行,点了stop按钮。又或者关闭tomcat服务如shutdown tomcat或直接关闭tomcat)时,则servlet消亡了,会执行在消亡前执行destroy()方法。

注意:若配置的Servlet元素标签中,有<load-on-startup>num</load-on-startup>代表web容器在启动后的几秒后,直接装配并创建Servlet对象,调用init(ServletConfig)方法。或web应用myapp被重新部署时,destory会执行,接着会构造创建servlet并调用init

四、Servlet体系常用类

Servlet入门

Servlet类是基类、有void init(ServerConfig config)StringgetServletInfo()void service(ServletRuqest,ServletResponse)void destroy()ServletConfiggetServletConfig()方法。

GenericServlet相对于Servlet的适配器类它实现了Servlet中大部分方法(其中很多方法都是空实现),但service方法未实现是abstract抽象的。所以此类是abstract抽象的。

HttpServlet是继承于GenericServlet类,且在service方法中有模板方式模式,会根据请求的类型,调用doGetdoPost方法,但此doGetdoPost方法没有意义需要Coder自行实现。

五、Servlet映射的细节

Servleturl-pattern中,可以使用通配*代表任意通常*通配结合/**.do的使用。

URL的匹配原则顺序是:绝对匹配、从前往后最相似的进行匹配。如下面的几个小例:

Servlet1 映射到 /abc/*Servlet2映射到 /*

Servlet3 映射到 /abc Servlet4映射到 *.do

问:

1. 请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应?

2. 请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应?

3.请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应?

4.请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应?

5.请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应?

答:1.servlt1 2.servet33.servlet14.servlet25.servlet2