在编写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. sublime格式化

    https://nodejs.org/dist/v6.2.0/node-v6.2.0-x64.msi sublime格式化

  2. SpringBoot整合MongoDb(二)

    构建项目及配置 pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</ ...

  3. 全球DC主机交流

    全球DC主机交流https://www.globaldc.cn/ 全球DC主机交流论坛是一个综合性的国内服务器.国外服务器.高防清洗.硬件服务器交流论坛,主要为网友提供IP地址鉴定主机商,全球独立服务 ...

  4. 蒙特卡洛(Monte Carlo)方法求面积

    如图,刷微博时,看到一个问题,第一个想到的就是用蒙特卡洛方法求解,当时正在练python,于是尝试用python编写程序. import random # 先求s1 k=0 n=100000000 f ...

  5. shell中的=~的简单用法

    其中 ~ 其实是对后面的正则表达式表示匹配的意思,如果匹配就输出1, 不匹配就输出0 [[ $test =~ ^[0-9]+ ]] && echo 1 || echo 0

  6. TypeScript快速笔记(二)

    1) TypeScript中的判断语句,可以使用非0值代表true.如: function add1(a: number, b?:number): number{ // 注意b是可选参数 consol ...

  7. MySQL主从复制之半同步模式

    MySQL主从复制之半同步模式 MySQL半同步介绍: 一般情况下MySQL默认复制模式为异步,何为异步?简单的说就是主服务器上的I/O threads 将binlog写入二进制日志中就返回给客户端一 ...

  8. 网络流小记(EK&dinic&当前弧优化&费用流)

    欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...

  9. URL里的分号';'一定要编码为%3b!!!!

    http://en.wikipedia.org/wiki/Query_string The series of pairs is separated by the ampersand, '&' ...

  10. fedora23安装php,mysql

    httpd: 他的服务器根: ServerRoot, 是在/etc/httpd. 因为httpd所有的配置文件, 运行文件等都在这里.所以这是他的根. httpd的配置文件: httpd.conf恰好 ...