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";
}
}
共有条评论 网友评论