目录
一、目的
减少servlet数量,我们再的servlet的一个功能对应一个servlet,servlet数据太多了,为了减少servlet数据,抽取一个BaseServlet,每个servlet对象数据库中的一张表,那么servlet的数量非常,也容易开发功能.
BaseServlet实现分析:
二、封装BaseServlet
package com.hotdas.travel.web.servlet;
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;
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("service 已经运行...");
//1.获取请求路径
String requestURI = request.getRequestURI();// /travel/user/add ...
//2.获取方法名
String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1);
System.out.println("methodName="+methodName);
//3.让调用的servlet执行它自已该方法
//谁调用谁是this
System.out.println(this);
try {
//获取调者的方法
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//暴力反射
//method.setAccessible(true);
//通过反射调用方法
method.invoke(this,request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、修改请求路径和UserServlet
创建UserServlet
package com.hotdas.travel.web.servlet;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hotdas.travel.domain.ResultInfo;
import com.hotdas.travel.domain.User;
import com.hotdas.travel.service.UserService;
import com.hotdas.travel.service.impl.UserServiceImpl;
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.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/user/*")
public class UserServlet extends BaseServlet{
UserService userService = new UserServiceImpl();
public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String check = request.getParameter("check");
//从session中获取验证码
String checkcode_server = (String)request.getSession().getAttribute("CHECKCODE_SERVER");
//删除session
request.getSession().removeAttribute("CHECKCODE_SERVER");
if (checkcode_server!=null && !checkcode_server.equalsIgnoreCase(check)){
//验证码有误 封装返回的数据对象
ResultInfo info = new ResultInfo();
//注册失败
info.setErrorMsg("验证码有误!");
info.setFlag(false);
ObjectMapper objectMapper = new ObjectMapper();
String valueAsString = objectMapper.writeValueAsString(info);
//设置编码和类型
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(valueAsString);
return;
}
//获取所有表单的数据
Map<String, String[]> parameterMap = request.getParameterMap();
//封装user对象
User user = new User();
try {
BeanUtils.populate(user,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//调用service
UserService userService = new UserServiceImpl();
Boolean flag = userService.regirst(user);
//验证码有误 封装返回的数据对象
ResultInfo info = new ResultInfo();
if (flag){
//注册用户成功
info.setFlag(true);
}else{
//注册用户失败
//注册失败
info.setErrorMsg("注册失败!");
info.setFlag(false);
}
ObjectMapper objectMapper = new ObjectMapper();
String valueAsString = objectMapper.writeValueAsString(info);
//设置编码和类型
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(valueAsString);
}
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String check = request.getParameter("check");
String checkcode_server = (String)request.getSession().getAttribute("CHECKCODE_SERVER");
request.getSession().removeAttribute("CHECKCODE_SERVER");
//4.提示登录信息
ResultInfo info = new ResultInfo();
if (checkcode_server!=null && !"".equals(checkcode_server)){
if (!check.equalsIgnoreCase(checkcode_server)){
info.setFlag(false);
info.setErrorMsg("验证码有误");
ObjectMapper objectMapper = new ObjectMapper();
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
objectMapper.writeValue(response.getOutputStream(),info);
return;
}
}
//1.获取表单的数据
Map<String, String[]> parameterMap = request.getParameterMap();
//2.封装数据到user
User user = new User();
try {
BeanUtils.populate(user,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3.调用service完成登录
UserService userService = new UserServiceImpl();
User u = userService.login(user);
if (u==null){
//用户名和密码有误
info.setFlag(false);
info.setErrorMsg("用户名和密码有误");
}
//5.判断用户是否激活
if (u!=null && !"Y".equals(u.getStatus())){
//用户没有激活
info.setFlag(false);
info.setErrorMsg("您尚未激活,请进行邮箱激活!");
}
if (u!=null && "Y".equals(u.getStatus())){
//登录成功后,用户信息保存在session中
request.getSession().setAttribute("user",u);
//登录成功
info.setFlag(true);
}
ObjectMapper objectMapper = new ObjectMapper();
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
objectMapper.writeValue(response.getOutputStream(),info);
}
public void active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//进行邮箱激活
String code = request.getParameter("code");
if (code!=null){
UserService userService = new UserServiceImpl();
Boolean flag = userService.activeUser(code);
//提示信息
String msg = "";
if (flag){
//激活
msg="激活成功,请<a href='/travel/login.html'>登录</a>";
}else{
//激活夫败
msg="激活失败,请联系管理员!";
}
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(msg);
}
}
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session进行销毁
request.getSession().invalidate();
//跳转到登录页面
response.sendRedirect(request.getContextPath()+"/login.html");
}
public void findUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = (User)request.getSession().getAttribute("user");
if (user!=null){
ObjectMapper objectMapper = new ObjectMapper();
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
String userStr = objectMapper.writeValueAsString(user);
response.getWriter().write(userStr);
}
}
}
修改路径
1.修改UserServiceImpl
//发送邮箱给用户让用户进激活,后面doing...
String content = "<a href='http://localhost/travel/user/active?code="+user.getCode()+"'>点击激活卓越旅游网</a> ";
MailUtils.sendMail(user.getEmail(),content,"请激活你的卓越旅游网用户");
2.修改header.html
$.post("user/findUser",{},function (data) {
var msg = "欢迎回来,"+data.name;
<a href="myfavorite.html" class="collection">我的收藏</a>
<a href="javascript:location.href='user/exit';">退出</a>
3.修改login.html
//ajax提交数据
$.post("user/login",$("#loginForm").serialize(),function (data) {
4.修改register.html
//表单数据合法 username=xxx&passwrod=xxx
$.post("user/add",$(this).serialize(),function (data) {
四、解决CSS样式的显示问题
修改header.html
<script>
$(function () {
$.post("user/findUser",{},function (data) {
if (data.name!="undefined" && data.name!=null){
var msg = "欢迎回来,"+data.name;
$("#span_username").html(msg);
$(".login").css("display","block");
}else{
$(".login").css("display","none");
}
});
});
</script>
五、测试
封装后的功能是否能使用
六、遇到的bug
1.邮箱激活,激活不成功
解决方法加上端口号