BaseServlet的抽取
执行流程及分析(个人理解):
BaseServlet的抽取其实就是将每个Servelt封装成为每一个模块功能到到一个类中.此类继承BaseServlet类,BaseServlet继承HttpServlet,再根据Servlet的生命周期,会执行service方法,所以在BaseServlet中重写service方法,再在service方法中通过反射去执行到每个具体的Servlet类中的每个模块功能。
好处:最主要的是代码后期的维护性增强,让web层中的servlet更简洁。另外高内聚、低耦合,代码得复用性也得到了很大的体现
下面以一个用户登录的案例为例:
BaseServlet
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//1.获取请求的uri
String uri = req.getRequestURI();
System.out.println("请求的uri : " + uri); //travel/find
//2.获取方法名称
String methodName = uri.substring(uri.lastIndexOf("/")+1);
System.out.println(methodName);
System.out.println(this);
//3.获取方法的对象
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//4.通过反射技术去执行方法
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 代码优化,将错误信息对象转化为json字符串
* @param flag
* @param msg
* @return
*/
public String getJson(boolean flag , String msg){
try {
ResultInfo resultInfo = new ResultInfo();
resultInfo.setFlag(flag);
resultInfo.setErrorMsg(msg);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(resultInfo);
return json;
} catch (JsonProcessingException e) {
System.out.println("异常!");
return null;
}
}
/**
* 重载形式
* @param flag
* @return
*/
public String getJson(boolean flag){
try {
ResultInfo resultInfo = new ResultInfo();
resultInfo.setFlag(flag);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(resultInfo);
return json;
} catch (JsonProcessingException e) {
System.out.println("异常!");
return null;
}
}
UserServlet
@WebServlet("/userServlet/*")
public class UserServlet extends BaseServlet{
/**
* 用户登录
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void userLogin(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=utf-8");
//获取页面用户输入的验证码
String check = req.getParameter("check");
HttpSession session = req.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
//验证码校验
if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)) {
/*resultInfo.setFlag(false);
resultInfo.setErrorMsg("登录失败,验证码错误!");
String json = mapper.writeValueAsString(resultInfo);*/
String json = super.getJson(false , "登录失败,验证码错误!");
resp.getWriter().write(json);
return;
}
//用户名密码校验
String username = req.getParameter("username");
String password = req.getParameter("password");
UserService userService = new UserServiceImpl();
User user = userService.findByUsernameAndPassword(username, password);
if (user == null) {
//用户名和密码错误 响应信息
String json = super.getJson(false , "登录失败,用户名或者密码错误");
resp.getWriter().write(json);
return;
}
//继续判断用户的账号是否**
if(user.getStatus().equals("N")){
//没有**,给出提示
String json = super.getJson(false , "登录失败,您尚未**!");
resp.getWriter().write(json);
return;
}else {
//执行到此处证明所有条件满足
session.setAttribute("userLogin",user);
String json = super.getJson(true);
resp.getWriter().write(json);
}
}
/**
* 用户注册
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
resp.setContentType("text/html;charset=utf-8");
//首先对验证码进行校验
//*获取用户输入的验证码
String check = req.getParameter("check");
System.out.println(check);
//*获取服务器端会话中的验证码
HttpSession session = req.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
//为了保证一次性质验证码,在获取之后直接删除会话中的验证码
ObjectMapper mapper = new ObjectMapper();
ResultInfo resultInfo = new ResultInfo();
if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
String json = super.getJson(false , "注册失败!验证码错误!");
//将错误信息反馈给页面
resp.getWriter().print(json);
return;
}
//获取页面注册的参数
Map<String, String[]> parameterMap = req.getParameterMap();
User user = new User();
//封装对象
BeanUtils.populate(user , parameterMap);
/** 测试 */
System.out.println(user);
//调用service层
UserService userService = new UserServiceImpl();
boolean flag = userService.register(user);
String json = null;
if(flag == true){
//注册成功
json = super.getJson(true);
}else {
json = super.getJson(false , "注册失败!用户名存在!");
}
//将json反馈给html页面
resp.getWriter().print(json);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 用户**
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void activeUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取**码
String code = req.getParameter("code");
UserService userService = new UserServiceImpl();
System.out.println(code);
boolean flag = userService.active(code);
String msg = null;
if(flag == true){
//**成功
msg = "**成功,您现在可以<a href='http://localhost:8080/travel/login.html'>登录</a>";
}else {
//**失败
msg = "**失败,请联系管理员";
}
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(msg);
}
/**
* 用户退出
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void exit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("退出");
//销毁session
req.getSession().invalidate();
//跳转到登录的页面
resp.sendRedirect(req.getContextPath() + "/login.html");
}
/**
* 判断用户是否已登录
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void findUserSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(1212);
//首先获取会话中的登录账户
Object userLogin = req.getSession().getAttribute("userLogin");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(userLogin);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(json);
}
User类省略…
![在这里插
访问此路径就相当于执行了UserServet中的register模块,从而实现了注册的功能。这样是不是大大方便了很多,不用去写很多的servlet页面了呢?
至于底层的原理,主要就是反射机制、继承以及Servlet的生命周期。就不一一介绍了,大家可以去看看源码!