目录
一、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 程序主要有以下四步:
- 新建java类,实现servlet接口
- 修改web.xml文件,给servlet提供一个可访问的URI地址
- 部署应用到tomcat服务器
- 测试
下面我们写一个小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名称访问,得到控制台输出结果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB5UeVR0TzEFVPpHOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzMzM2QjNwkTM0EDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、Servlet执行过程
上述例子的整个执行过程如下:
Servlet访问类的顺序如下:
- 当前应用的类
- lib下的所在类
- tomcat/lib目录的所有jar
三、Servlet生命周期
Servlet的生命周期分为四个阶段:实例化、初始化、服务以及销毁,以下是 Servlet 遵循的过程:
- 构造 servlet,然后使用 init 方法将其初始化(实例化和初始化在servlet第一次被访问时调用)
- 处理来自客户端的对 service 方法的所有调用(服务在每次被访问时都会调用)
- 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它(应用被卸载时会调用)
卸载应用可以使用tomcat官网的Manager App功能进行管理,
在管理前首先要配置tomcat安装路径下conf文件夹的tomcat-users.xml文件,在文件尾部添加用户名和密码,
<role rolename="manager-gui"/>
<user username="123" password="123" roles="manager-gui"/>
然后点击Manager App按钮,输入用户名和密码,就可以对服务器上的应用进行管理了,
除了生命周期方法之外,此接口还提供了 getServletConfig 方法和 getServletInfo 方法,servlet 可使用前一种方法获得任何启动信息,而后一种方法允许 servlet 返回有关其自身的基本信息,比如作者、版本和版权。
我们把生命周期的方法加入到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");
}
}
运行结果:
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");
}
}
运行结果:
五、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访问结果,
还可以使用通配符*来代表任意字符串,
- 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,回车看获取的结果输出,
我们还可以通过继承父类的方法获得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>
下面是运行的结果:
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获取值信息,
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实例中,下面是显示的结果,
8.3获取资源路径
ServletContext还可以用来获取资源的路径,使用的方法为,
String getRealPath(String path);//根据资源名称得到资源的绝对路径
该方法可以得到当前应用任何位置的任何资源,我们首先在项目中新建几个资源文件,
然后我们通过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键对应的值
}
}
输出结果如下:
把路径换为其他的可以访问别的配置文件,需要注意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,最后返回给浏览器,
使用的方法为,
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,结果如下: