🍀 BaseServlet抽取
目的
减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。
Idea控制台中文乱码解决:-Dfile.encoding=gb2312
当 UserServlet中的方法一旦被访问 就会执行 BaseServlet 中的方法 why? 因为UserServlet extends BaseServlet 相当于UserServlet也有一个service方法 所以 可以在BaseServlet 中完成代码的分发
//1.获取请求路径 req.getRequestURI(); //2.获取方法名称 uri.substring(uri.lastIndexOf("/")+1); //3.获取方法对象Method 获取UserServlet的字节码文件对象 通过getMethod方法获取方法对象 Method method=this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class); //4.执行方法
🚩 细节注意
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。 如果没有找到匹配的字符串则返回 -1。 注意: indexOf() 方法区分大小写。
lastIndexOf刚好相反
+1解释:substring截取方法 含头不含尾 需要截取的部分是最后一个/后面的方法名 不要/
测试效果图
正常情况下 这里地方会报错 保存信息大意就是找不到UserServlet类 方法等 两种解决方法
1、使用暴力反射(不推荐 因为项目中 有的私有方法 不想被访问 但是使用暴力反射会将所有的私有方法获取到)
//忽略访问权限修饰符 获取方法 Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); //4.执行方法 //暴力反射 method.setAccessible(true); method.invoke(this, req, resp);
2、将 protected 修饰符 修改为 public
🍀 UserServlet&页面路径改写
页面修改
register.html
UserServlet页面
UserServiceImpl页面
login.html
header.html
测试效果图
测试计划就是将
注册——激活——登录——(显示用户名)——退出流程都走一遍
regist——active——login——findName——exit
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
/**
* @Author wang
* @Date 2022/5/24 17:24
* @PackageName:${PACKAGE_NAME}
* @ClassName: ${NAME}
* @Description: TODO
* @Version 1.0
*/
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
/**
* 用户注册
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//验证码校验
String check = request.getParameter("check");
//从session中获取验证码
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 userInfo = new ResultInfo();
//验证码校验失败
userInfo.setFlag(false);
userInfo.setErrorMsg("验证码错误");
//将info对象序列化为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(userInfo);
//将json数据写回客户端
//设置content-type
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 userInfo = new ResultInfo();
//4.响应结果
if (flag) {
//注册成功
userInfo.setFlag(true);
} else {
//注册失败
userInfo.setFlag(false);
userInfo.setErrorMsg("注册失败");
}
//将info对象序列化为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(userInfo);
//将json数据写回客户端
//设置content-type
response.setContentType("application/json;charset=utf-8");
// response.getOutputStream().write(json.getBytes());
response.getWriter().write(json);
}
/**
* 用户激活
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取激活码
String code = request.getParameter("code");//获取通过http协议提交过来的数据. 不仅仅代表表单提交 而且有自定义参数
if (code != null) {
//2.调用service完成激活
UserService service = new UserServiceImpl();
boolean flag = service.active(code);
//3。判断标记
String msg = "";
if (flag) {//激活成功
msg = "激活成功 请<a href='"+request.getContextPath()+"/login.html'>登录</a>";
} else {
//激活失败
msg = "激活失败,请联系管理员!";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(msg);
}
}
/**
* 用户登录
*
* @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();
//3.将map获取值传入user对象中
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//4.调用service查询
UserService service = new UserServiceImpl();
User u = service.login(user);
//5.对用户的非空、激活、成功登录进行判断
ResultInfo info = new ResultInfo();
if (u == null) {
info.setFlag(false);
info.setErrorMsg("用户或密码不存在");
}
if (u != null && !"Y".equals(u.getStatus())) {
info.setFlag(false);
info.setErrorMsg("用户未激活,请先激活");
}
if (u != null && "Y".equals(u.getStatus())) {
info.setFlag(true);
request.getSession().setAttribute("user", u);
}
//响应数据 (设置json数据返回 和格式)
response.setContentType("application/json;charset=utf-8");
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getOutputStream(), info);
}
/**
* 欢迎回来 ~显示用户名
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void findName(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request中获取name值
Object name = request.getSession().getAttribute("user");
//将name值回显到客户端
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
// mapper.writeValue(response.getOutputStream(), name);
String json = mapper.writeValueAsString(name);
response.getWriter().write(json);
}
/**
* 用户退出
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.清除session信息
request.getSession().invalidate();
//2.跳转登录页
response.sendRedirect(request.getContextPath() + "/login.html");
}
}