本篇博文总结以下Servlet的基础知识。
- Servlet的生命周期
- Servlet的三个装载时机
- Servlet的执行过程
- web.xml里面的相关配置都是什么意思
- Servlet路径跳转
- request和response的各个方法
- Filter
- war包的结构
- Servlet 3.0的新特性
Servlet的生命周期
- 创建Servlet。
- 执行构造方法,一般在Servlet第一次加载的时候执行。
- 执行初始化方法,init()。
- 根据Tomcat的解析执行不同的相应方法,主要有service(),doGet(),doPost()方法。
- 执行销毁方法,destory()。
Servlet的三个装载时机
首先明确一点。Servlet在创建之后,自始至终都是存在于内存中的。
- 第一次访问Servlet的时候创建。
- 容器(Tomcat)启动时创建(自动装载)。
- 由在web.xml文件中为Servlet设置的
<load-on-startup>
属性决定 - 数字越小,优先级越高,最小是0。
- 由在web.xml文件中为Servlet设置的
- Servlet文件被修改之后,需要重新装载servlet。
Servlet的执行过程
以<a href="servlet/HelloServlet"/>为例。
最简单的web.xml的配置如下:
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletTest</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
- 根据a标签里的路径去
<servlet-mapping></servlet-mapping>
这个标签里找路径所对应的servlet的名字。路径应该是存在这里的<url-pattern>/servlet/HelloServlet</url-pattern>
。 - 然后根据servlet的名字去
<servlet></servlet>
这个标签里找对应的java类。java类应该是存在这里的:<servlet-class>servlet.HelloServlet</servlet-class>
。 - 然后执行doGet()或者doPost()方法。这就是一个Servlet的最简单的执行过程。
web.xml里面的相关配置都是什么意思
No. | 元素 | 意义 |
---|---|---|
1 | servlet | 在向Servlet或者JSP页面制定初始化参数或者定制URL时,必须首先命名Servlet或者JSP页面。Servlet就是用来完成此项任务的。 |
2 | servlet-mapping | 一般在更改URL参数时,以便servlet可以访问初始化参数或者更容易的处理相对路径。在更改缺省URL的时候一般都会用到这个元素。 |
3 | load-on-startup | 标记容器是否在启动的时候就加载这个servlet,数字越小优先级越高。 |
4 | init-param | servlet的初始化参数。一般是以key-value的形式存在于servlet元素中的。 |
5 | context-param | context-param元素声明应用范围之内的初始化参数。 |
6 | filter | 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。 |
7 | filter-mapping | 一旦命名了过滤器元素,就要利用filter-mapping元素把它与一个或者多个JSP页面相关联。 |
8 | listener | 当建立,修改或者删除servlet时得到通知,Listener元素将指出事件监听程序类。 |
9 | error-page | 当程序抛出异常时,能够指定到显示的异常页面。 |
Servlet路径跳转
路径的跳转主要是分为两种:
- 第一种是服务器内部跳转,这个方法是使用最广泛的。
以相对路径为例:
request.getRequestDispatcher("../test.jsp").forward(request, response);
之后浏览器显示的路径就是:
http://localhost:8080/项目名称/test.jsp
- 第二种是使用请求重定向。
首先使用request.getContextPath()获得上下文对象。
response.sedRedirect(request.getContextPath()+"/test.jsp")
request和response的各个方法
Filter
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
扫描二维码关注公众号,回复:
123655 查看本文章
- Filter有如下几个用处。
- 在HttpServletRequest到达Servlet之前,拦截客户HttpServletRequest。
- 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
- 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
- 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题。
穿件一个Filter的步骤如下:
- 建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。
- 在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
- 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
- 对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
- 禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。
web.xml的配置如下:
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.mucfc.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern><!-- 表示处理根目录下的所有请求 -->
</filter-mapping>
映射到servlet:
<filter-mapping>
<filter-name>FilterName</filter-name>
<servlet-name>ServletName1</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>FilterName</filter-name>
<servlet-name>ServletName2</servlet-name>
</filter-mapping>
映射到JSP:
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/path/FileName.jsp</url-pattern>
</filter-mapping>
映射到任意URL:
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
war包的结构
下面是最常见的war包结构:
webapp.war
| index.jsp
|
|— images
|— META-INF
|— WEB-INF
| web.xml // WAR包的描述文件
|
|— classes
| action.class // java类文件,编译后的字节码
|
|— lib
other.jar // 依赖的jar包
share.jar
Servlet 3.0的新特性
http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/index.html