持续创作,加速成长!这是我参与「掘金日新计划 · 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上下文代码的实现过程。