在最开始的时候我们写一个servlet(LoginServlet)对应一个请求(Login.jsp),这样的话就会产生很多的servlet,使其以后维护变得麻烦,所以我们可以考虑将同一类型(Login.jsp,Regist.jsp等等都看作一个用户类)的请求用一个servlet(UserServlet)处理,然后将把关于User的请求封装为一个个的方法(login(),regist()),例如:

public class UserServlet{

  protected void doGet(HttpServletRequest request, HttpServletResponse response){

    String methodName = request.getParameter("method");   //jsp中获取的  <form action="client/UserServlet?method=login" method="post">

    if ("login".equals(methodName )) { //被判断的数据放在后面,这样可以避免发生空指针异常
      login(request, response);
    }else if ("regist".equals(methodName )) {
      regist(request, response);  //调用regist方法
    }

  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response){

    doGet(request, response);  

  }

  protected void login(HttpServletRequest request, HttpServletResponse response) {...}   //登录

  protected void regist(HttpServletRequest request, HttpServletResponse response) {...}  //注册

  ........

写完之后发现,如果有删除用户(delete)的操作,就还需要再增加else if 语句,这样的又有太多的if--else判断语句,因此可以采用反射的技术,动态的获取当前方法的对象调用要执行的方法,所以继续优化:

public class UserServlet{

  protected void doGet(HttpServletRequest request, HttpServletResponse response){

    String methodName = request.getParameter("method");   //jsp中获取的  <form action="client/UserServlet?method=login" method="post">

    try {
      Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
      method.setAccessible(true);
      method.invoke(this, request, response); //因为login、regist方法的有两个参数,分别是request和response
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response){

    doGet(request, response);  

  }

  protected void login(HttpServletRequest request, HttpServletResponse response) {...}   //登录

  protected void regist(HttpServletRequest request, HttpServletResponse response) {...}  //注册

  ........

完毕之后,发现如果有BookServlet,这样的其它一些servlet还需要进行此类的判断,所以可以考虑把上面的doGet(),doPost()提取出来封装成为一个公共的类(假如是BaseServlet),这样的话,有类似操作的servlet都可以继承这个类BaseServlet,因此上面的就可以写成:

  PS:BaseServlet只是一个功能类,不会被访问,所以创建为一个普通的class就行,然后extends HttpServlet。

public class BaseServlet extends HttpServlet {

  //上面的doGet()和doPost()方法

}

public class UserServlet extends BaseServlet{

  protected void login(HttpServletRequest request, HttpServletResponse response) {...}   //登录

  protected void regist(HttpServletRequest request, HttpServletResponse response) {...}  //注册

  ........

}

//如果有BookServlet 等等servlet直接继承BaseServlet即可

-------------------------------------------------------------------------------------------------------------------------------------------------------------

优化servlet的更多相关文章

  1. 利用反射优化Servlet抽象出父类BaseServlet

    在编写servlet的时候发现每个servlet里面的doPost方法都如: protected void doPost(HttpServletRequest request, HttpServlet ...

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

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

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

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

  4. Maven项目- Servlet的抽取和优化 java.lang.NoSuchMethodException 的解决方法

    优化servlet,减少servlet的数量,便于开发与维护.现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,BaseServlet的抽取和优化,相当于在数据库中一张表对应一个 ...

  5. JavaWeb笔记(二)Servlet

    Tomcat目录简介 bin--可执行文件 conf--配置文件 lib--依赖jar包 logs--日志文件 temp--临时文件 webapps--默认项目部署路径 work--存放运行时的数据 ...

  6. Spring容器

    1.Spring简介: a)Spring春天 b)官网:https://spring.io c)设计理念:轮子理念,不要重复创造轮子: d)Spring可以被理解为一个容器,用于管理其他的框架: e) ...

  7. Java Web开发基础(2)-JSP

    上一篇博我粗略的介绍了一下Servlet.粗略是由于博主也刚刚学习这部分的内容,还不是非常懂所以无法讲的非常精细.可是本着二八原则,我还是先继续学习.所以,这篇博客接着JSP的内容.由于.这两个内容关 ...

  8. Springcloud 配置 | 史上最全,一文全懂

    Springcloud 高并发 配置 (一文全懂) 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Spring ...

  9. SpringBoot2.0总结

    与SpringCloud关系 与SpringMVC关系 与JFinal区别 常用注解: @RestController  @EnableAutoConfiguration   @ComponentSc ...

随机推荐

  1. LeetCode-Search in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  2. [转]DB2 load参数

    本文持续更新,LOAD如何提高parallelism.LOAD SHRLEVEL CHANGE的性能提高. =========================== Every once in a wh ...

  3. 微信上传文章素材—ASP.NET MVC从View层传数据到Controller层

    View层: $('#btnNews').click(function() { if (!confirm('确定要提交吗?')) { return; } var frontViewData = []; ...

  4. asp.net教程:GridView导出到Excel或Word文件

    asp.net教程:GridView导出到Excel或Word文件</ br> 在项目中我们经常会遇到要求将一些数据导出成Excel或者Word表格的情况,比如中国移动(我是中国移动用户) ...

  5. 配置点云库PCL时遇到的问题

    配置PCL基本参照PCL中国官网教程 http://www.pclcn.org/study/shownews.php?lang=cn&id=34 配置点云库时遇到的问题(基于win8 64位, ...

  6. android 代码生成selector drawable

    public static StateListDrawable makeSelector(Context context, int idNormal, int idPressed, int idFoc ...

  7. sql 中 left join 的使用

    left join .是以左表为基础,查询右表的值.如果在右表中没用没有数据,则为NULL. 这里有三张表. 线路bs_line:id,name(id主键) 线路段bs_seg:id,l_id,nam ...

  8. linux 安装beyond compare

    安装好后,在终端运行bcompare  就ok

  9. 数据结构与算法(1)支线任务3——Largest Rectangle in Histogram

    题目如下:(https://leetcode.com/problems/largest-rectangle-in-histogram/) Given n non-negative integers r ...

  10. C++11 lambda的理解

    C++11 的 lambda 表达式规范如下: [ capture ] ( params ) mutable exception attribute -> ret { body } (1) [ ...