利用反射优化Servlet抽象出父类BaseServlet
2024-10-07 10:19:18
在编写servlet的时候发现每个servlet里面的doPost方法都如:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
而在doGet方法中大多是对uri的跳转
(通过在uri后面加上method参数可以定位到不同的方法,这样就可以少写一些servlet了)
如果新增模块,则该模块的Servlet中也同样包含相同的代码,因此,代码过度冗余,需要优化。
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取客户端请求的方法名
String methodName = request.getParameter("method");
//根据名称判断调用的方法
if("categoryList".equals(methodName))
{
categoryList(request,response);
}else if("index".equals(methodName))
{
index(request,response);
}else if("productInfo".equals(methodName))
{
productInfo(request,response);
}else if("productList".equals(methodName))
{
productList(request,response);
}
}
抽象出父类BaseServlet,并且在BaseServlet中使用反射机制实现方法的调用
public class BaseServlet extends HttpServlet {
private static final long serialVersionUID = 7978401768598506854L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取方法名
String methodName = request.getParameter("method");
//2.得到请求Servlet的字节码
Class clazz = this.getClass();
try {
//3.根据字节码和方法名获取方法对象 所有方法参数均为HttpServletRequest和HttpServletResponse类型
Method method = clazz.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.setAccessible(true); //设置方法均直接访问
//4.调用method方法,实现其中的功能
method.invoke(this, request, response);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}}
然后再写servlet就只用写具体的方法就行了
@WebServlet("/user")
@SuppressWarnings("unused")
public class UserServlet extends BaseServlet {
private static final long serialVersionUID = 7665438418738590582L; private UserService userService = new UserServiceImpl(); //安全退出
private void logout(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().invalidate();
//涉及 - cookie - 清除cookie
response.sendRedirect(request.getContextPath() + "/index");
} //用户登录
private void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
//自动登录 - 记住用户名 User user = userService.login(username, password);
if(user != null) { //成功
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath() + "/index");
} else {
request.setAttribute("info", "用户名或密码错误!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
}
} //email - 账号激活
private void active(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String activeCode = request.getParameter("activeCode");
userService.active(activeCode);
request.setAttribute("info", "账号激活成功, 请登录!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
} /**
* @Title: register
* @Description: 用户注册
*/
private void register(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//调用service
Map<String, String[]> paramMap = request.getParameterMap();
userService.register(paramMap); //跳转至首页|登录页面
request.getRequestDispatcher("/WEB-INF/jsp/registerSuccess.jsp").forward(request, response);
} }
最新文章
- Javascript闭包和C#匿名函数对比分析
- 解密jQuery内核 DOM操作
- 各种解析漏洞获取Webshell
- 必须掌握的八个cmd 命令
- DirectX12 Samples 学习笔记 – PredicationQueries
- Qt之窗口动画(下坠、抖动、透明度)
- Android之Handler探索
- Qt学习笔记-1 开发环境建立
- PC-改变电脑的CPU,内存,硬盘大小!
- hdu 5671 矩阵变换
- 正式学习React (七) react-router 源码分析
- UILabel头文件常见属性
- 异常 ORA-00257: archiver error. Connect internal only, until freed
- JavaScript中的数据结构及实战系列(1):队列
- Spring 极速集成注解 redis 实践
- JAVA监听器Listener
- BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)
- 转载自(http://snailz.diandian.com/post/2012-10-24/40041265730)
- Portal for ArcGIS 10.2.2更改域名和导入自定义证书
- 内网集群准同步shell脚本
热门文章
- css语法以及css选择器
- 【转】解决ajax跨域问题的5种解决方案
- 3D Computer Grapihcs Using OpenGL - 09 Enable Depth Test
- uploadify上传插件参数的一些设置
- ES6 模板语法和分隔符
- postgresql获取表最后更新时间(通过发布订阅机制将消息发送给应用程序)
- Oracle JET(三)Oracle JET 响应布局
- MySQL的性能指标计算和优化方法
- /etc/init.d# ./redis-server start
- leetcode 695 Max Area of Island 岛的最大面积