背景
我们以 第13节 的案例为背景,添加网站访问的计数功能。
设计思路
创建一个文件:用来存储网站访问的次数
从文件获取:在初始化InitServlet中的init()方法中,从文件获取已经存好的值作为已经访问的数量
在用户登录的LoginServlet和3天免登陆的CookieServlet中添加往ServletContext对象中添加获取和自增计数变量的代码。(-_-||好长的一句话)
- 获取:通过getAttribute()获取目标数据变量
- 自增:获取之后变量自增,又通过setAttribute()覆盖原有值
写入值到文件:当服务器关闭,ServletContext对象会被销毁,所以我们需要在InitServlet的destroy方法中向文件中写入ServletContext中的用来计数的变量的值。(-_-||)
演示
演示说明:启动服务器->登录->主页看到1->注销,再次登录->主页看到2->关闭服务器->重启服务器->登录->主页看到3
代码
InitServlet
public class InitServlet extends HttpServlet { @Override public void init() throws ServletException { //ServletContext对象 ServletContext sc = this.getServletContext(); //从文件中获取值 InputStream is = sc.getResourceAsStream("/doc/count.txt");//保存访问次数的文件路径 BufferedReader br = null; try{ br = new BufferedReader(new InputStreamReader(is)); String countor= br.readLine(); System.out.println("读取countor:"+countor); sc.setAttribute("countor", countor); }catch(IOException e) { e.printStackTrace(); }finally { try { if(br!=null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } //赋值到ServletContext对象中去 } @Override public void destroy() { System.out.println("我被执行了1"); //从ServeltContext中获取值 //ServletContext对象 ServletContext sc = this.getServletContext(); //获取值 String countor = (String)sc.getAttribute("countor"); System.out.println("写入countor:"+countor); //写入文件 String path = sc.getRealPath("/doc/count.txt");//保存访问次数的文件路径
FileWriter fw = null; BufferedWriter bw = null; System.out.println("我被执行了2"); try{ System.out.println("我被执行了3"); bw = new BufferedWriter(fw = new FileWriter(path)); bw.write(countor); bw.flush(); System.out.println("我被执行了4"); }catch(IOException e) { e.printStackTrace(); }finally { try { if(bw!=null) { bw.close(); } } catch (IOException e) { e.printStackTrace(); } try { if(fw!=null) { fw.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
LoginServlet
public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static String username; private static String password; private static boolean flag =false;//账号密码是否正确 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码 req.setCharacterEncoding("utf-8"); //设置响应编码 resp.setContentType("text/html;charset=utf-8"); //获取请求数据 username = req.getParameter("uname"); password = req.getParameter("pwd"); //处理请求 LoginService ls = new LoginServiceImpl(); User user = ls.checkLoginService(username, password); //响应 if(null != user) { //创建cookie,实现3天免登陆 //我们不直接存账号密码,而是存用户的uid Cookie c = new Cookie("uid",user.getUid()+""); //设置有效期为3天 c.setMaxAge(3*24*3600); //设置指定url c.setPath("/200222-CookieLogin/ck"); //添加 resp.addCookie(c); //创建session HttpSession hs = req.getSession(); //设置时效 //将用户对象保存到session中 hs.setAttribute("user", user); //ServletContext对象获取网站访问计数器 ServletContext cs = this.getServletContext(); int countor = Integer.valueOf((String)cs.getAttribute("countor")); countor++; cs.setAttribute("countor", countor+""); resp.sendRedirect("main"); return; }else { //请求转发 req.setAttribute("msg", "账号或密码错误"); req.getRequestDispatcher("page").forward(req, resp); return; } } }
CookieServlet
public class CookieServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码 req.setCharacterEncoding("utf-8"); //设置响应类型及编码 resp.setContentType("text/html;charset=utf-8"); //获取请求 //判断是否有cookie Cookie[] cks = req.getCookies(); //处理请求 if(null!=cks) { //从cookie中获取uid String uid = ""; for(Cookie c : cks) { if("uid".equals(c.getName())) { uid = c.getValue(); } } //校验用户是否存在(使用uid) CookieService ls = new CookieServiceImpl(); User u = ls.checkUidService(uid); if(null!=u) { //设置session HttpSession hs = req.getSession(); //将用户数据保存到session hs.setAttribute("user", u); //ServletContext对象获取网站访问计数器 ServletContext cs = this.getServletContext(); int countor = Integer.valueOf((String)cs.getAttribute("countor")); countor++; cs.setAttribute("countor", countor+""); //跳转主页 resp.sendRedirect("main"); return; }else { req.getRequestDispatcher("/page").forward(req, resp); return; } }else { req.getRequestDispatcher("/page").forward(req, resp); return; } } }
MainSerlvet
public class MainServlet extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应类型及编码 resp.setContentType("text/html;charset=utf-8"); //获取session对象 HttpSession hs = req.getSession(); //获取用户对象 User user = (User)hs.getAttribute("user"); //获取用户名 String username = null; if(user!=null) { username = user.getUsername(); } //ServletContext对象获取网站访问计数器 ServletContext cs = this.getServletContext(); String countor = (String)cs.getAttribute("countor"); resp.getWriter().write("<html>"); resp.getWriter().write("<head>"); resp.getWriter().write("</head>"); resp.getWriter().write("<body>"); resp.getWriter().write("欢迎登录"+username+"管理系统<hr>"); resp.getWriter().write("<form action='logout' method='get'>"); resp.getWriter().write("<input type='submit' value='注销'> "); resp.getWriter().write("</form>"); resp.getWriter().write("<form action='page' method='get'>"); resp.getWriter().write("<input type='submit' value='登录'><hr>"); resp.getWriter().write("</form>"); resp.getWriter().write("网站访问次数:"+countor); resp.getWriter().write("</body>"); resp.getWriter().write("</html>"); } }