Chinaunix首页 | 论坛 | 博客
  • 博客访问: 518057
  • 博文数量: 260
  • 博客积分: 10435
  • 博客等级: 上将
  • 技术积分: 1939
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:50
文章分类

全部博文(260)

文章存档

2011年(22)

2010年(209)

2009年(29)

我的朋友

分类: Java

2010-11-18 14:28:51

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰。

        首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:listener -> filter -> servlet

        同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet

        对于某类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。

        servlet 同 filter 类似,此处不再赘述。

       由此,可以看出,web.xml 的加载顺序是:context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

 

web.xml文件详解

Xml代码
  1. Web.xml常用元素   
  2. <web-app>   
  3. <display-name>display-name>定义了WEB应用的名字   
  4. <description>description> 声明WEB应用的描述信息   
  5.   
  6. <context-param>context-param> context-param元素声明应用范围内的初始化参数。   
  7. <filter>filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。   
  8. <filter-mapping>filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。   
  9. <listener>listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。   
  10.                      Listener元素指出事件监听程序类。   
  11. <servlet>servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。   
  12. <servlet-mapping>servlet-mapping> 服务器一般为servlet提供一个缺省的URL:。   
  13.               但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。   
  14.   
  15. <session-config>session-config> 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。   
  16.           可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。   
  17.   
  18. <mime-mapping>mime-mapping>如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。   
  19. <welcome-file-list>welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。   
  20. <error-page>error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。   
  21. <taglib>taglib> 对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,   
  22.                   而不用编辑使用这些文件的JSP页面。   
  23. <resource-env-ref>resource-env-ref>声明与资源相关的一个管理对象。   
  24. <resource-ref>resource-ref> 声明一个资源工厂使用的外部资源。   
  25. <security-constraint>security-constraint> 制定应该保护的URL。它与login-config元素联合使用   
  26. <login-config>login-config> 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。   
  27. <security-role>security-role>给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素   
  28.                    的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。   
  29. <env-entry>env-entry>声明Web应用的环境项。   
  30. <ejb-ref>ejb-ref>声明一个EJB的主目录的引用。   
  31. < ejb-local-ref> ejb-local-ref>声明一个EJB的本地主目录的应用。   
  32. web-app>   
  33.   
  34.   
  35. 相应元素配置   
  36.   
  37. 1、Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标   
  38. <icon>   
  39. <small-icon>/images/app_small.gifsmall-icon>   
  40. <large-icon>/images/app_large.giflarge-icon>   
  41. icon>   
  42. 2、Web 应用名称:提供GUI工具可能会用来标记这个特定的Web应用的一个名称   
  43. <display-name>Tomcat Exampledisplay-name>   
  44. 3、Web 应用描述: 给出于此相关的说明性文本   
  45. <disciption>Tomcat Example servlets and JSP pages.disciption>   
  46. 4、上下文参数:声明应用范围内的初始化参数。   
  47.   <context-param>   
  48.     <param-name>ContextParameterpara-name>   
  49.     <param-value>testparam-value>   
  50.     <description>It is a test parameter.description>   
  51.   context-param>   
  52.   在servlet里面可以通过getServletContext().getInitParameter("context/param")得到   
  53.   
  54. 5、过滤器配置:将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。   
  55.   <filter>   
  56.         <filter-name>setCharacterEncodingfilter-name>   
  57.         <filter-class>com.myTest.setCharacterEncodingFilterfilter-class>   
  58.         <init-param>   
  59.             <param-name>encodingparam-name>   
  60.             <param-value>GB2312param-value>   
  61.         init-param>   
  62.   filter>   
  63.   <filter-mapping>   
  64.         <filter-name>setCharacterEncodingfilter-name>   
  65.         <url-pattern>/*url-pattern>   
  66.   filter-mapping>   
  67. 6、监听器配置   
  68.   <listener>   
  69.       <listerner-class>listener.SessionListenerlistener-class>   
  70.   listener>   
  71. 7、Servlet配置   
  72.    基本配置   
  73.    <servlet>   
  74.       <servlet-name>snoopservlet-name>   
  75.       <servlet-class>SnoopServletservlet-class>   
  76.    servlet>   
  77.    <servlet-mapping>   
  78.       <servlet-name>snoopservlet-name>   
  79.       <url-pattern>/snoopurl-pattern>   
  80.    servlet-mapping>   
  81.    高级配置   
  82.    <servlet>   
  83.       <servlet-name>snoopservlet-name>   
  84.       <servlet-class>SnoopServletservlet-class>   
  85.       <init-param>   
  86.          <param-name>fooparam-name>   
  87.          <param-value>barparam-value>   
  88.       init-param>   
  89.       <run-as>   
  90.          <description>Security role for anonymous accessdescription>   
  91.          <role-name>tomcatrole-name>   
  92.       run-as>   
  93.    servlet>   
  94.    <servlet-mapping>   
  95.       <servlet-name>snoopservlet-name>   
  96.       <url-pattern>/snoopurl-pattern>   
  97.    servlet-mapping>   
  98.    元素说明   
  99.      <servlet>servlet> 用来声明一个servlet的数据,主要有以下子元素:   
  100.      <servlet-name>servlet-name> 指定servlet的名称   
  101.      <servlet-class>servlet-class> 指定servlet的类名称   
  102.      <jsp-file>jsp-file> 指定web站台中的某个JSP网页的完整路径   
  103.      <init-param>init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数   
  104.      <load-on-startup>load-on-startup>指定当Web应用启动时,装载Servlet的次序。   
  105.                                  当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet.   
  106.                                  当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它   
  107.      <servlet-mapping>servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素   
  108.        <servlet-name>servlet-name> 指定servlet的名称   
  109.        <url-pattern>url-pattern> 指定servlet所对应的URL   
  110. 8、会话超时配置(单位为分钟)   
  111.    <session-config>   
  112.       <session-timeout>120session-timeout>   
  113.    session-config>   
  114. 9、MIME类型配置   
  115.    <mime-mapping>   
  116.       <extension>htmextension>   
  117.       <mime-type>text/htmlmime-type>   
  118.    mime-mapping>   
  119. 10、指定欢迎文件页配置   
  120.    <welcome-file-list>   
  121.       <welcome-file>index.jspwelcome-file>   
  122.       <welcome-file>index.htmlwelcome-file>   
  123.       <welcome-file>index.htmwelcome-file>   
  124.    welcome-file-list>   
  125. 11、配置错误页面   
  126.   一、 通过错误码来配置error-page   
  127.    <error-page>   
  128.       <error-code>404error-code>   
  129.       <location>/NotFound.jsplocation>   
  130.    error-page>   
  131.   上面配置了当系统发生404错误时,跳转到错误处理页面NotFound.jsp。   
  132. 二、通过异常的类型配置error-page   
  133.    <error-page>   
  134.        <exception-type>java.lang.NullExceptionexception-type>   
  135.        <location>/error.jsplocation>   
  136.    error-page>   
  137.   上面配置了当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面error.jsp   
  138. 12、TLD配置   
  139.    <taglib>   
  140.        <taglib-uri>taglib-uri>   
  141.        <taglib-location>/WEB-INF/jsp/debug-taglib.tldtaglib-location>   
  142.    taglib>   
  143.    如果MyEclipse一直在报错,应该把<taglib> 放到 <jsp-config>中   
  144.    <jsp-config>   
  145.       <taglib>   
  146.           <taglib-uri>taglib-uri>   
  147.           <taglib-location>/WEB-INF/pager-taglib.tldtaglib-location>   
  148.       taglib>   
  149.    jsp-config>   
  150. 13、资源管理对象配置   
  151.    <resource-env-ref>   
  152.        <resource-env-ref-name>jms/StockQueueresource-env-ref-name>   
  153.    resource-env-ref>   
  154. 14、资源工厂配置   
  155.    <resource-ref>   
  156.        <res-ref-name>mail/Sessionres-ref-name>   
  157.        <res-type>javax.mail.Sessionres-type>   
  158.        <res-auth>Containerres-auth>   
  159.    resource-ref>   
  160.    配置数据库连接池就可在此配置:   
  161.    <resource-ref>   
  162.        <description>JNDI JDBC DataSource of shopdescription>   
  163.        <res-ref-name>jdbc/sample_dbres-ref-name>   
  164.        <res-type>javax.sql.DataSourceres-type>   
  165.        <res-auth>Containerres-auth>   
  166.    resource-ref>   
  167. 15、安全限制配置   
  168.    <security-constraint>   
  169.       <display-name>Example Security Constraintdisplay-name>   
  170.       <web-resource-collection>   
  171.          <web-resource-name>Protected Areaweb-resource-name>   
  172.          <url-pattern>/jsp/security/protected/*url-pattern>   
  173.          <http-method>DELETEhttp-method>   
  174.          <http-method>GEThttp-method>   
  175.          <http-method>POSThttp-method>   
  176.          <http-method>PUThttp-method>   
  177.       web-resource-collection>   
  178.       <auth-constraint>   
  179.         <role-name>tomcatrole-name>   
  180.         <role-name>role1role-name>   
  181.       auth-constraint>   
  182.    security-constraint>   
  183. 16、登陆验证配置   
  184.    <login-config>   
  185.      <auth-method>FORMauth-method>   
  186.      <realm-name>Example-Based Authentiation Arearealm-name>   
  187.      <form-login-config>   
  188.         <form-login-page>/jsp/security/protected/login.jspform-login-page>   
  189.         <form-error-page>/jsp/security/protected/error.jspform-error-page>   
  190.      form-login-config>   
  191.    login-config>   
  192. 17、安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。   
  193.     分别地声明角色可使高级IDE处理安全信息更为容易。   
  194.   <security-role>   
  195.      <role-name>tomcatrole-name>   
  196.   security-role>   
  197. 18、Web环境参数:env-entry元素声明Web应用的环境项   
  198.   <env-entry>   
  199.      <env-entry-name>minExemptionsenv-entry-name>   
  200.      <env-entry-value>1env-entry-value>   
  201.      <env-entry-type>java.lang.Integerenv-entry-type>   
  202.   env-entry>   
  203. 19、EJB 声明   
  204.   <ejb-ref>   
  205.      <description>Example EJB referencedecription>   
  206.      <ejb-ref-name>ejb/Accountejb-ref-name>   
  207.      <ejb-ref-type>Entityejb-ref-type>   
  208.      <home>com.mycompany.mypackage.AccountHomehome>   
  209.      <remote>com.mycompany.mypackage.Accountremote>   
  210.   ejb-ref>   
  211. 20、本地EJB声明   
  212.   <ejb-local-ref>   
  213.      <description>Example Loacal EJB referencedecription>   
  214.      <ejb-ref-name>ejb/ProcessOrderejb-ref-name>   
  215.      <ejb-ref-type>Sessionejb-ref-type>   
  216.      <local-home>com.mycompany.mypackage.ProcessOrderHomelocal-home>   
  217.      <local>com.mycompany.mypackage.ProcessOrderlocal>   
  218.   ejb-local-ref>   
  219. 21、配置DWR   
  220.   <servlet>   
  221.       <servlet-name>dwr-invokerservlet-name>   
  222.       <servlet-class>uk.ltd.getahead.dwr.DWRServletservlet-class>   
  223.   servlet>   
  224.   <servlet-mapping>   
  225.       <servlet-name>dwr-invokerservlet-name>   
  226.       <url-pattern>/dwr/*url-pattern>   
  227.   servlet-mapping>   
  228. 22、配置Struts   
  229.     <display-name>Struts Blank Applicationdisplay-name>   
  230.     <servlet>   
  231.         <servlet-name>actionservlet-name>   
  232.         <servlet-class>   
  233.             org.apache.struts.action.ActionServlet   
  234.         servlet-class>   
  235.         <init-param>   
  236.             <param-name>detailparam-name>   
  237.             <param-value>2param-value>   
  238.         init-param>   
  239.         <init-param>   
  240.             <param-name>debugparam-name>   
  241.             <param-value>2param-value>   
  242.         init-param>   
  243.         <init-param>   
  244.             <param-name>configparam-name>   
  245.             <param-value>/WEB-INF/struts-config.xmlparam-value>   
  246.         init-param>   
  247.         <init-param>   
  248.             <param-name>applicationparam-name>   
  249.             <param-value>ApplicationResourcesparam-value>   
  250.         init-param>   
  251.         <load-on-startup>2load-on-startup>   
  252.     servlet>   
  253.     <servlet-mapping>   
  254.         <servlet-name>actionservlet-name>   
  255.         <url-pattern>*.dourl-pattern>   
  256.     servlet-mapping>   
  257.     <welcome-file-list>   
  258.         <welcome-file>index.jspwelcome-file>   
  259.     welcome-file-list>   
  260.   
  261.        
  262.     <taglib>   
  263.         <taglib-uri>struts-beantaglib-uri>   
  264.         <taglib-location>/WEB-INF/tld/struts-bean.tldtaglib-location>   
  265.     taglib>   
  266.     <taglib>   
  267.         <taglib-uri>struts-htmltaglib-uri>   
  268.         <taglib-location>/WEB-INF/tld/struts-html.tldtaglib-location>   
  269.     taglib>   
  270.     <taglib>   
  271.     <taglib-uri>struts-nestedtaglib-uri>   
  272.     <taglib-location>/WEB-INF/tld/struts-nested.tldtaglib-location>   
  273.     taglib>   
  274.     <taglib>   
  275.         <taglib-uri>struts-logictaglib-uri>   
  276.         <taglib-location>/WEB-INF/tld/struts-logic.tldtaglib-location>   
  277.     taglib>   
  278.     <taglib>   
  279.         <taglib-uri>struts-tilestaglib-uri>   
  280.         <taglib-location>/WEB-INF/tld/struts-tiles.tldtaglib-location>   
  281.     taglib>   
  282. 23、配置Spring(基本上都是在Struts中配置的)   
  283.   
  284.       
  285.    <context-param>   
  286.       <param-name>contextConfigLocationparam-name>   
  287.       <param-value>   
  288.           
  289.         /WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml   
  290.       param-value>   
  291.    context-param>   
  292.   
  293.       
  294.   
  295.   <listener>   
  296.      <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>   
  297.   listener>   
  298.   
  299.   <listener>   
  300.      <listener-class>   
  301.        org.springframework.web.context.request.RequestContextListener   
  302.      listener-class>   
  303.   listener>   

 



Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑 判断等。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器 端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如 一些参数或者是一些固定的对象等等。



Java 是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式。Servlet可完成以下功能:

1、创建并返回基于客户请求的动态HTML页面。

2、创建可以嵌入到现有HTML页面中的HTML片段。

3、与其它服务器资源(如数据库或基于Java的应用程序)进行通信。

4、接收多个客户端的输入,并将结果广播到多个客户端上,例如,Servlet可以实现支持多个参与者的游戏服务器。

5、根据客户请求采用特定的MIME(Multipurpose Internet Mail Extensions)类型对数据过滤,例如进行图像格式转换。

Servlet 的框架由两个包组成:javax.servlet和javax.servlet.http。在javax.servlet包中定义了所有Servlet类 必须实现或扩展的通用接口和类。在javax.servlet.http包中定义了采用HTTP协议通信的HttpServlet类。

Servlet框架的核心是javax.servlet.Servlet接口,所有的Servlet类都必须实现这个接口。Servlet接口定义的方法如下:

1、init方法,负责初始化Servlet对象。

2、service方法,负责响应客户端的请求。

3、destroy方法,当Servlet对象退出生命周期时,负责释放占用的资源。

4、getServletConfig方法,获得ServletConfig接口,可以得到Servlet的相关参数。

5、getServletInfo方法,获得Servlet的相关信息。

在javax.servlet包中,GenericServlet类实现了Servlet接口,在javax.servlet.http包中,HttpServlet类扩展了GenericServlet

类。当用户开发自己的Servlet时,必须扩展以上两个类中的一个,如果扩展自GenericServlet类,则必须自己实现service方法,

如果扩展自HttpServlet类,则不需要自己实现service方法,因为HttpServlet类已经实现了该方法。

Servlet、Filter和Listener

GenericServlet 类的service方法是一个抽象方法,只有两个参数:ServletRequest和ServletResponse。HttpServlet类的 service方法也只有两个参数:HttpServletRequest和HttpServletResponse。 HttpSevletRequest接口和HttpResponse接口分别扩展自ServletRequest和ServletResponse接口, 都提供了与特定协议HTTP相关的数据。

ServletRequest接口的方法如下:

getAttribute            获得属性值

getContentType      获得客户请求数据的MIME类型。

getInputStream      获得可以读取客户请求数据的输入流。

getParameter          获得参数值

getRemoteAddr      获得客户端的IP

getRemoteHost       获得客户端的主机名

getRemotePort              获得客户端的端口

setAttribute            设置属性值。

ServletResponse接口的方法如下:

getOutputStream    获得可以向客户羰发送二进制数据的输出流对象ServletOutputStream

getWriter               获得可以向客户端发送字符数据的PrintWriter对象

getCharacterEncoding    获得Servlet发送的响应数据的字符编码

getContentType      返回Servlet发送的响应数据的MIME类型

setCharacterEncoding    设置Servlet发送的响应数据的字符编码。

setContentType      设置Servlet发送的响应数据的MIME类型。

Servlet的init方法有如下两种形式:

public void init(ServletConfig config) throws ServletException

public void init() throws ServletException

在 Servlet的初始化分阶段,Servlet容器会为Servlet创建一个ServletConfig对象,用来存放Servlet的初始化配置信 息,如Servlet的初始参数。如果Servlet覆盖了带参数的init方法,则必须在函数体内先调用super.init(config); 以确保config参数引用了ServletConfig对象。如果Servlet覆盖了没有带参数的init方法,则不需要调用 super.init(); 方法,可以通过调用getServletConfig()方法来获得ServletConfig对象。

Servlet容器会为Web应用创建一个唯一的全局的ServletContext对象,可以把它看成是一个Web应用的服务器端组件的共享内存。它有如下方法:

 etAttribute(String name,Object obj) 将一个对象与一个属性名绑定,并存放到

ServletContext中

getAttribute(String name) 获得指定名称的属性值。

removeAttribute(String name) 删除指定名称的属性。

getAttributeNames() 返回所有属性名的一个Enumeration对象。

getInitParameter(String name) 获得指定名称的参数值,该参数是Web应用的初始化参数.

getInitParameterNames() 返回Web应用的所有初始化参数的名称的Enumeration对象.

getMimeType(String file) 返回文件的MIME类型.

getRealPath(String path) 返回网络路径path对应的文件系统路径.

getServerInfo() 返回Servlet容器的名称和版本

注意: 一般在HptpServlet的子类中,将doPost方法的实现合并到doGet方法中,也就是在doPost方法中简单地调用doGet方法.因为一般情况下对于Get和Post请求,它们都是一样的处理.

编 译了Servlet后,将它打包成jar放到WEB-INF/lib目录下,或将Servlet的class文件放到WEB-INF/classes/目 录下,再在WEB-INF/web.xml配置文件中配置这些servlet,就可以在Web应用中访问servlet了,配置如下:

 

my_servlet

com.mycompany.ServletClass1

< init-param>

< param-name>iParam< /param-name>

< param-value>2< /param-value>

< /init-param>

< load-on-startup>2< /load-on-startup>

my_servlet

*.hello

Session相关

在Servlet API中定义了javax.servlet.http.HttpSession接口,Servlet容器必须实现这一个接口。当一个Session开始 时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息。Servlet容器为 HttpSession对象分配一个唯一的标识符,叫做Session ID,Servlet容器把Session ID作为Cookie保存在客户的浏览器中,每次客户发出HTTP请求时,Servlet容器可以从HttpRequest对象中读取Session ID,然后根据Session ID找到相应的HttpSession对象,从而获得客户的状态信息。HttpSession接口有如下方法:

getId()    返回Session ID

invalidate()      使当前的Session失效,Servlet容器会释放HttpSession对象占用的资源。

setAttribute(String name,Object obj)     将一对name/value属性保存到HttpSession对象中。

getAttribute(String name)      返回名字为name的属性值。

getAttributeNames()      返回HttpSession对象中所有的属性名。

isNew()   判断这个Session是不是新创建的。

setMaxInactiveInterval()              设定Session可以处于不活动状态的最大时间(以秒为单位),                                              超过这个时间,Session就会自动失效,如果设置为负数,则 不                                             限制Session的不活动状态时间。

getMaxInactiveInterval()       返回Session可以处于不活动状态的最大时间。

当客户第一次访问Web应用中支持Session的某个页面时,就会开始一个新的Session,接下来,当客户浏览这个Web应用的其它页面时,始终处于同一个Session中。以下情况之一,Session就会失效:

1、客户端关闭浏览器。

2、Session过期,即客户在指定的最大时间内没有与Web服务器交互。

3、服务器端调用了HttpSession的invalidate()方法。

如 果客户端浏览器不支持或禁用Cookie,则Servlet容器无法从客户端浏览器中取得作为Cookie的Session ID,也就无法跟踪客户的状态,因此客户端的每次请求支持Session的JSP页面时,Servlet容器都会创建一个新的HttpSession对 象。对于这种情况,需要通过HttpServletResponse的encodeURL()方法重写客户请求的URL,它把Session ID添加到URL信息中,也就是说,对于支持Session的JSP页面中的所有连接URL,都要调用encodeURL()方法来重写这些URL,例 如:

对于应该改为”/>

这样,即使客户禁用Cookie,也能使用Session来跟踪客户的状态信息了。

Session的持久化:

Session 的持久化就是将HttpSession对象从内存中转移到文件系统或数据库中,这样做的好处是:减少系统资源的占用,如果Servlet容器突然关闭或重 启,或Web应用重启,这些持久化了的HttpSession对象可以再重新加载进来,对于客户端,还是使用同一个Session。

Session的持久化是由Session Manager来管理的,Tomcat提供了两个实现类:

l         org.apache.catalina.session.StandarManager

l         org.apache.catalina.session.PersistentManager

1、 StandarManager是默认的Session Manager。它的实现机制是:当Tomcat服务器关闭或重启,或Web应用被重新加载时,会将内存中所有的HttpSession对象保存到文件系 统中,默认的文件路径是:%CATALINA_HOME%\work\Catalina\ \SESSIONS.ser

重启Tomcat后,Tomcat服务器把SESSIONS.ser中的持久化HttpSession对象加载到内存中。

2、PersistentManager能够把HttpSession对象保存到Session Store中,它提供了比较StandarManager更灵活的管理功能,具有容错能力,控制内存中HttpSession对象的数目等。

Tomcat 实现Session Store的接口为org.apache.catalina.session.Store,目前提供了两个实现这一接口的 类:org.apache.catalina.session.FileStore和 org.apache.catalina.session.JDBCStore。FileStore会将HttpSession对象保存到文件系统中;而 JDBCStore则将HttpSession对象保存到数据库表中。

下面给出这两个类的配置:

配置FileStore:

在server.xml中,在Web应用的元素加入元素,例如:

      

              debug=0;

              saveOnRestart=”true”

              maxActiveSessions=”-1”

              minIdleSwap=”-1”

              maxIdleSwap=”-1”

              maxIdleBackup=”-1”

             

      

属性

作用

className

指定Session Manager的实现类名,或Session Store的实现类名

debug

设定Session Manager采用的跟踪级别,取值0到99,越小越跟踪信息越少,发布产品时,应该设置为0,以提高性能。

saveOnRestart

如果为true,则当Tomcat关闭时,所有的有效HttpSession对象都保存到Session Store中;当Tomcat重启时,加载这些HttpSession对象。

maxActiveSessions

设置处于活动状态的Session的最大数目,如果超过这一数目,Tomcat把一些超过的Sessin对象保存到Session Store中。-1表示不限制。

minIdleSwap

Session处于不活动状态的最小时间,单位为秒,超过这一时间,Tomcat有可能把这个Session对象移到Session Store中。

maxIdleSwap

Session处于不活动状态的最大时间,超过这一时间,Tomcat就一定会将这个Session对象移到Session Store中。

maxIdleBackup

Session处于不活动状态的最大时间,超过这一时间,Tomcat就就会将这个Session对象拷贝到Session Store中进行备份。

directory

指定Session Store在哪个文件系统目录下存放持久化的Session对象的信息,文件名是Session ID.session。

配置JDBCStore:

在server.xml中,在Web应用的元素加入元素,例如:

      

              debug=0;

              saveOnRestart=”true”

              maxActiveSessions=”-1”

              minIdleSwap=”-1”

              maxIdleSwap=”-1”

              maxIdleBackup=”-1”

             

                     driverName=”com.mysql.jdbc.Driver”

                     connectionURL=”jdbc:mysql://localhost:3306/demo?user=root password=1234”

                     sessionTable=”tomcat_sessions”

                     sessionIdCol=”session_id”

                     sessionDataCol=”session_data”

                     sessionValidCol=”session_valid”

                     sessionMaxInactiveCol=”max_inactive”

                     sessionLastAccessedCol=”last_access”

                     sessionAppCol=”app_name”

                     checkInterval=”60”

                     debug=”0”

              />

      

说明:上面的元素属性的含义与FileStore的相同,上面的配置假设在MySQL服务器上的demo数据库的tomcat_sessions表中存放持久化Session对象的信息,这个表的结构如下:

CREATE TABLE tomcat_sessions(

       session_id VARCHAR(10) NOT NULL PRIMARY KEY,

       session_data MEDIUMBLOB,

       session_valid CHAR(1) NOT NULL,

       max_inactive   INT NOT NULL,

       last_access     BIGINT NOT NULL,

       app_name       VARCHR(255),

       KEY kapp_name(app_name)

);

Filter相关

Servlet 过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改,它在Servlet被调用之前检查Request对象, 修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件,具有以下特点:

l         Servlet过滤器可能检查和修改ServletRequest和ServletResponse对象

l         可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发该过滤器工作

l         多个Servlet过滤器可以被串联起来,形成管道效应,协同修改请求和响应对象

l         所有支持Java Servlet规范2.3的Servlet容器,都支持Servlet过滤器

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。该接口定义了以下3个方法:

l         init(FilterConfig)     这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后就会调用这个方法。在这个方法中可以通过 FilterConfig来读取web.xml文件中Servlet过滤器的初始化参数。

l         doFilter(ServletRequest, ServletResponse, FilterChain)  这是完成实际的过滤操作的方法,当客户请求访问与过滤器关联的URL时,Servlet容器先调用该方法。FilterChain参数用来访问后续的过滤 器的doFilter()方法。

l         destroy() Servlet容器在销毁过滤器实例前调用该方法,在这个方法中,可以释放过滤器占用的资源。

下面是一个过滤器的例子,它可以拒绝列在黑名单上的客户访问留言簿,而且能将服务器响应客户请求所花的时间写入日志:

//WEB-INF/classes/NoteFilter.class

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class NoteFilter implements Filter{

       private FilterConfig config=null;

       private String blackList=null;

       public void init(FilterConfig config)throws ServletException{

              this.config=config;

              blackList=config.getInitParameter(“blacklist”);

       }

       public void destroy(){

              config=null;

       }

       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

              throws IOException, ServletException{

              String userName=((HttpServletRequest)request).getParameter(“user_name”);

              if(userName!=null)

                     userName=new String(userName.getBytes(“ISO-8859-1”),”GB2312”);

              if(userName!=null && userName.indexOf(blackList)!=-1){

                     PrintWriter out=response.getWriter();

                     out.print(“”);

                     out.print(“

对不起,”+userName+”,你没有权限留言

”);

                     out.print(“ ”);

                     out.flush();

                     return;

              }

              long before=System.currentTimeMillis();

              config.getServletContext().log(“NoteFilter:before call chain.doFilter()”);

              chan.doFilter(request, response);

              config.getServletContext().log(“NoteFilter:after call chain.doFilter()”);

              logn after=System.currentTimeMillis();

              String name=””;

              if(request instanceof HttpServletRequest)

                     name=((HttpServletRequest)request).getRequestURL();

              config.getServletContext().log(“NoteFilter:”+name+”:”+(after-before)+”ms”);

       }

发布Servlet过滤器,必须在web.xml文件中加入元素,如下:

       NoteFilter

       NoteFilter

      

              blackList

              捣蛋鬼

      

       NoteFilter

       /note

多个过滤器可以串连起来协同工作,Servlet容器将根据它们在web.xml中定义的先后顺序,依次调用它们的doFilter()方法。而这些过滤之间的关系不需要任何配置。

Listener 的作用类似于load-on-startup的Servlet,在Web应用启动时被加载,在Web应用关闭时被销毁,Listener用来作为Web应 用的后台服务,比load-on-startup的Servlet更早被加载到Servlet容器中。自定义的Listener类必须实现 ServletContextListener接口,并实现该接口的两个方 法:contextInitialized(ServletContextEvent)和 contextDestroyed(ServletContextEvent),例如:

public class GetConnListener implements ServletContextListener{
 public void contextInitialized(ServletContextEvent sce){
  try{
   ServletContext application=sce.getServletContext();
   String driver=application.getInitParameter("driver");
   String url=application.getInitParameter("url");
   String user=application.getInitParameter("user");
   String password=application.getInitParameter("password");
   Class.forName(driver);
   Connection conn=DriverManager.getConnection(url, user, password);
   application.setAttribute("conn", conn);
  }catch(Exception e){
   System.out.println("Listener中获取数据库连接出现异常:"+e.getMessage());
  }
 }
 public void contextDestroyed(ServletContextEvent sce){
  ServletContext application=sce.getServletContext();
  Connection conn=(Connection)application.getAtrribute("conn");
  if(conn!=null){
   try{
    conn.close();
    conn=null;
   }catch(Exception e){}
  }
 }
}

Listener配置:

  lee.GetConnListener

自定义JSP标签库

实现自定义标签的处理类

JSP容器编译JSP网页时,遇到自定义标签,就会调用这个标签的处理类。标签处理类必须扩展自javax.servlet.jsp.TagSupport类或javax.servlet.jsp.BodyTagSupport类。

1、TagSupport类的主要方法如下:

l         doStartTag      JSP容器遇到自定义标签的起始标志时调用该方法。

l         doEndTag       JSP容器遇到自定义标签的结束标志时调用该方法。

l         setValue(String k, Object v)   在标签处理类中设置key/value。

l         getValue(String k)          在标签处理类中获得key对应的value。

l         removeValue(String k)    在标签处理类中删除key/value。

l         setPageContext(PageContext pc)   设置PageContext对象,由JSP容器在调用doStartTag或doEndTag方法之前调用。

l         setParent(Tag t)     设置该标签的上层标签的处理类,由JSP容器在调用doStartTag或 doEndTag方法之前调用。

l         getParent()     返回该标签的上层标签的处理类。

2、TagSupport类有两个重要属性:

l         parent     该标签的上层标签的处理类。

l         pageContext    Web应用中的javax.servlet.jsp.PageContext对象,提供了保存和访问Web应用的共享数据方 法:setAttribute(String name, Object value, int scope)和getAttribute(String name, int scope)。其中scope参数用来指定属性存在的范围,可选值有:PageContext.PAGE_SCOPE、 PageContext.REQUEST_SCOPE、PageContext.SESSION_SCOPE和 PageContext.APPLICATION_SCOPE。

注意:在TagSupport的构造函数中不能访问pageContext成员,因为此时JSP容器还没有调用setPageContext 方法对pageContext进行初始化。

3、处理标签的方法:

当 JSP容器遇到自定义标签的起始标志时,就会调用该标签处理类的doStartTag()方法。doStartTag()方法返回一个整数值,用来决定程 序的后续流程,有两个可选值:Tag.SKIP_BODY和Tag.EVAL_BODY_INCLUDE。Tag.SKIP_BODY表示标签之间的内容 被忽略,例如:

       Hello World!

如果这个标签的处理类的doStartTag()方法返回Tag.SKIP_BODY,则Hello World!字符串不会显示在网页上。Tag.EVAL_BODY_INCLUDE表示标签之间的内容会被处理。

当 JSP容器遇到自定义标签的结束标志时,就会调用该标签处理类的doEndTag()方法。doEndTag()方法也返回一个整数值,表示程序的后续流 程,也是有两个可选值:Tag.SKIP_PAGE和Tag.EVAL_PAGE。Tag.SKIP_PAGE表示立刻停止执行JSP页面,该标签的结束 标志之后的所有页面内容全部会初忽略,任何已有的输出内容立刻返回到客户的浏览器上;Tag.EVAL_PAGE表示按正常的流程继续执行JSP页面的内 容。

4、自定义标签的属性

例如:

那么在标签处理类中必须将这个属性作为类的成员变量,并且必须提供相应的getter和setter方法,例如:

private int attribute1;

public void setAttribute1(int value){ attribute1=value;}

public int getAttribute1(){return attribute1;}

以下是一个自定义标签的处理类的例子:

// WEB-INF/classess/mypack/MessageTag.class

package mypack;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.TagSupport;

import javax.servlet.http.HttpSession;

import java.util.Properties;

import java.io.*;

public class MessageTag extends TagSupport{

       private String key=null;

       public MessageTag(){}

       public void setKey(String key){

              this.key=key;

       }

       public String getKey(){

              return key;

       }

       public int doEndTag() throws JspException{

              try{

                     pageContext.getOut.print(key);

              }catch(Exception e){

                     throw new JspTagException(e.getMessage());

              }

              return SkIP_BODY;

       }

       public void release(){

              super.release();

       }

创建标签库描述文件(Tag Library Descriptor, TLD)

TLD文件中的元素可分为3类:

l         元素用来设置标签库的相关信息,它有如下属性:

tlibversion       指定标签库的版本

jspversion       指定JSP的版本

shortname      指定标签库默认的前缀名(prefix)

uri                 设置标签库的唯一访问标示符

info                标签库的说明信息

l         元素用来定义一个标签,它的属性如下:

name              标签的名字

tagclass          标签的处理类

bodycontent    标签主体(body)的内容

info                标签的说明信息

说明:bodycontent属性有3个可选值:empty、JSP和tagdependent。empty表示标签没有主体,JSP表示标签的主体中可以加入JSP代码,tagdependent表示标签的主体的内容由标签的处理类自己去处理。

l         元素用来定义标签的属性,它有如下属性:

name              属性名

required          该属性是否必须,默认是false

rtexprvalue     该属性的值是否可能通过”<%=…%>”的方式获得,当设置为true时,该属性就可以采用如下的方式设置值:<% int num=1;%> ”/>

以下是一个标签库描述文件的例子:

       “”>

       1.0

       1.1

       mytaglib

       /mytaglib

      

              message

              mypack.MessageTag

              empty

              produce message by key

             

                     key

                     true

                     true

             

      

在web.xml文件中加入标签库的定义

      

       /mytaglib 

      

       /WEB-INF/mytaglib.tld

在JSP页面中使用自定义的标签

例如:

<%@ taglib uri=”/mytaglib” prefix=”mm”%>

      


阅读(1697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~