BaseServlet详解
BaseServlet是通过重写Servlet的service()方法,以达到可以控制所有Servlet的目的,同时简化了Servlet的一些操作。
●为什么要重写service()方法?
因为客户端向服务端发送的每一次请求,服务器都会调用service()方法,重写它可以控制所有的请求。
●service()可以写什么?
Servlet中常有的对象(比如session)可以在service()中进行获取。
●BaseServlet的主要作用是什么?
BaseServlet主要完成对当前类中的方法进行调用的操作(因为不知道当前类中以后会有哪些方法,所以就要用到反射机制,以后BaseServlet的子类中不管有什么样的方法,都可以被当前类所调用)。
BaseServlet
可以将Servlet都需要用的东西在BaseServlet中创建并初始化,当然BaseServlet最大的功能是:能够使子类增删方法,而不需要修改BaseServlet源代码。
@WebServlet(name = "BaseServlet",urlPatterns = "/base")
public class BaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String methodName = request.getParameter("methodName");
try {
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
if (null != method) {
//处理返回值,为了资源跳转
String returnValue = (String) method.invoke(this,request,response);
System.out.println(returnValue);
//有的方法有返回值
//登录成功:重定向 redirect:/day61/user?methodName=showIndex
//登录失败: 请求转发 forward:/login.html
//有的方法没有返回值
//null,不用做任何处理
if (returnValue != null){
//有返回值,实现资源跳转,需要资源的路径
if (returnValue.lastIndexOf(":") != -1) {
String path = returnValue.split(":")[1];
System.out.println("path : "+path);
//有":"
//实现资源跳转:重定向、请求转发
if (returnValue.startsWith("redirect")) {
//重定向
response.sendRedirect(request.getContextPath()+path);
} else if(returnValue.startsWith("forward")){
//请求转发
request.getRequestDispatcher(path).forward(request,response);
}
} else {
//没有":",默认就是转发 /login.html
request.getRequestDispatcher(returnValue).forward(request,response);
}
} else {
//不做任何处理
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
UserServlet
将user模块所有方法写在一个Servlet类中
@WebServlet(name = "UserServlet",urlPatterns = "/user")
public class UserServlet extends BaseServlet {
public void login(HttpServletRequest request,HttpServletResponse response){
String username = request.getParameter("username");
String password = request.getParameter("password");
User inputUser = new User();
inputUser.setUsername(username);
inputUser.setPassword(password);
UserDao userDao = new UserDaoImpl();
try {
User existUser = userDao.login(inputUser);
if (null == existUser) {
//登录失败
request.getRequestDispatcher("/login.html").forward(request,response);
} else {
//登录成功
request.getSession().setAttribute("existUser",existUser);
response.sendRedirect("/day61/user?methodName=showIndex");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void showIndex(HttpServletRequest request , HttpServletResponse response) throws Exception {
System.out.println("showIndex");
User existUser = (User) request.getSession().getAttribute("existUser");
StringBuffer responseBody = new StringBuffer();
if (null != existUser) {
//在登录状态
responseBody.append("欢迎回来~~~"+existUser.getUsername());
responseBody.append("<a href='/day61/user?methodName=logout'>注销登录</a>");
} else {
//不在登录状态
responseBody.append("您还没有登录;");
responseBody.append("<a href='/day61/login.html'>请登录</a>");
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(responseBody.toString());
}
public void logout(HttpServletRequest request , HttpServletResponse response) throws Exception {
request.getSession().invalidate();
response.sendRedirect("/day61/login.html");
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>hello jsp</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/UserServlet?method=login" method="POST">
<input type="text" name="username">
<input type="submit" value="登录">${session_username}
</form><br/>
<form action="${pageContext.request.contextPath}/UserServlet?method=find" method="POST">
<input type="text" name="findname">
<input type="submit" value="查询">${request_findname}
</form>
</body>
</html>
模板
public interface Constants {
// 这里有/,servlet类中不需要/
String FORWARD = "forward:/";
String REDIRECT = "redirect:/";
}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "ExtendBaseServlet", urlPatterns = "/extend")
public class ExtendBaseServlet extends BaseServlet {
public String method(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return "转发Constants.FORWARD 重定向Constants.REDIRECT";
// 接口中有/ 方法中不需要/
}
}