Java Web开发之如何优化多个相关的servlet?

如何优化多个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);

        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值