Servlet入门
一、Servlet概念
Servlet是sun公司提供的一门用于开发动态Web资源的技术。简单的理解Servlet就是指实际了javax.servlet.Servlet接口的java类,只个服务端的小程序而已。由于Servlet也是个java Class类,所以必须也要编译,编译后的.class文件要放在应用的WEB-INF文件夹的classes文件中。
二、Servlet的执行过程详解:
1. 当客户端访问http://localhost:8080/demo1/hello时,web容器tomcat会截获到/hello的地址,会在web.xml的servlet-mapping中进行找是否有/hello的url-pattern。
2. 当找到了再获取servlet-name,此时再根据servlet-name去在servlet元素中找servlet-class。
3. 若找到了servlet-class后,则tomcat会装载并构造Servlet,并执行Servlet的init方法,接着调用servlet的servive方法。
三、Servlet的生命周期
当客户端发送一个请求而请求的url是Servlet的url-pattern时,那会web容器会捕获到。此时容器会判断此Servlet是否已经存在了对象。若不存在对象则按如下步骤执行:
1. 容器装载Servlet,执行static块…
2. 容器构造并创建Servlet对象实例。
3. 容器调用Servlet的init方法。
4. 容器将http请求消息信息封闭到HttpServletRequest对象中去,而创建一个HttpServletResponse对象,再将此两个对象作为实参,调用传递到service方法中。
接着容器执行Servlet的service方法。此service方法代码有将内容封装设置到response对象相应的属性域中。
5. 容器执行完servlet方法后,下次再来个HTTP请求,则只会从步骤4开始执行。不再构造Servlet对象和init了。而当应用服务被停止(如在tomcat中manage 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类是基类、有void init(ServerConfig config)、StringgetServletInfo()、void service(ServletRuqest,ServletResponse)、void destroy()、ServletConfiggetServletConfig()方法。
GenericServlet相对于Servlet的适配器类它实现了Servlet中大部分方法(其中很多方法都是空实现),但service方法未实现是abstract抽象的。所以此类是abstract抽象的。
HttpServlet是继承于GenericServlet类,且在service方法中有模板方式模式,会根据请求的类型,调用doGet或doPost方法,但此doGet或doPost方法没有意义需要Coder自行实现。
五、Servlet映射的细节
在Servlet的url-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.servet3。3.servlet1。4.servlet2。5.servlet2。