本问题没有用到框架,只是单纯的三层架构
首先,先看一下用自定义的继承自HttpServlet的类中过多if-else分支的代码
这样太繁琐了容易乱套。
解决方案:写一个BaseServlet类,继承HttpServletRequest,实现的目标是根据Stringmethod=request.getParameter("method");找到指定的实现方法。
实现过程:当浏览器发送一个请求到UserServlet时,会调用父类BaseServlet类的Get或Post方法,然后都会跳转发到Get方法,根据反射,他就会识别,到底该调用UserServlet中哪一个方法,这样就不用自己写那么多的if-else了
PS:要求你得会java的反射才行,
再PS:用这种方式有要求,就是在前端请求servlet时,要写成这种方式("CartServlet?method=updateCartItem&bookId="+bookId+"&count="+value;路径问题不算)红色字体必须按照这样的格式,注意,由于必须携带参数所以from表单只能是post提交了
package com.thekingqj.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class UserServlet
*/
@WebServlet("/BaseServlet")
public class BaseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String method=request.getParameter("method");
try {
//通过反射获取当前对象的Class对象,再获取该对象中的method(传递过来的方法名称)方法对象,然后执行该方法(并传递参数)
Method method1 = this.getClass().getDeclaredMethod(method, HttpServletRequest.class,HttpServletResponse.class);
method1.invoke(this, request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
然后你的UserServlet就不用再写doGet和doPost了,
package com.thekingqj.servlet;
import java.io.IOException;
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 com.thekingqj.bean.User;
import com.thekingqj.service.UserService;
import com.thekingqj.service.impl.UserServiceImpl;
/**
* Servlet implementation class UserServlet
*/
@WebServlet("/UserServlet")
public class UserServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
private UserService userService=new UserServiceImpl();
/**
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username=request.getParameter("username");
String password =request.getParameter("password");
String contextPath = request.getContextPath();
User user = userService.login(new User(null, username, password, null));
if (user==null) {
request.setAttribute("msg", "用户名不存在或密码错误");
request.getRequestDispatcher("/pages/user/login.jsp").forward(request, response);
}else {
request.getSession().setAttribute("user", user);
response.sendRedirect(contextPath+"/pages/user/login_success.jsp");
}
}
/**
* 注册用户,
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String verify=request.getParameter("verify");
boolean regist = userService.regist(username);
String attribute = (String)request.getSession().getAttribute("KAPTCHA_SESSION_KEY");
System.out.println(verify+" "+attribute);
if(verify!=null&&verify.toLowerCase().equals(attribute.toLowerCase())) {
request.getSession().removeAttribute("KAPTCHA_SESSION_KEY");
if (regist) {
User user=new User(null, username, password, email);
userService.saveUser(user);
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath() + "/pages/user/regist_success.jsp");
} else {
request.setAttribute("msg", "用户名已存在");
request.getRequestDispatcher("/p`ges/user/regist.jsp").forward(request, response);
}
}else {
request.getSession().removeAttribute("KAPTCHA_SESSION_KEY");
request.setAttribute("msg", "验证码错误");
request.getRequestDispatcher("/pages/user/regist.jsp").forward(request, response);
}
}
/**
* 注销当前用户,清除用户的信息
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void loginOut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().removeAttribute("user");
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}