mysql springcloud parsing pip menu jQuery Mobile vue添加class js的点击事件 jq选择第一个子元素 oracle取第一条数据 hadoop创建文件夹 html好看的字体 hash怎么下载 hbuilder插件 centos定时任务 python编程 数据库学习 python基础语法 python支持中文 java编程学习 java数据类型 java表达式 java中的数据类型 java地址 java文件输入输出 java截取 sql综合利用工具 ae脚本管理器 dll下载 js保留两位小数 tomcat修改端口 保留小数点后两位 华为动态照片 c语言图书管理系统 鬼灵战马 迅雷单机游戏下载 dll文件 启用宏在哪里设置 opencv是什么 ps取色
当前位置: 首页 > 学习教程  > 编程语言

优化Servlet-BaseServlet的抽取

2020/9/19 16:03:36 文章标签:

BaseServlet的抽取与优化(减少创建多个Servlet类),利用反射机制进行抽取

package com.feilong.shop.controller;

import com.feilong.shop.utils.Constants;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author FeiLong
 * @version 1.8
 * @date 2020/9/13 17:47
 */
@SuppressWarnings("ALL")
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取请求的uri地址的标识
        String uri = req.getRequestURI();
        //通过截取得到标识对应的方法名称
        String methodName = uri.substring(uri.lastIndexOf("/") + 1);
        if (methodName == null && methodName.equals("")) {
            methodName = Constants.INDEX;//methodName为空时赋值为index然后调用index方法跳转到index界面
        }
        //利用反射机制拿到对应的方法
        try {
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //执行方法
            Object result = method.invoke(this, req, resp);
            //集中处理响应结果
            if (result != null) {
                String str = (String) result;
                if (str.startsWith(Constants.FORWARD)) {//forward
                    //转发
                    String path = str.substring(str.indexOf(Constants.FLAG) + 1);//:
                    req.getRequestDispatcher(path).forward(req, resp);
                } else if (str.startsWith(Constants.REDIRECT)) {//redirect
                    //重定向
                    String path = str.substring(str.indexOf(Constants.FLAG) + 1);
                    resp.sendRedirect(path);
                } else {
                    resp.getWriter().println(str);
                }
            }
        } catch (Exception e) {
            //没有找到反射方法
            e.printStackTrace();
            req.getSession().setAttribute("msg", "程序异常请稍后再试...");
            resp.sendRedirect("/message.jsp");
        }
    }

    /**
     * 当method标识符‘没有值’ 我们默认赋 index 访问每个controller的index方法!
     * 我们将方法提取到baseservlet中即可!
     * 默认处理:跳转到程序的首页!
     *
     * @param req
     * @param resp
     * @return
     * @throws IOException
     * @throws ServletException
     */
    public String index(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {

        return Constants.REDIRECT + "/index.jsp";
    }
}

编写完后根据模块进行编写Servlet,一个用户模块对应一个Servlet,里面的方法对应要进行的操作,模块的Servlet都要继承这个BaseServlet,不要再继承HttpServlet了!
再进行配置注解的时候最好这样配置 /user/*
当访问用户模块服务器时确保要访问到里面的每一个对应的方法
示例 用户模块

package com.feilong.shop.controller;

import com.feilong.shop.entity.User;
import com.feilong.shop.service.UserService;
import com.feilong.shop.service.impl.UserServiceImpl;
import com.feilong.shop.utils.Base64Utils;
import com.feilong.shop.utils.Constants;
import com.feilong.shop.utils.MD5Utils;
import com.feilong.shop.utils.RandomUtils;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * @author FeiLong
 * @version 1.8
 * @date 2020/9/13 18:06
 */
@SuppressWarnings("ALL")
@WebServlet("/user/*")
public class UserServletController extends BaseServlet {
    private UserService userService = new UserServiceImpl();

    /**
     * 检测用户名是否存在的方法
     *
     * @param req
     * @param resp
     * @return 1 存在 不可注册  0不存在可注册
     * @throws Exception
     */
    public String check(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        String username = req.getParameter("username");
        if (username == null) {
            return Constants.USERHAS;//用户名为空不可注册
        }

        boolean checked = userService.checked(username);
        if (checked) {
            return Constants.USERHAS;//用户名存在不可注册
        } else {
            return Constants.USERNOHAS;
        }
    }

