杨老师课堂之Servlet的抽取为BaseServlet设计

简介: 杨老师课堂之Servlet的抽取为BaseServlet设计


在初学Servlet的时候,我们会频繁的创建多个Servlet。

甚至有些同学会把一个功能的增删改查、注册、登陆、注销模块都进行单独设计为一个Servlet。因此,会导致项目有非常多的Servlet存在。

本章节就是为了简化Servlet的创建,同时满足以上功能。

思路解析:
Servlet的生命周期

我们首先要了解一下Servelt的生命周期:

  • Servlet是一个接口:
  • 其中又包含了五个方法,分别是init() 、service()、destory()、servletConfig()、servletContext().


  • Servlet的生命周期是先进行初始化(仅会初始化一次),而后调用service(),在service方法,有两个参数,分别是ServletRequest和ServletResponse.
  • 关联源代码进行查看:

了Servlet的是一个接口,所以没有具体的方法,随后我们将要查看Servlet的子类GenericServlet代码:

通过查看之后,我们发现GenericServlet中依旧没有写清楚service()的具体实现,我们觉得查询最后一个实现类,即HttpServlet


根据上图,我们得知在HttoServlet中覆写了service方法,将继承的两个参数转为HttpServletRequest 和HttpServletResponse,并且对service()方法进行了方法重载 。

随后在里面通过String method = req.getMethod();接受了前台所提交的方式。并且对Http的七种提交方法进行了判断。其中包括我们常用的doGet方法和doPost方法

  • 也就是说:service()会自动地匹配前台提交的方法。我们只需要去处理所提交得方法名称即可.
思路配图:

代码演示:

首先创建项目,项目名称为smallTools,采用的工具是MyEclipse

接下来Servlet,命名为BaseServlet,前提是需要继承HttpServlet

一共四行代码!

创建 BaseServlet
package cn.javabs.smalltools.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 
 * @author Mryang
 *
 */
public class BaseServlet extends HttpServlet {

  @Override
  public void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    //获取路径  本项目获取到的是smallTools/servlet/UserServlet/add
    String uri = request.getRequestURI();
    
    // 具体内容可以进行打印输出
    System.out.println("uri: "+uri);
    
    // 目的是为了获取add三个字母,可以进行截取uri
    //uri.lastIndexOf('/') 是获取‘/’在uri最后一次出写的位置
    // 另外substring()该方法的规律是 包含开头索引位置、但不包括结束索引位置,有不想要‘/’,因此要在截取后的索引值上+1
    String methodName = uri.substring(uri.lastIndexOf('/')+1);// methodName 就是截取后的  add
    
    try {
      // this指的是谁调用、谁就是this 那么this.getClass()是采用反射机制获取调用的类名称
      // 举例:如果是UserServlet继承了BaseServlet 那么UserServlet就是调用的类,也就是UserServlet的字节码 = this.getClass() 
      Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);

        // invoke方法:调用包装在当前Method对象中的方法
        method.invoke(this,request,response);
      
    } catch (Exception e) {
      throw new RuntimeException(e);
    } 
  }
}

在接下来,创建BookServlet 前提是继承BaseServlet

创建 BookServlet
package cn.javabs.smalltools.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 
 * @author Mryang
 * 以下方法书写技巧是: 在原有的doGet或doPost方法上,
 * 只需要将doGet单词换为addBook、findBook等等即可
 */
public class BookServlet extends BaseServlet {

  /**
   * 添加图书模块
   * @param request
   * @param response
   * @throws ServletException
   * @throws IOException
   */
  public void addBook(HttpServletRequest  request, 
            HttpServletResponse response)
            throws ServletException, IOException {
    
    String name = request.getParameter("name");
    // 通过输出的结果来检验get方式和post方式 是都可以接受的到!
    System.out.println("这个是BookServlet中的addBook方法"+name);
  }

  /**
   * 查询图书模块
   * @param request
   * @param response
   * @throws ServletException
   * @throws IOException
   */
  public void findBook(HttpServletRequest  request, 
            HttpServletResponse response)
            throws ServletException, IOException {
    System.out.println("这个是BookServlet中的findBook方法" );
  }
  
  /**
   * 删除图书模块
   * @param request
   * @param response
   * @throws ServletException
   * @throws IOException
   */
  public void delBook(HttpServletRequest  request, 
            HttpServletResponse response)
            throws ServletException, IOException {
    System.out.println("这个是BookServlet中的delBook方法" );
  }
  
