一、建立和使用一个上下文监听者:
容器通过web.xml部署描述文件发现和使用监听者:要监听ServletContext事件,需要编写一个实现ServletContext-Listener的监听者类,把它放在WEB-INF/classes目录中,并在部署描述文件中放一个<listener>
元素来告诉容器。
①创建一个监听者类:
package com.example;
importjavax.servlet.*;
public classMyServletContextListener implements ServletContextListener {
public voidcontextInitialized(ServletContextEvent event) {
ServletContext sc=event.getServletContext();//由事件得到ServletContext
String dogBreed=sc.getInitParameter("breed");//使用上下文得到初始化参数
Dog d=new Dog(dogBreed);//建立一个新Dog
sc.setAttribute("dog",d);
}
public voidcontextDestroyed(ServletContextEvent event) {
}
}
相应的web.xml部署描述文件<?xml version="1.0"encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID"version="3.0">
<display-name>Simpleweb application</display-name>
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
<context-param>
<param-name>breed</param-name>
<param-value>GreatDane</param-value>
</context-param>
<listener>
<listener-class>
com.example.MyServletContextListener</listener-class>
</listener>
</web-app>
3、属性API 3个属性作用域(上下文、请求和会话)分别由ServletContext、ServletRequest和HttpSession接口处理。每个接口中对应属性的API方法完全相同:
Object getAttribute(String name)
void setAttribute(String name,Object value)
void removeAttribute(String name)
Enumeration getAttributeNames()
4、保护线程安全:对上下文加锁:
在doGet或doPost中:
synchronized(getServletContext()){
getServletContext().setAttribute("foo","40");
getServletContext().setAttribute("bar","22");
out.println(getServletContext().getAttribute("foo"));
out.println(getServletContext().getAttribute("bar"));
}
对HttpSession同步来保护绘会话属性
在doGet或doPost中:
synchronized(session){
getServletContext().setAttribute("foo","40");
getServletContext().setAttribute("bar","22");
out.println(getServletContext().getAttribute("foo"));
out.println(getServletContext().getAttribute("bar"));
}
5、请求属性和请求分派:
//code in a doGet()
BeerExpert be=new BeerExpert();
ArrayList result=be.getBrands(c);
request.setAttribute("styles",result);//把模型数据放在请求作用域中
RequestDispatcherview=request.getRequestDispatcher("result.jsp");
view.forward(request,response);
RequestDispatcher:
①从ServletRequest得到RequestDispatcher
RequestDispather view=request.getRequestDispatcher("result.jsp");
②从ServletContext得到RequestDispatcher
RequestDispatcher view=getServletContext().getRequestDispatcher("/result.jsp");