    /**
     * 用户注册的方法
     *
     * @param req
     * @param resp
     * @return 注册成功跳转到成功界面  失败跳转到注册界面
     */
    public String register(HttpServletRequest req, HttpServletResponse resp) {
        Map<String, String[]> map = req.getParameterMap();
        User user = new User();
        try {
            BeanUtils.populate(user, map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(user);
        //完善用户信息
        //已经赋值:用户姓名  用户密码 邮箱  性别
        //未赋值:激活状态 激活码  账号类型
        user.setUstatus(Constants.USER_NOT_ACTIVE);//0代表未激活  1代表激活
        user.setCode(RandomUtils.createActive());//随机生成激活码
        user.setUrole(Constants.USER_CUSTOMER);//普通客户0   管理员1
        //密码进行MD5加密
        user.setUpassword(MD5Utils.md5(user.getUpassword()));

        int result = userService.registerUser(user);
        if (result > 0) {
            return Constants.REDIRECT + "/registerSuccess.jsp";
        } else {
            req.getSession().setAttribute("registerMsg", "注册失败!");
            return Constants.FORWARD + "/register.jsp";
        }
    }

    /**
     * 邮箱激活
     * @param req
     * @param resp
     * @return
     */
    public String active(HttpServletRequest req, HttpServletResponse resp) {
        //1.得到的结果是base64编码
        String code = req.getParameter("c");
        //2.进行base64解码
        String decode = Base64Utils.decode(code);
        int status = userService.activeUser(decode);
        if (status == Constants.ACTIVE_FAIL) {
            req.setAttribute("msg", "激活失败!");
        } else if (status == Constants.ACTIVE_SUCCESS) {
            req.setAttribute("msg", "激活成功!请返回登录!");
        } else {
            req.setAttribute("msg", "已经激活,请勿重复操作!");
        }
        return Constants.FORWARD + "/message.jsp";

    }

    /**
     * 用户登录
     * @param req
     * @param resp
     * @return
     */
    public String login(HttpServletRequest req, HttpServletResponse resp) {
        //获取参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String code = req.getParameter("code");//用户输入的验证码
        String auto = req.getParameter("auto");
        //获取存储的验证码
        String code_session = (String) req.getSession().getAttribute("code");//正确的验证码
        if (code == null || !code.equalsIgnoreCase(code_session)) {
            req.setAttribute("msg", "验证码输入有误!");
            return Constants.FORWARD + "/login.jsp";
        }


        /* 调用业务逻辑方法
           loginUser为空证明用户名或密码错误
           loginUser不为空  但是user处于未激活状态
         */
        User loginUser = userService.login(username, password);
        if (loginUser == null) {
            //用户为空转发登录页
            req.setAttribute("msg", "用户名或密码错误!");
            return Constants.FORWARD + "/login.jsp";
        }

        if (loginUser.getUstatus() != Constants.USERACTIVE) {
            //未激活转发到登录页
            req.setAttribute("msg", "账号未激活!");
            return Constants.FORWARD + "/login.jsp";
        }
        req.getSession().setAttribute("loginUser", loginUser);

        if (auto == null) {
            //没有勾选自动登录
            //将本地浏览器的Cookie清空
            Cookie cookie = new Cookie(Constants.COOKIE_USER, "");
            cookie.setPath("/");
            cookie.setMaxAge(0);//立即删除
            resp.addCookie(cookie);
        } else {
            //不为空代表已经勾选
            //需要将用户名和密码存储到浏览器
            String content = username + Constants.FLAG + password;
            //将内容进行base64编码存储  安全性高
            String encodeContent = Base64Utils.encode(content);
            System.out.println(encodeContent);
            Cookie cookie = new Cookie(Constants.COOKIE_USER, encodeContent);
            cookie.setPath("/");
            cookie.setMaxAge(60 * 60 * 24 * 14);//两周
            resp.addCookie(cookie);
        }

        //用户不为空并且已经激活,可以跳转详情页
        return Constants.FORWARD + "/index.jsp";
    }

    /**
     * 用户注销
     * @param req
     * @param resp
     * @return
     */
    public String logout(HttpServletRequest req, HttpServletResponse resp) {
        //1.清除session中的数据
        HttpSession session = req.getSession();
        session.removeAttribute("loginUser");
        //2.清除Cookie
        Cookie cookie = new Cookie(Constants.COOKIE_USER, "");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        resp.addCookie(cookie);

        req.setAttribute("msg", "账户注销成功!");
        return Constants.FORWARD + "/login.jsp";

    }
}


本文链接: http://www.dtmao.cc/news_show_200339.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?