HttpSession,ServletConfig,ServletContext详解

HttpSession

一个比较重要的接口是HttpSession接口,这个接口被Servlet引擎用来建立浏览器客户端和HTTP会话两者之间的连接。这种连接一般会在多个请求中持续一段给定的时间。

实质便是JSP内置对象的session所对应的类。

一个session就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户。一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束。
其工作原理是这样的:
1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;
2.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。
这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。
对于session标识号(sessionID),有两种方式实现:cookies和URL重写。

HttpSession的使用
我们来看看在API中对session是如何定义和操作的。
当需要为用户端建立一个session时,servlet容器就创建了一个HttpSession对象。其中存储了和本session相关的信息。所以,在一个servlet中有多少个不同用户连接,就会有多少个HttpSession对象。
使用的机理是:
1.从请求中提取HttpSession对象;
2.增加或删除HttpSession中的属性;
3.根据需要关闭HttpSession或使其失效。

在请求中有两个重载的方法用来获取HttpSession对象。
HttpSession getSession(boolean create)/getSession();作用是提取HttpSession对象,如果没有自动创建。

HttpSession   session=request.getSession(true/false);

Returns the current HttpSession associated with this request or, if if there is no current session and create is true, returns a new session.

参数为true,则如果“当前用户的会话对象”为空(第一次访问时)则创建一个新的会话对象返回。

参数为false,则如果“当前用户的会话对象”为空,则返回null(即不自动创建会话对象)注意request.getSession() 等同于 request.getSession(true),除非我们确认session一定存在或者sesson不存在时明确有创建session的需要,否则请尽量使用request.getSession(false)。

获取到HttpSession对象后,我们就需要使用HttpSession的某些方法去设置和更改某些参数了。如:
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);

一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session=”false”%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

ServletConfig

Servlet容器初始化一个servlet对象时,会为这个servlet对象创建一个servletConfig对象。在servletConfig对象中包含了servlet的初始化参数信息。此外,servletConfig对象还与servletContext对象关联。Servlet容器在调用servlet对象的init(ServletConfig config)方法时,会把servletConfig对象当做参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与servletConfig对象建立关联关系。

实质便是JSP内置对象的config。

servletConfig接口中定义了一下方法:
getInitParameter(String   name):根据给定的初始化参数,返回匹配的初始化参数值。
getInitParameterNmes():返回一个Enumeration对象,里面包含了所有的初始化参数。
getServletContext():返回一个servletContext()对象,
getServltName():返回servlet的名字,即web.xml中的<servlet-name>的子元素的值。如果没有配置这个子元素,则返回servlet类的名字。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet> 
   <servlet-name>actionServlet</servlet-name>   
   <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>   
   <load-on-startup>0</load-on-startup>     
   <init-param> 
    <param-name>color</param-name>     
    <param-value>red</param-value>    
   </init-param>    
   <init-param> 
    <param-name>size</param-name>     
    <param-value>16</param-value>    
   </init-param>     
</servlet> 
<servlet-mapping> 
    <servlet-name>actionServlet</servlet-name>    
    <url-pattern>*.do</url-pattern>   
 </servlet-mapping>

 

如上,init-param为初始化参数,相当于公有参数。 在servlet中:

1
2
3
4
5
public class UserDateBaseServlet  extends HttpServlet{
      String color = this.getInitParameter("color");  
      String size = this.getInitParameter("size");  
      System.out.println("颜色是:"+color+"字号是:"+size);  
 }

 

注:HttpServlt类继承了GenericServlet类,而GenericServlet类实现了ServletConfig接口,因此在HttpServlet类和GenericServlet类及子类中都可以直接调用ServletConfig接口中的方法。

ServletContext

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

实质便是JSP的application内置对象。

1.Servlet中application的获得办法:

ServletContext application = getServletContext();

或者

第一步:首先获得ServletConfig对象。

第二步:调用ServletConfig 的getServletContext()方法便可。

ServletConfig config = getServletConfig();

getServletContext application = config. getServletContext ();

2.获取WEB应用的初始化参数。

在web.xml文件中配置需要初始化的参数信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<web-app>  

<context-param>  

    <param-name>url</param-name>  

    <param-value>jdbc:mysql://localhost:3306/4g</param-value>  

</context-param>  

<context-param>  

    <param-name>password</param-name>  

    <param-value>1314qr</param-value>  

</context-param>  

<context-param>  

    <param-name>user</param-name>  

    <param-value>root</param-value>  

</context-param>  
</web-app>

在DemoServlet的doPost方法中测试获取初始化参数的步骤如下:

/*获取ServletContext对象*/

ServletContext context = this.getServletContext();

/*获取初始化参数*/

//获取指定名称的初始化参数

String url = context.getInitParameter(“url”);

//获取web.xml文件中所有的初始化应用参数

1
2
3
4
5
6
7
8
9
10
11
Enumeration<String> enumer = context.getInitParameterNames();  

while(enumer.hasMoreElements()){  

     String name = enumer.nextElement();  

     String value = context.getInitParameter(name);  

     System.out.println(name+"=========="+value);  

 }

 

除非注明,Coder文章均为原创,转载请以链接形式标明本文地址

本文地址:http://www.alonemonkey.com/servlet-scc.html

本文链接:http://www.alonemonkey.com/servlet-scc.html