前言
以下是我在学习web时做的一个小demo而总结的部分笔记,就如何将一个功能一个Servlet优化成一个模块对应一个Servlet。若有啥不正确的,欢迎大家评论区进行指正。
一、分析
在进行写小demo的时候,写个页面就发现一个功能就对应了一个Servlet,这如果功能太多,那需要写的Servlet也会随之变多。这不太方便管理。所以我们可以单独写一个BaseServlet,让其他的Servlet继承BaseServlet,在BaseServlet中完成方法的分发。
比如 编写一个UserServlet继承BaseServlet,然后再让BaseServlet继承HttpServlet,这样就可让继承了BaseServlet的UserServlet可以被浏览器通过url来访问到。这样在UserServlet中编写的功能实现方法就可被运行,这样就大大优化了编写Servlet的数量。
(注:Servlet被访问的入口就是service方法,BaseServlet只需要重写HttpServlet中的service方法即可且BaseServlet不需要被访问到)
二、实例代码
1.BaseServlet
BaseServlet里面就只有一个service方法,用来对继承BaseServlet的UserServlet进行方法分发。
public class BASEservlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取访问的网址
String uri = req.getRequestURI();
//打印访问的网址
System.out.println(uri);
//2.获取方法名称,从访问的网址中最后一根斜线后的第一个字母开始获取
String methodName = uri.substring(uri.lastIndexOf("/") + 1);
System.out.println(methodName);
//3. 获取方法对象Method
//这里的this谁调用BaseServlet,我就是谁,这里是UserServlet调用的
System.out.println(this);
/*
拿到方法名称来获取方法对象,在定义的UserServlet的方法的格式都是一样的。
通过一种方式来获取UserServlet的一个字节码文件对象。
然后通过他的getMythod()就可以拿到该对象。
*/
try {
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);//这里的getMethod只能拿到公有的方法,私有的需要使用getDeclaredMethod(),否则会报错。
//执行方法
method.invoke(this, req, resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
2.UserServlet
这里我写了几个功能的方法,仅供参考。
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
//声明UserService业务对象
private UserService service = new UserServiceImpl();
/**
* 登录功能
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取用户名和密码数据
Map<String, String[]> map = request.getParameterMap();
//2.封装User对象
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3.调用Service查询
// UserService service = new UserServiceImpl();
User u = service.login(user);
ResultInfo info = new ResultInfo();
//4.判断用户对象是否为null
if(u == null){
//用户名密码或错误
info.setFlag(false);
info.setErrorMsg("用户名密码或错误");
}
//5.判断用户是否激活
if(u != null && !"Y".equals(u.getStatus())){
//用户尚未激活
info.setFlag(false);
info.setErrorMsg("您尚未激活,请激活");
}
//6.判断登录成功
if(u != null && "Y".equals(u.getStatus())){
request.getSession().setAttribute("user",u);//登录成功标记
//登录成功
info.setFlag(true);
}
//响应数据
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),info);
}
/**
* 退出功能
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.销毁session
request.getSession().invalidate();
//2.跳转登录页面
response.sendRedirect(request.getContextPath()+"/login.html");
}
}
总结
这样优化的Servlet方便于管理与减少编写代码的工作量。本人菜鸟一枚,若以上内容有错误,欢迎大家在评论区指正。