使用ServletContext对象完成网页计数器
* 在用户登录校验中创建计数器并自增,然后存储到ServletContext对象中
* 在主页面里取出计数器数据显示给用户即可。
当服务器停掉后,重新启动。这个网页计数器又要重新开始计数。这显然不符合逻辑。故需要想一个办法,即使在服务器被停掉后,网页计数器也能正常计数。
解决
解决方法:
LoginServlet.java
package com.dym.servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.dym.pojo.User;
import com.dym.service.LoginService;
import com.dym.service.impl.LoginServiceImpl;
/**
* 使用ServletContext对象完成网页计数器
* 在用户登录校验中创建计数器并自增,然后存储到ServletContext对象中
* 在主页面里取出计数器数据显示给用户即可。
* @author Administrator
*
*/
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式:
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname=req.getParameter("uname");
//使用String进行数据重新编码
// uname=new String(uname.getBytes("iso8859-1"),"utf-8"); //解决了乱码问题
String pwd=req.getParameter("pwd");
System.out.println(uname+":"+pwd);
//处理请求信息
//获取业务层对象
LoginService ls=new LoginServiceImpl();
User u=ls.checkLoginService(uname, pwd);
System.out.println(u);
//响应处理结果
if(u!=null){
//创建Cookie信息,实现三天免登录
Cookie c=new Cookie("uid",u.getUid()+"");
//设置Cookie的有效期
c.setMaxAge(3*24*60*60);
c.setPath("/login/ck");
//添加Cookie信息
resp.addCookie(c);
//请求转发
//req.getRequestDispatcher("main").forward(req, resp);
//将数据存储到session对象中
HttpSession hs=req.getSession();
hs.setAttribute("user",u);
//创建网页计数器
//获取计数数据
ServletContext sc=this.getServletContext();
if(sc.getAttribute("nums")!=null){
int nums=Integer.parseInt((String) sc.getAttribute("nums"));
//计数器自增
nums+=1;
//再次存储到ServletContext对象中
sc.setAttribute("nums",nums);
}else{
sc.setAttribute("nums", 1);
}
//重定向
resp.sendRedirect("/login/main");
return;
}else{
//使用request对象实现不同servlet的数据流转
req.setAttribute("str", "用户名或密码错误");
//使用请求转发
req.getRequestDispatcher("page").forward(req, resp);
//请求转发后直接return结束即可。
return;
}
}
}
CookieServlet.java
package com.dym.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dym.pojo.User;
import com.dym.service.LoginService;
import com.dym.service.impl.LoginServiceImpl;
/**
* Cookie信息校验
* 判断请求中是否携带正确的Cookie信息
* 如果有则校验Cookie信息是否正确
* 如果校验正确则直接响应主页面给用户
* 如果校验不正确则响应登录页面给用户
* 没有则请求转发给登录页面
*/
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(cks!=null){
//遍历Cookie信息
String uid="";
for(Cookie c:cks){
if("uid".equals(c.getName())){
uid=c.getValue();
}
}
//校验UID是否存在
if("".equals(uid)){
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}else{
//校验UID用户信息
//获取业务层对象
LoginService ls=new LoginServiceImpl();
User u=ls.checkUidService(uid);
if(u!=null){
//将用户数据存储到session对象中
req.getSession().setAttribute("user",u);
//网页计数器自增
int nums=(int) this.getServletContext().getAttribute("nums");
nums+=1;
this.getServletContext().setAttribute("nums", nums);
//重定向
resp.sendRedirect("/login/main");
return;
}else{
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}
}
}else{
//响应处理结果
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}
}
}
MainServlet.java
package com.dym.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dym.pojo.User;
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中的数据
User u=(User)req.getSession().getAttribute("user");
//获取网页浏览次数
int nums=(int) this.getServletContext().getAttribute("nums");
//处理请求信息
//响应处理结果
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<h3>欢迎"+u.getUname()+"访问dym管理系统</h3>");
resp.getWriter().write("当前网页浏览次数为:"+nums);
resp.getWriter().write("<hr>");
resp.getWriter().write("<form action='show' method='get'>");
resp.getWriter().write("<input type='submit' value='查看个人信息'>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
NumServlet.java
package com.dym.servlet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class NumServlet extends HttpServlet {
//覆写init初始化方法,将数据读取到ServletContext对象中
@Override
public void init() throws ServletException {
//获取文件中的计数器数据
//获取文件路径
String path=this.getServletContext().getRealPath("/nums/nums.txt");
//声明流对象
FileReader fr=null;
BufferedReader br=null;
try {
fr=new FileReader(path);
br=new BufferedReader(fr);
String nums=br.readLine();
System.out.println(nums);
this.getServletContext().setAttribute("nums", nums);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//覆写销毁方法,存储计数器到文件中
@Override
public void destroy() {
//获取网页计数器
int nums=(int) this.getServletContext().getAttribute("nums");
//获取文件路径
String path=this.getServletContext().getRealPath("/nums/nums.txt");
//声明流对象
BufferedWriter bw=null;
FileWriter fw=null;
try {
fw=new FileWriter(path);
bw=new BufferedWriter(fw);
bw.write(nums+"");
bw.flush();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
备注:可以在我的博客下载那去下载源代码