抽取Servlet,控制Servlet的数量

目的:

原本开发一个功能一个Servlet,为减少Serlvet数量,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。

解决:

分析:

原本是每个功能都需要一个Servlet继承HttpServlet,现在根据对象实例关系划分,将原本的需求功能变成一个Servlet的多个方法,减少Servlet的数量。
从HttpServlet源码可以看出在Service方法中进行方法的分发。由tomcat容器生成HttpServlet子类的实例,根据Http请求决定调用doGet或是doPost。
同理,我们可以创建一个基本的Servlet继承HttpServlet,重写Service方法进行子类的方法转发。

代码:

将原本的RegisServlet和LoginServlet功能,抽取的UserSevlet的regist和login方法中
java

public class BaseServlet extends HttpServlet {
	  @Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        //完成方法分发
        //1.获取请求路径
        String uri = req.getRequestURI(); //   /travel/user/add
        System.out.println("请求uri:"+uri);//  /travel/user/add
        //2.获取方法名称
        String methodName = uri.substring(uri.lastIndexOf('/') + 1);
        System.out.println("方法名称:"+methodName);
        //3.获取方法对象Method
        //谁调用我?我代表谁
        System.out.println(this);//UserServlet的对象cn.itcast.travel.web.servlet.UserServlet@4903d97e
        try {
            //获取方法
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //4.执行方法
            //暴力反射
            //method.setAccessible(true);
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
   }
}

java

 @WebServlet("/user/*") // /user/add /user/find
  public class UserServlet extends BaseServlet {

	    //声明UserService业务对象
	    private UserService service = new UserServiceImpl();
	
	    /**
	     * 注册功能
	     * @param request
	     * @param response
	     * @throws ServletException
	     * @throws IOException
	     */
	    public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	        //验证校验
	        String check = request.getParameter("check");
	        //从sesion中获取验证码
	        HttpSession session = request.getSession();
	        String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
	        session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
	        //比较
	        if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
	            //验证码错误
	            ResultInfo info = new ResultInfo();
	            //注册失败
	            info.setFlag(false);
	            info.setErrorMsg("验证码错误");
	            //将info对象序列化为json
	            ObjectMapper mapper = new ObjectMapper();
	            String json = mapper.writeValueAsString(info);
	            response.setContentType("application/json;charset=utf-8");
	            response.getWriter().write(json);
	            return;
	        }
	
	        //1.获取数据
	        Map<String, String[]> map = request.getParameterMap();
	
	        //2.封装对象
	        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();
	        boolean flag = service.regist(user);
	        ResultInfo info = new ResultInfo();
	        //4.响应结果
	        if(flag){
	            //注册成功
	            info.setFlag(true);
	        }else{
	            //注册失败
	            info.setFlag(false);
	            info.setErrorMsg("注册失败!");
	        }
	
	        //将info对象序列化为json
	        ObjectMapper mapper = new ObjectMapper();
	        String json = mapper.writeValueAsString(info);
	
	        //将json数据写回客户端
	        //设置content-type
	        response.setContentType("application/json;charset=utf-8");
	        response.getWriter().write(json);
	
	    }
	
	    /**
	     * 登录功能
	     * @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);
	   }
 	}
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值