目的
- 减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。
分析
- 如果存在控制台中文乱码
代码实现
- BaseServlet
public class BaseServlet extends HttpServlet {
/**
* 重写service方法
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//进行方法分发
//获取请求路径
// /travel/user/add
String uri = req.getRequestURI();
//获取方法名称
// add
String methodName = uri.substring(uri.lastIndexOf("/") + 1);
//获取方法对象Method
try {
//忽略范围权限修饰符,获取方法
Method method = this.getClass().getMethod(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.getWriter(), obj);
}
/**
* 将传入的对象序列化为json ,返回
*
* @param obj 转换对象
* @return 转换成功的json格式的字符串
* @throws JsonProcessingException
*/
public String writeValueAsString(Object obj) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(obj);
}
}
不使用暴力反射,主要是对Servlet的私有方法进行保护.直接将要调用的方法的访问修饰符都改为public.
将所有Servlet中存在大量重复序列化Json,Object转换Json格式方法,进行提取到BaseServlet中.
- 将所有的Servlet进行改写
例:UserServlet改写
- 原功能Servlet
@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从sessoin中获取登录用户
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
//将user写回客户端
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(), user);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
原Servlet中功能单一,并且存在大量重复代码.冗余过高
- 重写入UserServlet
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
/**
* 声明UserService业务对象
*/
private UserService userService = new UserServiceImpl();
/**
* 查询登录用户
*
* @param request
* @param response
* @throws IOException
*/
public void findOne(HttpServletRequest request, HttpServletResponse response) throws IOException {
//从session中获取登录用户
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
//将user写回客户端
writeValue(user, response);
//ObjectMapper mapper = new ObjectMapper();
//response.setContentType("application/json;charset=utf-8");
//mapper.writeValue(response.getOutputStream(), user);
}
}
修改后Servlet使用方法名表示访问路径名,该功能访问的路径为 http://localhost:80/travel/findOne
已经初步类似框架技术.