关于Servlet上下文

122 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

在学习前我们应该先了解Servlet上下文的定义与用法。

对Servlet上下文的定义

容器启动之后,会为每一个web应用创建唯一的一个符合ServletContext 接口要求的对象,该对象一般称之为Servlet上下文。服务器上的每个Web应用都会有一个背景环境对象,称为上下文,Web应用中的所有资源包括Servlet、JSP、JavaBean和静态HTML页面等共享此上下文对象,因此上下文对象提供了一个同一Web应用内的不同资源间共享信息的场所。

Servlet上下文的特点

唯一性:一个web应用对应一个Servlet上下文。

持久性: 只要容器没有关闭,应用没有被卸载,Servlet上下文就会一直存在。

如何获取上下文

HttpSession,GenericServlet提供了getServletContext方法来获得上下文

注意:GenericServlet是HttpServlet的父类

Servlet上下文的实现

@WebServlet(name = "AdminTemperatureServlet", urlPatterns = { "/adminTemperature" }, initParams = {
                @WebInitParam(name = "Temperature", value = "8") })
public class AdminTemperatureServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

            /**
         * @see HttpServlet#HttpServlet()
         */
        public AdminTemperatureServlet() {
                super();
                // TODO Auto-generated constructor stub
        }

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
         *      response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        String Temperature=(String)getServletContext().getAttribute("Temperature");
        if(Temperature==null){
       //从初始化参数中拿
            Temperature=(String)getInitParameter("Temperature");
        //放入应用上下文
            getServletContext().setAttribute("Temperature",Temperature);        }
        out.println("<HTML><HEAD><TITLE>气温更新 "
                + "</TITLE></HEAD>");
        out.println("<BODY><TABLE border=\"0\" width=\"100%\"><tr>");
        out.println("<td align=\"left\" valign=\"bottom\">");
        out.println("<H1>当前气温</H1></td></tr></TABLE>");
        out.print("<FORM ACTION=\"");
        out.println(response.encodeURL("adminTemperature"));
        out.println("\" METHOD=\"POST\">");
        out.println("当前气温(摄氏度)");
        out.println("<INPUT TYPE=\"text\" NAME=\"temperature\" "
                + "VALUE="+Temperature+">");
        out.println("<INPUT TYPE=\"Submit\" NAME=\"btn_submit\" "
                + "VALUE=\"更新\">");
        out.println("</FORM></BODY></HTML>");
        }

        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
         *      response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        String Temperature=request.getParameter("temperature");
        // 将更新后的气温信息放入上下文
        getServletContext().setAttribute("Temperature",Temperature);
        out.println("<HTML><HEAD><TITLE>气温更新 "
                + "</TITLE></HEAD>");
        out.println("<BODY>");
        out.println("当前气温:"+Temperature+"摄氏度");
        out.println("</BODY></HTML>");
        }

}

···

@WebServlet("/showTemperature")
public class ShowTemperatureServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

        /**
         * @see HttpServlet#HttpServlet()
         */
        public ShowTemperatureServlet() {
                super();
                // TODO Auto-generated constructor stub
        }

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
         *      response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                response.setContentType("text/html;charset=gb2312");
                PrintWriter out = response.getWriter();
                String Temperature = (String) getServletContext().getAttribute("Temperature");
                if (Temperature == null) {
                        Temperature = new String("0");
                }
                String oldTemperature = (String) request.getSession().getAttribute("OldTemperature");
                out.println("<HTML><HEAD><TITLE>气温信息显示 " + "</TITLE></HEAD>");
                out.println("<BODY>");
                out.println("当前最新气温:" + Temperature + "摄氏度");
                if (oldTemperature != null) {
                        out.println("<BR>");
                        out.println("更新前气温:" + oldTemperature + "摄氏度");
                }
                out.println("</BODY></HTML>");
                // 更新会话中的气温信息
                request.getSession().setAttribute("OldTemperature", Temperature);
        }

        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
         *      response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                // TODO Auto-generated method stub
                doGet(request, response);
        }

}

··· 以下是代码的执行过程论述:

AdminTemperatureServlet的doGet方法首先调用getServletContext方法获取应用的上下文对象ServletContext,然后调用ServletContext对象的getAttribute方法获取存储在上下文中的Temperature属性信息进行显示。如果是第一次调用,ServletContext中尚不存在Temperature属性对象,则调用getInitParameter方法获取存储在初始化参数中的气温信息并调用ServletContext的setAttribute方法将属性添加到上下文对象的Temperature属性对象中。ShowTemperatureServlet采用同样的方法获取上下文中的属性信息进行显示。

本次我们学习了Servlet上下文,对Servlet上下文有了了解,也了解了Servlet上下文代码的实现过程。