1.预备知识一---ServletContext对象
WEB容器在启动时,会为每一个WEB应用程序都创建一个对应的ServletContext对象,代表当前web应用。
ServletContext对象可以通过ServletConfig.getServletContext方法获得对象的引用,或者通过this.getServletContext()来获得。
一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象实现通讯,通常也被称之为context域对象。
2.预备知识二---servlet配置load-on-startup
servlet配置当中,<load-on-startup>1</load-on-startup>的含义是标记容器是否在启动的时候就加载这个servlet。其中值为负或者没有指定,表示在该容器在servlet被选择的时候才加载。
配置load-on-startup之后,servlet在startup后立即加载,但是只调用该servlet的init()方法。
3.网站计数器
做一个登陆页面,一个访问计数的管理页面,规定登陆的用户才能计算一次访问量。由于
由于当web应用关闭、重启或服务器关闭时都会造成ServletContext销毁,所以建立一个record.text文件,用以保存访问量,在servlet初始化的时候,从文件中读取之前的访问量,服务器关闭的时候将ServletContext的内容写入文件,这样可以保证访问量的准确度。
1.写一个servlet用于初始化和销毁时往文件中读写数据。
public class InitServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//从record.txt文件中,读取浏览量
//1.首先获取该文件的真实路径
String filePath=this.getServletContext().getRealPath("/record.text");
FileReader fileReader = null;
BufferedReader bufferedReader = null;
//2.打开文件
try {
fileReader = new FileReader(filePath);
//为了读取转为BufferedReader
bufferedReader = new BufferedReader(fileReader);
String nums = bufferedReader.readLine();
System.out.println(nums);
//把nums添加到ServletContext
this.getServletContext().setAttribute("nums", nums);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
//关闭流
try {
bufferedReader.close();
fileReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("init...");
}
@Override
public void destroy() {
super.destroy();
System.out.println("initServlet destory 被调用...");
//关闭服务器时,把ServletContext值重新保存到文件
//从record.text文件中,读取浏览量
//1.首先获取该文件的真实路径
String filePath=this.getServletContext().getRealPath("/record.text");
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
//2.打开文件
try {
fileWriter = new FileWriter(filePath);
//为了读取转为BufferedWriter
bufferedWriter = new BufferedWriter(fileWriter);
//从ServletContext读取访问量
String nums = (String) this.getServletContext().getAttribute("nums");
//写回文件
bufferedWriter.write(nums);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
//关闭流
try {
bufferedWriter.close();
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
} finally {
out.close();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* @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);
}
}
同时在web.xml中配置该servlet
<servlet>
<description></description>
<display-name>InitServlet</display-name>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.zcy.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/InitServlet</url-pattern>
</servlet-mapping>
2.写一个用于登陆的servlet
public class Login extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<h1>用户登录</h1>");
out.println("<form action='/counter2/LoginCl' method='post'>");
out.println("用户id:<input type='text' name='id'/><br/>");
out.println("密码:<input type='password' name='password'/><br/>");
out.println("<input type='submit' value='登录'/><br/>");
out.println("</form>");
String filePath=this.getServletContext().getRealPath("/record.text");
System.out.println(filePath);
}
/**
* @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);
}
}
3.用于登陆验证的servlet,此处为了简单,只要登陆密码是123就可以登陆。
public class LoginCl extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//这里接受密码
String passwd = request.getParameter("password");
if("123".equals(passwd))
{
//密码合法
//向servletContext中添加属性
//1.先取出
String nums = (String) this.getServletContext().getAttribute("nums");
//不是第一次访问,取出nums+1
this.getServletContext().setAttribute("nums", (Integer.parseInt(nums)+1)+"");
//跳转到管理页面
//request.getRequestDispatcher("/Manage").forward(request, response);
//从浏览器登录的才记录次数,避免刷新带来的计数器增加问题
response.sendRedirect("/counter2/Manage");
}
else
{
//非法登录
request.getRequestDispatcher("/Login").forward(request, response);
}
}
/**
* @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);
}
}
配置xml和上面一样,就不写了。
4.管理页面,显示网站的访问量
public class Manage extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<h1>管理页面</h1>");
//从ServletContext取出
String nums = (String) this.getServletContext().getAttribute("nums");
out.println("该管理页面被访问了"+nums+"次");
}
/**
* @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);
}
}
同样,配置web.xml。
至此一个利用ServletContext的简单的网站计数器就完成了。