如何优化多个servlet?
为什么要优化?
便于管理和后期维护。
优化之前
可见很多servlet都属于其中用户的操作,因此可以将之归类。
如何优化?
依照下图进行优化,箭头为继承的关系。
- 首先,建立UserServlet,继承BaseServlet,此时可认为UserServlet是一个普通的类,并对其三处代码进行修改,如下图为已经修改过的。
/user/*
意味着凡是user相关的url,都会访问这个servlet。add和find为用户可以进行的操作,可以将registServlet里的内容复制到该类中成为该类的一个函数。
随后建立BaseServlet,继承HttpServlet,因此BaseServlet为UserServlet的父类,可采用反射方法,获取url中要访问的用户功能函数名称,进而对子类UserServlet相应的函数进行调用。且封装两个序列化Json的函数,方便子类函数调用。
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//完成方法分发
//
//获取请求路径,返回 /travel/user/add
String uri = req.getRequestURI();
System.out.println(uri);
//获取方法名称
String methodName = uri.substring(uri.lastIndexOf('/') + 1);
System.out.println(methodName);
//获取方法对象Method
// System.out.println(this); 此处的this为UserServlet
try {
//获取方法对象Method
// getMethod(要获取的方法名称,按声明顺序标识该方法形参类型)
Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//执行方法
//暴力反射
method.setAccessible(true);
method.invoke(this,req,resp);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 将传入的对象序列化json,并且写回客户端
* @param obj
*/
public void writeValue(Object obj,HttpServletResponse response) throws IOException {
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),obj);
}
/**
* 将传入的对象序列化为json,返回
* @param obj
* @return
*/
public String writeValueAsString(Object obj) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(obj);
}
}
优化之后
优化之后的Servlet,少了很多,注册、登录、激活等用户相关功能的Servlet均合并到Uservlet中,成为它的一个函数。
最终的UserServlet代码如下:
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
//声明userservice
private final UserService service = new UserServiceImpl();
public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 校验验证码
String check = request.getParameter("check");
// String name = request.getParameter("name");
// System.out.println(name);
// System.out.println(check);
// 从session获取验证码
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
// 从session移除验证码,只使用一次
session.removeAttribute("CHECKCODE_SERVER");
// 获取数据
// 比较
if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)) {
// 校验不通过
ResultInfo info = new ResultInfo();
info.setFlag(false);
info.setErrorMsg("验证码错误!");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
// 将json数据写回客户端
// 设置content-type
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
return;
}
Map<String, String[]> map = request.getParameterMap();
// 封装对象
User user = new User();
try {
// BeanUtils.populate( Object bean, Map properties ),这个方法会遍历map<key, value>中的key,如果bean中有这个属性,就把这个key对应的value值赋给bean的属性。
BeanUtils.populate(user, map);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
// 调用service完成注册
boolean flag = service.regist(user);
ResultInfo info = new ResultInfo();
// 响应结果
if (flag) {
// 注册成功
info.setFlag(true);
} else {
// 注册失败
info.setFlag(false);
info.setErrorMsg("注册失败!");
}
// 将info对象序列化为json
String json = writeValueAsString(info);
// 将json数据写回客户端
// 设置content-type
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
}
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String[]> map = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
// UserService service = new UserServiceImpl();
User u = service.login(user);
ResultInfo info = new ResultInfo();
//判断是否登陆成功
if (u != null) {
// 登录成功
// 判断是否激活
if ("Y".equals(u.getStatus())) {
// 已激活
info.setFlag(true);
//将用户信息存入session
request.getSession().setAttribute("user", u);
} else {
info.setFlag(false);
info.setErrorMsg("用户尚未激活!");
}
} else {
// 登陆失败
info.setFlag(false);
info.setErrorMsg("用户名或密码错误");
}
writeValue(info,response);
}
public void findUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* 从session获取登录用户 */
Object user = request.getSession().getAttribute("user");
System.out.println();
/* 将user写回客户端 */
writeValue(user,response);
}
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 跳转到登录页面
System.out.println(request.getContextPath() + "/login.html");
response.sendRedirect(request.getContextPath() + "/login.html");
}
public void active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code = request.getParameter("code");
//判断是否为空
if (code != null) {
//调用service完成激活
// UserService service = new UserServiceImpl();
boolean flag = service.active(code);
String msg = null;
//判断标记
if (flag) {
//激活成功
msg = "激活成功,请<a href='http://localhost:80/travel/login.html'>登录</a>";
} else {
//激活失败
msg = "激活失败,请联系管理员!";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(msg);
}
}
}