在编写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);
} }

最新文章

  1. Javascript闭包和C#匿名函数对比分析
  2. 解密jQuery内核 DOM操作
  3. 各种解析漏洞获取Webshell
  4. 必须掌握的八个cmd 命令
  5. DirectX12 Samples 学习笔记 – PredicationQueries
  6. Qt之窗口动画(下坠、抖动、透明度)
  7. Android之Handler探索
  8. Qt学习笔记-1 开发环境建立
  9. PC-改变电脑的CPU,内存,硬盘大小!
  10. hdu 5671 矩阵变换
  11. 正式学习React (七) react-router 源码分析
  12. UILabel头文件常见属性
  13. 异常 ORA-00257: archiver error. Connect internal only, until freed
  14. JavaScript中的数据结构及实战系列(1):队列
  15. Spring 极速集成注解 redis 实践
  16. JAVA监听器Listener
  17. BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)
  18. 转载自(http://snailz.diandian.com/post/2012-10-24/40041265730)
  19. Portal for ArcGIS 10.2.2更改域名和导入自定义证书
  20. 内网集群准同步shell脚本

热门文章

  1. css语法以及css选择器
  2. 【转】解决ajax跨域问题的5种解决方案
  3. 3D Computer Grapihcs Using OpenGL - 09 Enable Depth Test
  4. uploadify上传插件参数的一些设置
  5. ES6 模板语法和分隔符
  6. postgresql获取表最后更新时间(通过发布订阅机制将消息发送给应用程序)
  7. Oracle JET(三)Oracle JET 响应布局
  8. MySQL的性能指标计算和优化方法
  9. /etc/init.d# ./redis-server start
  10. leetcode 695 Max Area of Island 岛的最大面积