如何实现优化Servlet,使其一个模块对应一个Servlet。

文章目录


前言

以下是我在学习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方便于管理与减少编写代码的工作量。本人菜鸟一枚,若以上内容有错误,欢迎大家在评论区指正。

猜你喜欢

转载自blog.csdn.net/weixin_51012090/article/details/118858313