Servlet实现一个网站计数器

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的简单的网站计数器就完成了。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值