天天看点

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

目录

一、Servlet概述

二、Servlet执行过程

三、Servlet生命周期

四、Servlet的创建方式

4.1实现javax.serlvet.Servelt接口

4.2继承javax.servlet.GenericServlet类

4.3继承javax.servlet.http.HttpServlet类

五、Servlet映射

六、Servlet的线程安全

七、Servlet获取配置信息

7.1 ServletConfig

7.2 getInitParameter

八、ServletContext

8.1域对象

8.2获取全局配置信息

8.3获取资源路径

8.4实现请求转发

九、Servlet相关对象

一、Servlet概述

servlet 是运行在Web服务器中的小型 Java 程序(即:服务器端的小应用程序),通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求。

编写一个 servlet 程序主要有以下四步:

  1. 新建java类,实现servlet接口
  2. 修改web.xml文件,给servlet提供一个可访问的URI地址
  3. 部署应用到tomcat服务器
  4. 测试

下面我们写一个小Demo,新建一个java类实现servlet接口,

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet demo");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
           

接着配置web.xml文件,提供可访问的URI地址,

<?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_4_0.xsd"
         version="4.0">
    <!--创建一个servlet实例-->
    <servlet>
        <servlet-name>servletDemo</servlet-name>
        <servlet-class>ServletDemo</servlet-class>
    </servlet>

    <!--给servlet提供(映射)客户端访问的URI-->
    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
</web-app>
           

然后将项目配置到tomcat服务器上,这里我们将项目整个文件夹复制到tomcat安装目录下的webapps中,

然后通过网址:http://localhost:8080/项目名称/url-pattern名称访问,得到控制台输出结果:

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

二、Servlet执行过程

上述例子的整个执行过程如下:

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

Servlet访问类的顺序如下:

  • 当前应用的类
  • lib下的所在类
  • tomcat/lib目录的所有jar

三、Servlet生命周期

Servlet的生命周期分为四个阶段:实例化、初始化、服务以及销毁,以下是 Servlet 遵循的过程:

  • 构造 servlet,然后使用 init 方法将其初始化(实例化和初始化在servlet第一次被访问时调用)
  • 处理来自客户端的对 service 方法的所有调用(服务在每次被访问时都会调用)
  • 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它(应用被卸载时会调用)

卸载应用可以使用tomcat官网的Manager App功能进行管理,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

在管理前首先要配置tomcat安装路径下conf文件夹的tomcat-users.xml文件,在文件尾部添加用户名和密码,

<role rolename="manager-gui"/>
<user username="123" password="123" roles="manager-gui"/>
           

然后点击Manager App按钮,输入用户名和密码,就可以对服务器上的应用进行管理了,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

除了生命周期方法之外,此接口还提供了 getServletConfig 方法和 getServletInfo 方法,servlet 可使用前一种方法获得任何启动信息,而后一种方法允许 servlet 返回有关其自身的基本信息,比如作者、版本和版权。

我们把生命周期的方法加入到servlet执行过程中,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

四、Servlet的创建方式

Servlet有三种创建方式,分别为:

  • 实现javax.serlvet.Servelt接口
  • 继承javax.servlet.GenericServlet类(适配器模式)
  • 继承javax.servlet.http.HttpServlet类(模板方法设计模式)

4.1实现javax.serlvet.Servelt接口

主要是对Servlet接口的service方法进行重写,详细参见一中的Demo程序

4.2继承javax.servlet.GenericServlet类

GenericServlet类实际上也实现了Servlet接口,我们如果直接实现Servlet接口,需要对五个方法都进行重写,

而GenericServlet类对所有方法都重写了,只有service方法是抽象的,我们继承GenericServlet类,只需要对service方法进行重写

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

public class ServletDemo2 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("继承GenericServlet");
    }
}
           

运行结果:

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

4.3继承javax.servlet.http.HttpServlet类

继承HttpServlet类是开发中创建servlet的常用方法,属于模板方法设计模式,在实际开发任务中,该方法使用最多。

HttpServlet类是继承了GenericServlet类,并实现了自己的一些特殊方法,根据客户端请求方式的不同,使用不同的方法进行服务,

