BaseServlet的抽取——》优化Servlet

在我所写的web项目中,每次写一个功能,我都要去创建一个Servlet去实现它的功能,即便是对同一事物进行增删改查的功能操作,随着功能的越来越多,Servlet所创建的数量也就越来越来,这对我编=程序来说,看到一大堆的Servlet是很头疼的,所以,我们需要去对一些对相同事物进行操作的servlet进行优化。BaseServlet的提取。

我们优化的目的:

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

 

BaseServlet的编写

/**
 * #Description : 完成方法分发
 * #Date: 2020/11/3 21:05
 * @author : tiankun
 */
public class BaseUserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 在执行UserServlet的方法之前都会先执行 service 方法

        // 完成方法分发
        // 1.获取URi
        String requestURI = req.getRequestURI();      // /travel/user/add
        System.out.println("请求uri"+requestURI);     // /travel/user/add
        // 2.获取方法名称
        String methodName = requestURI.substring(requestURI.lastIndexOf("/")+1);
        System.out.println("方法名称:"+methodName);
        // 3.获取方法对象Method
        // 谁调用我,我代表谁(this)
        System.out.println(this);   //UserServlet的对象 cn.itcast.travel.web.servlet.UserServlet@25ffc714
        try {
            // 4、获取方法
            // 忽略访问修饰符  不推荐
            //Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            // 5.执行方法
            // 暴力反射
            //method.setAccessible(true);
            method.invoke(this,req,resp);

        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

 

UserServlet的编写

package cn.itcast.travel.web.servlet;

import cn.itcast.travel.domain.ResultInfo;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.service.UserService;
import cn.itcast.travel.service.impl.UserServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

/**
 * #Description : 抽取出的UserServlet
 * #Date: 2020/11/3 21:04
 * @author : tiankun
 */
@WebServlet("/user/*")
public class UserServlet extends BaseUserServlet{
    private UserService userService = new UserServiceImpl();

    /**
     * 用户的注册
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    public void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 因为已经设置了编码过滤器,所以不需在设置编码

        // 0.校验验证码
        // 获取用户输入的验证
        String checkCode = req.getParameter("check");
        // 获取随机生成的验证码
        String checkcode_server = (String) req.getSession().getAttribute("CHECKCODE_SERVER");
        if(checkCode == null || !checkCode.equalsIgnoreCase(checkcode_server)){
            ResultInfo info = new ResultInfo();
            info.setFlag(false);
            info.setErrorMsg("验证码输入错误!");
            // 将info 对象 序列化为 json
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(info);

            // 设置contentType
            resp.setContentType("application/json;charset=utf-8");
            // 将 json 数据写回客户端

            resp.getWriter().write(json);
            return;
        }

        // 清除 session中的验证码信息
        req.getSession().removeAttribute("CHECKCODE_SERVER");

        // 1.获取数据
        Map<String, String[]> parameterMap = req.getParameterMap();
        // 2.封装对象
        User user = new User();
        try {
            BeanUtils.populate(user,parameterMap);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 3.调用service 完成注册
        boolean flag = userService.registerUser(user);

        // 创建返回信息duix
        ResultInfo info = new ResultInfo();
        info.setFlag(flag);
        // 如果注册失败
        if(!flag){
            info.setErrorMsg("注册失败!用户已存在");
        }

        // 将info 对象 序列化为 json
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(info);

        // 设置contentType
        resp.setContentType("application/json;charset=utf-8");
        // 将 json 数据写回客户端
        resp.getWriter().write(json);

    }

    /**
     *  用户的登录
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取用户名 密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String usercode = req.getParameter("check");
        // 获取生成的 验证码
        String checkcode_server = (String) req.getSession().getAttribute("CHECKCODE_SERVER");
        // 判断验证码是否正确
        ResultInfo info = new ResultInfo();
        if(usercode.equalsIgnoreCase(checkcode_server)){
            // 验证码输入正确
            // 校验用户名和密码是否输入正确
            User user =  userService.login(username,password);
            if(user != null){
                // 用户名 和 密码 正确
                // 校验 用户是否 已邮箱激活,如果没有拒绝登录,并给用户给出提示信息
                Boolean flag =  userService.checkActive(user.getUid());
                if(flag){
                    // 已经激活 登录成功
                    info.setFlag(true);
                    // 将用户信息存储在Session中
                    req.getSession().setAttribute("user",user);
                }else {
                    // 未激活 给出提示信息
                    info.setFlag(flag);
                    info.setErrorMsg("你尚未邮箱激活,请开登录你的邮箱进行激活");
                }
            }else {
                info.setFlag(false);
                info.setErrorMsg("账号或密码输入错误");
            }
        }else {
            // 验证码输入错误
            info.setFlag(false);
            info.setErrorMsg("验证码输入错误");
        }

        // 将 ResultInfo 序列化为 json
        ObjectMapper mapper = new ObjectMapper();
        String msg = mapper.writeValueAsString(info);

        // 设置响应格式 并将数据响应给前台页面
        resp.setContentType("application/json;charset=utf-8");
        resp.getWriter().write(msg);
    }

    /**
     *  在seesion中获取用户信息
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    public void findUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取存储在Session中的用户信息
        User user = (User) req.getSession().getAttribute("user");

        // 将user序列化为 json后传递给前端
        ObjectMapper mapper = new ObjectMapper();
        String strUser = mapper.writeValueAsString(user);

        // 设置响应格式
        resp.setContentType("application/json;charset=utf-8");
        resp.getWriter().write(strUser);
    }

    /**
     *  用户退出
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void exit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 清除 Session中的用户信息
        req.getSession().removeAttribute("user");

        // 跳转到 login 页面
        resp.sendRedirect("login.html");
    }

    /**
     *  用户注册码激活
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void active(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.获取激活码
        String code = req.getParameter("code");
        if(code != null){
            // 2.调用service 完成激活
            boolean flag = userService.active(code);

            // 3.判读标记
            String msg = null;
            if(flag){
                // 激活成功
                msg = "激活成功 <a href='login.html'>登录</a>";
            }else {
                // 激活失败
                msg = "激活失败,请联系管理员";
            }

            // 响应给前台数据
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().write(msg);
        }
    }
}

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值