在最开始的时候我们写一个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. c :set标签的陷阱(未解决)

    三层嵌套的list,第二层解套的时候用Cset标签给设置别名,第一个对象正常使用,第二个对象开始传入内存的地址的值,但是无法获取对象属性

  2. PHP 类中的魔术方法

    定义: PHP类中以两个下画线“__”开头的方法被称为魔术方法. 分类: 例如:构造方法:__construct:析构方法:__destruct:动态重载:__set().__get().__call ...

  3. NewQuant的设计(二)——MatrixComputation的领域分析

    NewQuant的设计——MatrixComputation的领域分析 MatrixComputation是NewQuant中最重要也是最大的一个模块,这个模块的领域分析要从回答几个问题开始. 一.矩 ...

  4. connections

    recv(), recvfrom() http://lxr.free-electrons.com/source/net/socket.c http://grepcode.com/file/reposi ...

  5. C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)

           我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...

  6. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  7. JAVA访问权限

      同一个类 同一个包 不同包的子类 不同包的非子类 Private √       Default √ √     Protected √ √ √   Public √ √ √ √

  8. IOS:Safari不兼容Javascript中的Date问题

    在IOS5以上版本(不包含IOS5)中的Safari浏览器能正确解释出Javascript中的 new Date('2013-10-21') 的日期对象. 但是在IOS5版本里面的Safari解释ne ...

  9. js对中文编码 防止乱码

    //编码 encodeURI(encodeURI(lm.getValueByName("name"))) 解码 decodeURI(date)

  10. Lab_7_Automating_v2.5

    System Operations - Lab 7: Automating Deployments with CloudFormation - 2.5 ======================== ...