protected void doDelete(HttpServletRequest req, HttpServletResponse resp)//由服务器(通过service方法)调用,以允许servlet处理DELETE请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp)//由服务器(通过service方法)调用,以允许servlet处理GET请求
protected void doHead(HttpServletRequest req, HttpServletResponse resp)//从protected service方法接收HTTP HEAD请求并处理该请求
protected void doOptions(HttpServletRequest req, HttpServletResponse resp)//由服务器(通过service方法)调用,以允许servlet处理Options请求
protected void doPost(HttpServletRequest req, HttpServletResponse resp)//由服务器(通过service方法)调用,以允许servlet处理POST请求
protected void doPut(HttpServletRequest req, HttpServletResponse resp)//由服务器(通过service方法)调用,以允许servlet处理PUT请求
protected void doTrace(HttpServletRequest req, HttpServletResponse resp)//由服务器(通过service方法)调用,以允许servlet处理TRACE请求
           

HttpServlet类对service方法进行了重载,

protected void service(HttpServletRequest req, HttpServletResponse resp)//接收来自public的service方法的标准HTTP请求,并将它们分派给在该类中定义的doXXX方法
void service(ServletRequest req, ServletResponse res)//将客户端请求分派给protected的service方法
           

我们可以利用doXXX方法明确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 ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("doPost");
    }
}
           

 运行结果:

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、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_4_0.xsd"
         version="4.0">
    <!--创建一个servlet实例-->
    <servlet>
        <servlet-name>servletDemo</servlet-name>
        <servlet-class>ServletDemo3</servlet-class>
    </servlet>

    <!--给servlet提供(映射)客户端访问的URI-->
    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
    
    <!--设置不同的映射路径-->
    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/demo3</url-pattern>
    </servlet-mapping>
</web-app>
           

通过不同的url访问结果,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

