11-GenericServlet

Posted 念念念北

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11-GenericServlet相关的知识,希望对你有一定的参考价值。

适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

1. 我们编写一个 Servlet 类直接实现 Servlet 接口有什么缺点?

我们只需要 service 方法,其他方法大部分情况下是不需要使用的。代码很丑陋。

2. 适配器设计模式 Adapter

适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

手机直接插到 220V 的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充电器就是一个适配器。手机连接适配器。适配器连接 220V 的电压。这样问题就解决了。

3. 编写一个 GenericServlet 类,这个类是一个抽象类,其中有一个抽象方法 service。

  • GenericServlet 实现 Servlet 接口。
  • GenericServlet 是一个适配器。
  • 以后编写的所有 Servlet 类继承 GenericServlet,重写 service 方法即可。

4. 思考:GenericServlet 类是否需要改造一下?怎么改造?更利于子类程序的编写?

4.1 思考第一个问题:我提供了一个 GenericServlet 之后,init 方法还会执行吗?

还会执行。会执行 GenericServlet 类中的 init 方法。

控制台上打印的结果为:

4.2 思考第二个问题:init 方法是谁调用的?

Tomcat 服务器调用的。

4.3 思考第三个问题:init 方法中的 ServletConfig 对象是谁创建的?是谁传过来的?

  • 都是 Tomcat 干的。
  • Tomcat 服务器先创建了 ServletConfig 对象,然后调用 init 方法,将 ServletConfig 对象传给了 init 方法。

4.3 思考一下 Tomcat 服务器伪代码:

public class Tomcat 
    public static void main(String[] args)
        // .....
        // Tomcat服务器伪代码
        // 创建LoginServlet对象(通过反射机制,调用无参数构造方法来实例化LoginServlet对象)
        Class clazz = Class.forName("com.bjpowernode.javaweb.servlet.LoginServlet");
        Object obj = clazz.newInstance();

        // 向下转型
        Servlet servlet = (Servlet)obj;

        // 创建ServletConfig对象
        // Tomcat服务器负责将ServletConfig对象实例化出来。
        // 多态(Tomcat服务器完全实现了Servlet规范)
        ServletConfig servletConfig = new org.apache.catalina.core.StandardWrapperFacade();

        // 调用Servlet的init方法
        servlet.init(servletConfig);

        // 调用Servlet的service方法
        // ....

    

使用GenericServlet实例

使用GenericServlet实例


package com.kettas.servlet;

import javax.servlet.* ;

import java.io.* ;

public class GenDateServlet extends GenericServlet{

    @Override

    public void service( ServletRequest request , ServletResponse response )

        throws ServletException ,IOException

    {             response.setContentType( "text/html" ) ; // 设置响应内容类型

             PrintWriter out = response.getWriter();// 获得文本写入流

             // 给客户端回应的html文本

             out.println( "<html>" ) ;

             out.println( "<body>" ) ; 

             out.println( "<h1>Hello Servlet !</h1>" );

             out.println( "</body>" ) ;

             out.println( "</html>" ) ; 

             out.flush();// 刷新写入

    }

}

配置文件web.xml如下:


<?xml version="1.0" encoding="UTF-8"?>

<web-app 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"

   version="2.5">         

    // Servlet文件路径

    <servlet> 

        <servlet-name>query</servlet-name>

        <servlet-class>com.kettas.servlet.GenDateServlet</servlet-class>

    </servlet>       

    // 指定映射,说明在浏览器中输入".../query"则对应当前Servlet                              

    <servlet-mapping> 

        <servlet-name>query</servlet-name>

        <url-pattern>/query</url-pattern>

    </servlet-mapping>

</web-app>

以上是关于11-GenericServlet的主要内容,如果未能解决你的问题,请参考以下文章