BaseServlet的抽取

执行流程及分析(个人理解):
BaseServlet的抽取其实就是将每个Servelt封装成为每一个模块功能到到一个类中.此类继承BaseServlet类,BaseServlet继承HttpServlet,再根据Servlet的生命周期,会执行service方法,所以在BaseServlet中重写service方法,再在service方法中通过反射去执行到每个具体的Servlet类中的每个模块功能。
BaseServlet的抽取
BaseServlet的抽取
好处:最主要的是代码后期的维护性增强,让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类省略…

![在这里插BaseServlet的抽取
访问此路径就相当于执行了UserServet中的register模块,从而实现了注册的功能。这样是不是大大方便了很多,不用去写很多的servlet页面了呢?
至于底层的原理,主要就是反射机制、继承以及Servlet的生命周期。就不一一介绍了,大家可以去看看源码!