还可以使用通配符*来代表任意字符串,

  • url-pattern:*abc,以abc结尾的任意字符串都可以访问
  • url-pattern:/abc,任意字符串都可以访问
  • url-pattern:/abc/*,以abc开头的任意字符串都可以访问

在使用通配符进行url匹配时,有如下的匹配规则:

绝对路径匹配>/开头匹配>结尾匹配

比如现在我们有四个servlet,对应着四个不同的映射关系,

Servlet1映射到/abc/*

Servlet2映射到/*

Servlet3映射到/abc

Servlet4映射到*.do

  • 当请求的url为"/abc/a.html"时,“/abc/*”和“/*”都匹配,但是会优先匹配“/abc/*”,即调用Servlet1
  • 当请求的url为"/abc"时,“/abc/*”和“/abc”都匹配,但是会优先匹配“/abc”,即调用Servlet3
  • 当请求的url为"/abc/a.do"时,“/abc/*”和“*.do”都匹配,但是会优先匹配“/abc/*”,即调用Servlet1
  • 当请求的url为"a.do"时,“/*”和“*.do”都匹配,但是会优先匹配“/*”,即调用Servlet2
  • 当请求的url为"/xxx/yyy/a.do"时,“/*”和“*.do”都匹配,但是会优先匹配“/*”,即调用Servlet2

如果url-pattern的值是/,表示执行默认映射。所有资源都是servlet

六、Servlet的线程安全

当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet,

当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例,即Servlet是单实例多线程访问的,

多线程下每个线程对局部变量都会有自己的一份copy,这样对局部变量的修改只会影响到自己的copy而不会对别的线程产生影响,线程安全的。

但是对于实例变量来说,由于servlet在Tomcat中是以单例模式存在的,所有的线程共享实例变量。多个线程对共享资源的访问就造成了线程不安全问题。

所以解决线程安全问题的最佳办法就是,不写全局变量,用局部变量

七、Servlet获取配置信息

这里的配置信息其实指的就是xml文件中存储的数据,我们有两种方式。

7.1 ServletConfig

第一种方式获取配置信息用到的对象为ServletConfig,

我们新建一个servlet文件,他会自动继承HttpServlet类,并且包含两个重写的函数doPost()和doGet(),

获取到配置文件信息需要用到ServletConfig对象,这个对象有两种方法获取,

void init(ServletConfig config);
ServletConfig getServletConfig();
           

我们重写init()方法,将参数中的ServletConfig对象赋值给我们自己写的Servlet对象即可,

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

@WebServlet(name = "ServletConfigDemo")
public class ServletConfigDemo extends HttpServlet {
    private ServletConfig config;

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config=config;
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String str=config.getInitParameter("encoding");//获取配置文件信息
        System.out.println(str);
    }
}
           

然后我们修改一下web.xml的映射路径和实例对应关系,在servlet标签中添加一个初始参数ini-param标签,里面新建一个encoding参数,值为GBK,然后使用ServletConfig对象获取到encoding参数的值,

<?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_4_0.xsd"
         version="4.0">
    <!--创建一个servlet实例-->
    <servlet>
        <servlet-name>servletDemo</servlet-name>
        <servlet-class>ServletConfigDemo</servlet-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>
           

配置好了之后我们启动Tomcat服务器,因为这里的映射路径我们写的是任意,这里我们随意用访问url为:http://localhost:8080/test,回车看获取的结果输出,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

我们还可以通过继承父类的方法获得ServletConfig对象,然后调用getInitParameter()方法,

String str=this.getServletConfig().getInitParameter("encoding");
System.out.println(str);
           

7.2 getInitParameter

第二种方法是使用getInitParameter()的方法,该方法也是Servlet类定义的抽象方法,

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

@WebServlet(name = "ServletConfigDemo2")
public class ServletConfigDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String str=super.getInitParameter("encoding");
        System.out.println(str);
    }
}
           

然后修改一下对应web.xml的绑定的路径,

<?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_4_0.xsd"
         version="4.0">
    <!--创建一个servlet实例-->
    <servlet>
        <servlet-name>servletDemo</servlet-name>
        <servlet-class>ServletConfigDemo2</servlet-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>
           

下面是运行的结果:

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

ServletConfig还有一个很重要的作用是获取ServletText对象。

八、ServletContext

ServletContext代表的是整个应用,一个应用只有一个ServletContext对象,为单实例。

该对象有三个主要作用:

  • 域对象
    • 在当前应用范围内使用,使多个Servlet共享数据
  • 获取全局配置信息
  • 获取资源路径

8.1域对象

ServletContext作为当前应用范围内的域对象,在当前应用范围内使用,使多个Servlet共享数据,

共享数据是通过公共的map集合实现,以键值对的形式存储信息,主要有以下方法来操作map集合,

void setAttribute(String name,object value);//向ServletContext对象的map中添加数据
Object getAttribute(String name);//从ServletContext对象的map中取数据
void removeAttribute(String name);//根据name去移除数据
           

我们新建两个Servlet,一个用来添加键值对,一个用来访问添加的键值对,

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

@WebServlet(name = "ServletContextDemo")
public class ServletContextDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext application=this.getServletContext();//通过调用getServletContext()方法获取当前应用对象
        application.setAttribute("name","test");//向ServletContext的map中添加一个键值对
    }
}
           
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ServletContextDemo2")
public class ServletContextDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext application=this.getServletContext();
        String name=(String)application.getAttribute("name");//获取map中指定键的值
        System.out.println(name);//输出获取到的值
    }
}
           

然后设置web.xml中的映射路径,

<?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_4_0.xsd"
         version="4.0">
    <!--创建servlet实例-->
    <servlet>
        <servlet-name>servletDemo</servlet-name>
        <servlet-class>ServletContextDemo</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>servletDemo2</servlet-name>
        <servlet-class>ServletContextDemo2</servlet-class>
    </servlet>

    <!--给servlet提供(映射)客户端访问的URI-->
    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>servletDemo2</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>
</web-app>
           

我们首先通过http://localhost:8080/demo访问ServletContextDemo类创建键值对,然后访问http://localhost:8080/demo2获取值信息,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

8.2获取全局配置信息

ServletConfig对象的getInitParameter()方法可以获取定义在<servlet>标签中的参数,

而ServletContext作为当前应用的全局对象,它的getInitParameter()方法可以获取定义在<servlet>标签外的参数,

我们首先在web.xml中定义一个全局配置信息<context-param>,

<?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_4_0.xsd"
         version="4.0">
    <context-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </context-param>
    
    <!--创建一个servlet实例-->
    <servlet>
        <servlet-name>servletDemo</servlet-name>
        <servlet-class>ServletContextDemo3</servlet-class>
    </servlet>

    <!--给servlet提供(映射)客户端访问的URI-->
    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
</web-app>
           

然后新建一个servlet类,用于访问该全局配置信息并输出,

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

@WebServlet(name = "ServletContextDemo3")
public class ServletContextDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext=this.getServletContext();//获取全局应用对象
        String encoding=servletContext.getInitParameter("encoding");//获取全局配置信息
        System.out.println(encoding);//输出配置信息
    }
}
           

并把类名更新到web.xml的servlet实例中,下面是显示的结果,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

8.3获取资源路径

ServletContext还可以用来获取资源的路径,使用的方法为,

String getRealPath(String path);//根据资源名称得到资源的绝对路径
           

该方法可以得到当前应用任何位置的任何资源,我们首先在项目中新建几个资源文件,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

然后我们通过getRealPath()方法获取绝对路径,并用Properties类获取配置文件的信息,

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

@WebServlet(name = "ServletContextDemo4")
public class ServletContextDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext=this.getServletContext();//获取全局应用对象
        String path=servletContext.getRealPath("/WEB-INF/a.properties");//参数要以/开头,代表当前应用的根目录\

        //创建Properties,读取配置文件中的信息
        Properties pro=new Properties();
        pro.load(new FileInputStream(path));
        System.out.println(pro.getProperty("key"));//获取key键对应的值
    }
}
           

输出结果如下:

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

 把路径换为其他的可以访问别的配置文件,需要注意src中的所有文件输出后都在WEB-INF的classes文件中,

String path=servletContext.getRealPath("/WEB-INF/classes/b.properties");//访问b.properties
String path=servletContext.getRealPath("/WEB-INF/classes/test/c.properties");//访问c.properties
           

8.4实现请求转发

实现请求转发就是浏览器发送请求给servlet1,servlet1将请求转发给servlet2,让servlet2完成请求之后,然后将结果返回给servlet1,最后返回给浏览器,

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

使用的方法为,

RequestDispatcher getRequestDispatcher(String path);//参数表示请求跳转的目的地
           

我们新建两个servlet,让ServletContextDemo5把请求转发给ServletContextDemo6来处理,

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ServletContextDemo5")
public class ServletContextDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext application=this.getServletContext();//获取全局应用对象
        RequestDispatcher rd=application.getRequestDispatcher("/demo6");
        rd.forward(request,response);//将请求向下传递
    }
}
           
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ServletContextDemo6")
public class ServletContextDemo6 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("收到转发的请求,处理完成");
    }
}
           

然后我们配置web.xml信息,

<?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_4_0.xsd"
         version="4.0">
    <!--创建一个servlet实例-->
    <servlet>
        <servlet-name>servletDemo</servlet-name>
        <servlet-class>ServletContextDemo5</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>servletDemo6</servlet-name>
        <servlet-class>ServletContextDemo6</servlet-class>
    </servlet>

    <!--给servlet提供(映射)客户端访问的URI-->
    <servlet-mapping>
        <servlet-name>servletDemo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>servletDemo6</servlet-name>
        <url-pattern>/demo6</url-pattern>
    </servlet-mapping>
</web-app>
           

接着我们启动服务器,访问url:http://localhost:8080/demo,可以看到已经将请求传递给了servlet6,结果如下:

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

九、Servlet相关对象

JavaWeb——(8)Servlet一、Servlet概述二、Servlet执行过程三、Servlet生命周期四、Servlet的创建方式五、Servlet映射六、Servlet的线程安全七、Servlet获取配置信息八、ServletContext九、Servlet相关对象

继续阅读