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 |
注: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 |
除非注明,Coder文章均为原创,转载请以链接形式标明本文地址