使用BaseServlet提高Servlet的代码复用性
程序员文章站
2022-05-08 13:16:19
...
- 第一次接触这种设计思路,首先,设置一个BaseServlet,它继承HttpServlet.
- 在BaseServlet里面doGet方法中,获取request中的method字段,通过反射执行这个方法,具体代码实现,可以看
- 其他的Servlet都继承BaseServlet,因为继承BaseServlet,不需要重写doGet方法,所以将自动创建的所有东西删除即可,然后在里面创建实现各种功能的方法.
- 前端页面在传入数据的时候,在相关Servlet的url后面跟上”?method=XXX”,XXX即为需要调用的方法,这样相关继承了BaseServlet的Servlet就可以通过BaseServlet中的doGet方法,反射执行相关方法了.
- 所有方法的返回值是String,即为请求转发的绝对路径,因为BaseServlet中抽取了请求转发,如果不需要请求转发,比如不需要传数据回网页,或使用AJAX传数据的时候,返回值为null即可
- 关于权限的说明等另一篇文章写到这里的时候一起补充吧
package com.cuixiaoming.web.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.anno.Power;
import cn.itcast.domain.User;
/**
* Servlet implementation class BaseServlet
*/
public class BaseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、获取超链接提交的method参数,如果 add 就是添加 如果是 del 就是删除 .....
String methodName = request.getParameter("method");// register
// 如果客户端没有提交 method 参数,为他设置一个 默认值
if (methodName == null) {
methodName = "doDefault";
}
// 2、判断并分别执行
// 使用反射根据 methodName 获取到对应的 方法的 Method 对象
Class clazz = this.getClass();// 获取该 Servlet 自己的反射对象
try {
//参数1:方法名; 其他参数:方法的参数
Method m = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//权限相关,判断有有没有注解 Power 如果有,查看session 中是否有 user,有,正常执行,没有直接跳转到 login.jsp
boolean flag = m.isAnnotationPresent(Power.class);
if(flag){//有权限验证的注解
User user = (User)request.getSession().getAttribute("user");
if(user == null){//没有登陆
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
}
// 执行方法: 方法.invoke(对象,参数列表); == 对象.方法(参数列表)
String path = (String) m.invoke(this, request, response);
// 方法没有返回值,反射执行获取的是 null
if (path != null) {
request.getRequestDispatcher(path).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 执行默认操作的方法
*
* @param request
* @param response
* @return
*/
public String doDefault(HttpServletRequest request, HttpServletResponse response) {
// 根据自己需求编写实现
System.out.println("默认实现.....");
return null;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
上一篇: Javaweb-xml基础3(学习笔记)
下一篇: baseServlet的工具类