Web容器管理Servlet/JSP相关的生命周期,若对HttpServletRequest对象、HttpSession对象、ServletContxt对象在生成、销毁或相关属性设置发生的时机点有兴趣,可以实现对应的监听器(Listener)。
与ServletContext相关的监听器有两个,ServletContextListener、ServletContextAttributeListener
1、ServletContextListener
它是生命周期监听器,如果想要知道何时web应用程序已经初始化或者即将结束销毁,可以实现该监听器。
例如,可以实现ServletContextListener,在此应用程序初始过程中,准备好数据库连接线对象、读取应用程序设置等动作,如放置使用头像的目录信息,就不适合将目录名称写死,这时候可以这么做:
1 package cc.openhome;
2 import javax.servlet.*;
3 @WebListener //使用@weblistener标注
4 public class ContextParameterReader implements ServletContextListener{
5 public void contextInitialized(ServletContextEvent e){
6 ServletContext context = sce.getServletContext();//取得ServletContext
7 String avatars = context.getInitParameter("AVATAR");//取得初始参数
8 context.setAttribute("avatars",avatars);//设置ServletContext属性
9 }
10 public void contextDestroyed(ServletContextEvent sce){}
11 }
整个web应用程序生命周期,Servlet共享的资料可以设置为ServletContext属性。这些属性数据会一直存在于web应用程序中。可以通过setAttribute()方法设置对象为ServletContext属性,之后可通过ServletContext的getAttribute()方法取出该属性。如果移除属性,用removeAttribute()。
1 package ServletAPI; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebInitParam; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 /** 14 * Servlet implementation class Avatar 15 */ 16 @WebServlet( 17 urlPatterns = { "/avatar.view" }, 18 initParams = { 19 @WebInitParam(name = "AVATAR_DIR", value = "/image")//根目录WebContent内部 20 }) 21 public class Avatar extends HttpServlet { 22 private static final long serialVersionUID = 1L; 23 private String AVATAR_DIR; 24 /** 25 * @see HttpServlet#HttpServlet() 26 */ 27 public Avatar() { 28 super(); 29 // TODO Auto-generated constructor stub 30 } 31 public void init() throws ServletException{ 32 //AVATAR_DIR=getInitParameter("AVATAR_DIR"); 33 AVATAR_DIR=(String) getServletContext().getAttribute("avatars"); 34 } 35 36 37 /** 38 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 39 */ 40 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 // TODO Auto-generated method stub 42 response.setContentType("text/html;charset=UTF-8"); 43 PrintWriter out=response.getWriter(); 44 out.println("<!DOCTYPE html>"); 45 out.println("<html>"); 46 out.println("<head>"); 47 out.println("<meta content='text/html; charset=UTF-8' http-equiv='content-type'>"); 48 out.println("<title>头像显示</title>"); 49 out.println("</head>"); 50 out.println("<body>"); 51 for(String avatar:getServletContext().getResourcePaths(AVATAR_DIR)){//取得头像路径 52 avatar=avatar.replaceFirst("/", ""); 53 out.println("<img src='"+avatar+"'>"); 54 } 55 out.println("</body>"); 56 out.println("</html>"); 57 out.close(); 58 } 59 60 /** 61 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 62 */ 63 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 64 // TODO Auto-generated method stub 65 } 66 67 }