在我所写的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);
}
}
}