利用反射优化Servlet抽象出父类BaseServlet
在编写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);
} }
利用反射优化Servlet抽象出父类BaseServlet的更多相关文章
- 如何利用反射简化Servlet操作
如何利用反射简化Servlet操作 一.反射的实现 新建类BaseServlet,继承HttpServlet(不需要在web.xml文件中配置) 1.在doPost()方法中处理请求乱码,并调用d ...
- 利用反射实现Servlet公共类的抽取
一次请求的执行过程: 请求:发送请求地址-->到达web.xml中,找到地址对应的servlet类-->通过反射调用该类的构造函数,创建该servlet类的对象-->通过当前对象调用 ...
- 优化Servlet:(利用反射的思想)
1.创建BaseServlet (重写父类的service方法) package com.learning.web.servlet; import java.io.IOException; impor ...
- BaseServlet优化Servlet,实现类似struts2的一些简单效果
package cn.itcast.web.servlet; import java.io.IOException; import javax.servlet.ServletException; im ...
- 自定义BaseServlet利用反射
比较完美一点的BaseServlet package com.yangwei.mvc.servlet; import java.io.IOException; import java.lang.ref ...
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- Atitit利用反射获取子类 集合 以及继承树
Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回 ...
随机推荐
- Java——容器(Map)
[Map接口]
- HDU-6709 Fishing Master
Description Heard that eom is a fishing MASTER, you want to acknowledge him as your mentor. As every ...
- AGC030F - Permutation and Minimum
https://atcoder.jp/contests/agc030/tasks/agc030_f 题解 我们先把这个排列从\(1 \sim 2n\)表达出来,然后题面中的每一对数我们可以用一条线把他 ...
- E. You Are Given Some Strings...
E. You Are Given Some Strings... AC自动机 求一个串$t$中包含子串$s_{i}+s_{j}$的个数. 可以正反跑两遍AC自动机 正着跑,表示$s_{i}$结束,反正 ...
- Java Interger类,两对整数明明完全一样,为何一个输出true,一个输出false
package text; public class MethodOverload { public static void main(String[] args) { Integer i1=100; ...
- [BZOJ4558]:[JLoi2016]方(容斥+模拟)
题目传送门 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有$(N+1)\times ...
- HTML canvas中translate()与rotate()的理解
首先,当我们在页面上初始化canvas时,相当于在上面放了一块画布,这块画布我们可以理解为上面有一个坐标系(如下图),左上角是原点,往右是X轴的正方向,往下是Y轴的正方向,我们在画布上绘制的内容都是基 ...
- VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 虚拟磁盘数据的传输方式 Transport Methods VixDiskLib_ListTransportModes 枚举支持的传输模式 Vi ...
- curl发json
linux 模拟post请求 curl -X POST \ -H "Content-Type: application/json" \ -H "token:GXJP1cl ...
- MySQL 修改密码,
ALTER USER 'root'@'localhost' IDENTIFIED BY 'admin';