在servlet的配置文件中,可以使用一个或者多个<init-param>标签为servlet配置一些初始化参数。web容器在创建servlet实例的时候,会自动将这些参数封装到ServletConfig中,在调用init方法时,将ServletConfig传递给Servlet,程序员可以通过ServletConfig获取当前Servlet的信息。
getServletContext()取得的是 <context-param>配置的参数 ,getServletConfig()取得的是 <servlet> <init-param>配置的参数
getServletContext()应用于整个web App,而getServletConfig()仅应用于当前Servlet。 但是ServletConfig对象拥有ServletContext的引用。所以可以通过getServletConfig()来获得ServletContext,从而得到web App的初始值
会话是指一个用户在客户端登录,为达到某个目的与服务器端进行多次交互,最后退出应用系统的全过程。会话管理是对用户会话全过程中涉及的会话状态保存与恢复、会话信息的采集与管理的一系列活动。
会话机制
会话追踪
客户端发送会话标示
会话标示发送给服务端
机制:Cookies,SSL Sessions,URL重写,表单隐藏
cookies:HTTP cookies是最常用的会话跟踪机制,所有的servlet引擎都必须支持这种方法。原理:引擎把用户会话ID保存在cookie中,发送该cookie到客户端,客户端就会在以后的请求中把这个cookie返回给服务器。
cookie例子:
ac 1,034,001 qq.com/ 3584 2823045120 36591030 1260402003 30387200 *
Ssl Sessions
SSL(安全套接字层)是HTTPS协议采用的一种加密技术,内建了会话跟踪功能,从一个客户端来的多个请求允许用一个含糊的标识,而servlet引擎就用这个数据定义一个Session
URL重写
是最低性能的通用会话跟踪方法。当一个客户端不能接受cookie时,URL重写就会作为基本的会话跟踪方法URL重写把session id写入URL中,这样的URL会被引擎解析和某个session相关联。
隐藏表单字段的方法
利用HTML内hidden的属性,把客户端的信息,在用户不察觉的情形下,偷偷地随着请求一起传送给到服务器处理
会话管理机制
会话识别过程
会话状态保存和获取
在servlet中获取session
HttpSession session = request.getSession();//get session session.setAttribute("user", "wangweiwei"); //set Attribute System.out.println(session.getAttribute("user")); session.invalidate(); // free session,default time is 30 minutes.
常用用法
1、 getAttribute():从session中获取以前存储的值
2、 getAttributeNames():返回session中所有属性的名称
3、 setAttribute():将键与值关联起来,存储进session
4、 removeAttribute():删除session中存储的对应键的值
5、 invalidate():删除整个session及其存储的键值
6、 logout():注销当前用户7、 getId():获取每个session对应的唯一ID
8、 getCreationTime():获取session创建的时间
9、 getLastAccessedTime():获取session最后被访问的时间
10、getMaxInactiveInterval():在用户没有访问的情况下,会话在被自动废弃之前应该保持多长时间
Servlet 事件有两个级别:
Application 级别事件 :包含着运行应用程序的虚拟机级别的相关资源和状态,即和 servlet 的 Context 对象相关。
Session 级别的事件 :包含着一个单一用户的 session 的一系列请求的相关资源和状态,即 Http 的 Session 对象。
在上面两个级别的事件,又可分别分为两种:
生命周期的改变
属性的改变
context监听
package myApp; import javax.servlet.http.*; public final class MyContextListenerClass implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { /* 在正被初始化的 Servlet 上下文之前 调用此方法(当部署 Web 应用程序时)。 可以在这里初始化 Servlet 上下文相关的数据。 */ } public void contextDestroyed(ServletContextEvent event) { /* 当未部署 Servlet 上下文(Web 应用程序) 或 WebLogic Server 关闭时, 调用此方法。 */}
session监听
package myApp; import javax.servlet.*; public final class MySessionAttributeListenerClass implements HttpSessionAttributeListener { public void attributeAdded(HttpSessionBindingEvent sbe) { /* 当将特性添加到会话时, 调用此方法。 */ } public void attributeRemoved(HttpSessionBindingEvent sbe) { /* 从会话删除特性后, 调用此方法。 */ } public void attributeReplaced(HttpSessionBindingEvent sbe) { /* 在会话中替换特性之后, 调用此方法。 */ }
Listener监听在web.xml进行配置,放在web-app下一层
<display-name>MyListeningApplication</display-name> <listener> <listener-class>com.listener.SessionManager</listener-class> </listener>
<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>login</servlet-name> <servlet-class>login</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/servlet/login</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AnyName</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AnyName</servlet-name> <url-pattern>/action/*</url-pattern> </servlet-mapping>
有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾
1.精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了
2.最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB
3.扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action
4.如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet