在编写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的更多相关文章

  1. 如何利用反射简化Servlet操作

    如何利用反射简化Servlet操作   一.反射的实现 新建类BaseServlet,继承HttpServlet(不需要在web.xml文件中配置) 1.在doPost()方法中处理请求乱码,并调用d ...

  2. 利用反射实现Servlet公共类的抽取

    一次请求的执行过程: 请求:发送请求地址-->到达web.xml中,找到地址对应的servlet类-->通过反射调用该类的构造函数,创建该servlet类的对象-->通过当前对象调用 ...

  3. 优化Servlet:(利用反射的思想)

    1.创建BaseServlet (重写父类的service方法) package com.learning.web.servlet; import java.io.IOException; impor ...

  4. BaseServlet优化Servlet,实现类似struts2的一些简单效果

    package cn.itcast.web.servlet; import java.io.IOException; import javax.servlet.ServletException; im ...

  5. 自定义BaseServlet利用反射

    比较完美一点的BaseServlet package com.yangwei.mvc.servlet; import java.io.IOException; import java.lang.ref ...

  6. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  7. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  8. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  9. Atitit利用反射获取子类 集合 以及继承树

    Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回 ...

随机推荐

  1. mysql 数据库必会题

    Linux运维班MySQL必会面试题100道 (1)基础笔试命令考察 (要求:每两个同学一组,一个口头考,一个上机实战作答,每5个题为一组,完成后换位) 1.开启MySQL服务 2.检测端口是否运行 ...

  2. vue路由传参并跳转页面

    在vue项目中参数的传递可以使用本地缓存或者Vuex,那么vue能不能像小程序一样路由传参呢,显然是可以的而且非常简单 方式一:query传参 //传参 go(){ that.$router.push ...

  3. apiCloud通过ajax获取数据

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. 【bzoj2724】[Violet 6]蒲公英

    *题目描述: *输入: 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 *输出: *样例输入: 6 3 1 2 3 2 1 ...

  5. django FBV +CBV 视图处理方式总结

    1.FBV(function base views) 在视图里使用函数处理请求. url:        re_path('fbv', views.fbv),        # url(r'^fbv' ...

  6. EQS 自定义Context 如何用Testing Pawn 进行测试?

    比如自定义了一个玩家的Context, 那么需要把这个玩家直接放置到场景中 在Context中override Provide Single Actor函数,按类型获取所有的Actor,其中第一个作为 ...

  7. Android CPU使用率:top和dump cpuinfo的不同

    CPU是系统非常重要的资源,在Android中,查看CPU使用情况,可以使用top命令和dump cpuinfo.我记得很久以前,就发现这两者存在不同,初步猜测应该是算法上存在差异.最近需要采集应用C ...

  8. Pap.er 模仿 - 第一天

    最后更新: 2017-12-15 一. 项目初始化 解析对应的资源, 下载Pap.er之后,需要解析里面的资源. 采用如下的方法: http://blog.csdn.net/xuzihai0703/a ...

  9. Model 层

    package com.test.mvp.mvpdemo.mvp.v1.model; import com.test.mvp.mvpdemo.mvp.v1.MainContract; import o ...

  10. 自动化运维工具之Zabbix

    一.部署zabbix 1.配置master节点 准备LAMP环境和zabbix的yum源 # yum install httpd php mariadb-server -y # vim /etc/my ...