黑马旅游网学习记录(六)
今天的主要内容为对servlet做一个优化。抽取一个baseServlet。将所有的用户servlet写入到userServlet中。
需要知道的信息
我们写的servlet都是继承自HttpServlet的,每一个servelet都是通过HttpServlet中的service方法进行下发的。所以,我们用baseServlet继承自HttpServlet,在让userServlet继承自baseServlet,这样在baseServlet中重写service方法,就可以完成user各个不同servlet的工作了。
baseServlet的写法:
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri = req.getRequestURI();
String methodName = uri.substring(uri.lastIndexOf('/')+1);
try {
//这里使用的method映射方法只能访问到public权限的方法。
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
再来看userServlet
public class UserServlet extends BaseServlet {
//由于很多方法都对Service做了声明对象的存在,所以直接让他作为内部变量更加合理。
private UserService userService = new UserServiceImpl();
public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//验证校验,获取浏览器传过来的验证码
String check = request.getParameter("check");
//得到客户端后端生成的验证码
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
session.removeAttribute("CHECKCODE_SERVER");//每次使用过验证码以后要删除
//判断
if (!check.equalsIgnoreCase(checkcode_server)) {
//如果不相等,提示信息后,直接return
ResultInfo info = new ResultInfo();//domain中的返回结果对象。
info.setFlag(false);
info.setErrorMsg("验证码错误!");
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(info);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(json);
return;
}
//1、获取数据
Map<String, String[]> map = request.getParameterMap();
//2、封装对象
User user = new User();
try {
BeanUtils.populate(user, map);//这里是将map中的键值对封装进user中。
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3、调用service完成注册 完成注册也就是说存储到数据库中
// UserService userService = new UserServiceImpl();
ResultInfo info = new ResultInfo();//domain中的返回结果对象。
boolean flag = userService.regist(user);
//4、注册反馈
if (flag) {
//注册成功
info.setFlag(true);
} else {
//注册失败
info.setFlag(false);
info.setErrorMsg("注册失败!");
}
//将info序列化
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(info);
//将json数据写回客户端
//设置context-type类型
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(json);
}
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、从前端抓取数据
Map<String, String[]> parameterMap = request.getParameterMap();
//2、封装user对象
User user = new User();
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3、开始在service层进行判断
// UserService service = new UserServiceImpl();
User u = userService.login(user);
ResultInfo resultInfo = new ResultInfo();
if (u == null) {
//用户账号密码错误
resultInfo.setFlag(false);
resultInfo.setErrorMsg("账号或者密码输入错误");
}
//用户尚未激活的状态
if (u != null && !u.getStatus().equals("Y")) {
resultInfo.setFlag(false);
resultInfo.setErrorMsg("用户尚未激活,请激活后重新登陆");
}
if (u != null && u.getStatus().equals("Y")) {
resultInfo.setFlag(true);
}
//响应数据
ObjectMapper objectMapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
objectMapper.writeValue(response.getOutputStream(), resultInfo);
}
public void findone(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、从session中获取user对象
System.out.println(1);
Object user = request.getSession().getAttribute("user");
//2、将user写回客户端
ObjectMapper objectMapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
System.out.println(user);
objectMapper.writeValue(response.getOutputStream(), user);
}
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、销毁session
request.getSession().invalidate();
//2、重新跳转到另一个界面
response.sendRedirect(request.getContextPath() + "/login.html");
}
public void active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//激活界面1、给用户激活
String code = request.getParameter("code");
if (code != null) {
// UserService userService = new UserServiceImpl();
boolean flag = userService.Active(code);
String Msg = null;
if (flag) {
//激活成功
Msg = "激活成功,请点击<a href='/travel/login.html'>登陆</a>";
} else {
//激活失败
Msg = "激活失败,请点击<a href='register.html'>注册</a>重新注册";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(Msg);
}
}
这些方法都是前几次记录中写过的方法,粘贴复制过来就可以了。我们后台的工作做完了,还需要对前台的访问路径做一个修改。
1、login中:
2、regist中:
3、UserServiceImpl中: