0
点赞
收藏
分享

微信扫一扫

Servlet学习日记5——Servlet核心接口与类

Ichjns 2022-02-09 阅读 56

目录

一、Servlet 核心接口和类

1.1 Servlet 接口

1.2 GenericServlet抽象类

1.3 HttpServlet类(推荐使用这个)

1.4 注意

二、servlet的两种配置方式

2.1 配置 web.xml(Servlet2.5之前使用)

2.2 使用注解(Servlet3.0之后支持,推荐使用)


一、Servlet 核心接口和类

在Servlet体系结构中,除了实现 Servlet 接口,还可以通过继承 GenericServlet 或 HttpServlet 类,完成编写。

1.1 Servlet 接口

在Servlet API中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。

该接口包括以下五个方法:

init(ServletConfig config)

ServletConfig getServletConfig()

service(ServletRequest req,ServletResponse res)

String getServletInfo()

destroy()

1.2 GenericServlet抽象类

GenericServlet 使编写 Servlet 变得更容易。它提供生命周期方法 init 和 destory 的简单实现,要编写一般的 Servlet,只需重写抽象 Servlet 方法即可

1、抽象类源码:

 

 

 

service是抽象方法,子类必须重写

2、继承抽象类写法:

package com.ha.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class GenServlet extends GenericServlet {
    
    public void service(ServletRequest ServletRequest, ServletResponse ServletRespense) throws IOException {
        System.out.println("hello world");
    }
}

3、配置文件增加两行:

4、运行

1.3 HttpServlet类(推荐使用这个)

httpServlet是继承GenericServlet的基础上进一步的拓展。

提供将要被子类化以创建适用于web站点的 HTTP servlet 的抽象类。HttpServlet的子类至少必须重写一个方法,该方法通常是以下这些方法之一:

        doGet,如果 servlet 支持 HTTP GET 请求

        doPost,用于 HTTP POST 请求

        doPut,用于 HTTP PUT 请求

        doDelete,用于 HTTP DELETE 请求

1、抽象类源码

 抽象类进行了重写,给不同的处理方式,进行不同的请求

 

2、代码

因为有中文,所以在cmd命令行编译Java的时候要加上这一句话 -encoding utf8

package com.ha.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpsServlet extends HttpServlet {
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        System.out.println("hello HttpsServlet");
    }

    /*
     * HttpsServlet要求所有的service请求要跟Http协议有关,
     * 下面的普通的service 和 上面的重载的 不同之处有
     *  一、修饰符不同
     *   public是接口提供的
     *   protected是HttpServlet重载的
     *  二、参数列表不同
     *   HttpServletRequest、HttpServletResponse
     *   ServletRequest、ServletResponse
     */
    /* 
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    }
    */
}

3、配置文件增加两行:

4、运行

5、HttpServlet的特点

根据不同的请求方式处理不同的结果

package com.ha.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpsServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是get请求过来的内容");
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是post请求过来的内容");
    }
}

浏览器访问的方式是get,

1.4 注意

配置文件中的名字不能够相同,不然tomcat会报错 

地址配置错误(com.ha.servlet. ...)或者访问的时候输入的URL(.../hss)错误也会报404错误

二、servlet的两种配置方式

2.1 配置 web.xml(Servlet2.5之前使用)

1、配置

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

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true">

  <!--1、添加servlet节点-->
  <servlet>
    <servlet-name>my</servlet-name>
    <servlet-class>com.ha.servlet.myServet</servlet-class> <!--需要执行的class的名字,在包中要加上包名-->
  </servlet>

  <!--2、添加servlet-mapping节点-->
  <servlet-mapping>
    <servlet-name>my</servlet-name> <!--与servlet中的servlet-name是一致的-->
    <url-pattern>/servlet</url-pattern>  <!--浏览器中输入这个表示能访问servlet-name对应的servlet中的myServlet-->
  </servlet-mapping>


  <servlet>
    <servlet-name>gs</servlet-name>
    <servlet-class>com.ha.servlet.GenServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>gs</servlet-name>
    <url-pattern>/gs</url-pattern>
  </servlet-mapping>


  <servlet>
    <servlet-name>hs</servlet-name>
    <servlet-class>com.ha.servlet.HttpsServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>hs</servlet-name>
    <url-pattern>/hs</url-pattern>
  </servlet-mapping>

</web-app>

2、url-pattern定义匹配规则,取值说明:

精确匹配        /具体的名称        只有url路径是具体的名称的时候才会触发Servlet

后缀匹配        *.xxx                   只要是以.xxx结尾的就匹配出发Servlet

通配符匹配    /*                         匹配所有请求,包含服务器的所有资源

通配符匹配    /                          匹配所有请求,包含服务器的所有资源,不包括.jsp

例1

浏览器中输入:

http://localhost:8080/myweb/abc.action

会执行HttpsServlet.class这个文件

例2

 浏览器中输入:

http://localhost:8080/myweb/[任何内容]

会执行HttpsServlet.class这个文件

如果输入的是gs等精确访问的内容,那么就去执行GenServlet.class这个文件

例3

使用通配符匹配 /,在浏览器中输入:

http://localhost:8080/myweb/aaa.jsp

不会执行对应的.class文件

3、load-on-startup

(1)元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。

(2)它的值必须是一个整数, 表示servlet被加载的先后顺序。

(3)如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。

(4)如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小, servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

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

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true">


  <!--1、添加servlet节点-->
  <servlet>
    <servlet-name>my</servlet-name>
    <servlet-class>com.ha.servlet.myServet</servlet-class> <!--需要执行的class的名字,在包中要加上包名-->
    <load-on-startup>0</load-on-startup>
  </servlet>

  <!--2、添加servlet-mapping节点-->
  <servlet-mapping>
    <servlet-name>my</servlet-name> <!--与servlet中的servlet-name是一致的-->
    <url-pattern>/servlet</url-pattern>  <!--浏览器中输入这个表示能访问servlet-name对应的servlet中的myServlet-->
  </servlet-mapping>


  <servlet>
    <servlet-name>gs</servlet-name>
    <servlet-class>com.ha.servlet.GenServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>gs</servlet-name>
    <url-pattern>/gs</url-pattern>
  </servlet-mapping>


  <servlet>
    <servlet-name>hs</servlet-name>
    <servlet-class>com.ha.servlet.HttpsServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>hs</servlet-name>
    <url-pattern>/hs</url-pattern>
  </servlet-mapping>

</web-app>

 

 

 运行结果:

 注意:这个函数只执行一次

public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("GenServet init");
}

2.2 使用注解(Servlet3.0之后支持,推荐使用)

举报

相关推荐

0 条评论