  /**
   * 编辑图书模块
   * @param request
   * @param response
   * @throws ServletException
   * @throws IOException
   */
  public void editBook(HttpServletRequest  request, 
            HttpServletResponse response)
            throws ServletException, IOException {
    System.out.println("这个是BookServlet中的editBook方法" );
  }
  
  /**
   * 图书数据回显模块
   * @param request
   * @param response
   * @throws ServletException
   * @throws IOException
   */
  public void editBookView(HttpServletRequest  request, 
            HttpServletResponse response)
            throws ServletException, IOException {
    System.out.println("这个是BookServlet中的editBookView方法" );
  }

}

千万不要忘记进行修改web.xml文件

修改 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  
  <display-name>Servlet的抽取为BaseServlet设计</display-name>
  
  <servlet>
    <servlet-name>BaseServlet</servlet-name>
    <servlet-class>cn.javabs.smalltools.servlet.BaseServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>BaseServlet</servlet-name>
    <url-pattern>/servlet/BaseServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>BookServlet</servlet-name>
    <servlet-class>cn.javabs.smalltools.servlet.BookServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>BookServlet</servlet-name>
    <url-pattern>/servlet/BookServlet/*</url-pattern>
  </servlet-mapping>  
  
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

最后通过jsp页面进行测试即可
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

/* 将basePath存储到pageContext作用域中 */

pageContext.setAttribute("basePath", basePath);

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>测试</title>

  </head>
  
  <body>
      <h4>测试使用post方式提交</h4>
      <form action="${basePath}servlet/BookServlet/addBook" method="post" >
        <input type="text"  name="name" >
        <input type="submit" >
      </form>
      
  <hr color="deepskyblue"><!-- 这是一个水平线 -->
  
      <h4>测试使用get方式提交</h4>
      <form action="${basePath}servlet/BookServlet/addBook" method="get" >
        <input type="text"  name="name" >
        <input type="submit" >
      </form>
      
  <hr color="deepskyblue"><!-- 这是一个水平线 -->
  
  <a href="${basePath}servlet/BookServlet/findBook">点击是去寻找findBook方法</a>

  <br/><br/>  
      
      注意:“$ {basePath} =${basePath}”代表的是 项目的绝对路径!!!前面的$后故意加一个空格
  </body>
</html>

网页效果图:

测试

分别进行提交

首先是post ,我们提交字母abc数据

然后是get ,我们提交字母xyz数据

访问地址如下:

结果:

通过测试得知,service方法中是可以自动匹配提交方式的。

最后测试标签a链接的查询图书方法。

访问地址:

结果

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

目录
相关文章
|
12天前
|
前端开发 JavaScript
杨校老师课堂之基于Servlet整合JQuery中的Ajax进行表单提交[基于IDEA]
杨校老师课堂之基于Servlet整合JQuery中的Ajax进行表单提交[基于IDEA]
19 0
杨校老师课堂之基于Servlet整合JQuery中的Ajax进行表单提交[基于IDEA]
|
12天前
杨校老师课堂之封装工具类【时间工具类|类型转换器|客户端Servlet工具类】
杨校老师课堂之封装工具类【时间工具类|类型转换器|客户端Servlet工具类】
11 0
|
12天前
杨校老师课堂之Servlet的重构为BaseServlet的步骤【内含视频讲解】
杨校老师课堂之Servlet的重构为BaseServlet的步骤【内含视频讲解】
10 0
|
9天前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
|
9天前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
|
9天前
|
缓存 小程序 前端开发
Java服务器端技术探秘:Servlet与JSP的核心原理
【6月更文挑战第23天】Java Web开发中的Servlet和JSP详解:Servlet是服务器端的Java小程序,处理HTTP请求并响应。生命周期含初始化、服务和销毁。创建Servlet示例代码展示了`doGet()`方法的覆盖。JSP则侧重视图,动态HTML生成,通过JSP脚本元素、声明和表达式嵌入Java代码。Servlet常作为控制器,JSP处理视图,遵循MVC模式。优化策略涉及缓存、分页和安全措施。这些技术是Java服务器端开发的基础。
|
9天前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。
|
9天前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
|
9天前
|
缓存 负载均衡 安全
Servlet与JSP在Java Web应用中的性能调优策略
【6月更文挑战第23天】在Java Web中,Servlet和JSP调优至关重要,以应对高并发和复杂业务带来的性能挑战。优化包括Servlet复用、线程安全、数据库连接池,以及JSP的编译优化、使用JSTL、页面缓存和静态内容分离。全局优化涉及负载均衡、异步处理和缓存策略。通过这些实践,开发者能提升应用响应速度和吞吐量,确保高负载下的稳定运行。
|
9天前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。