Java教程

9.15JavaWeb之Servlet虚拟路径映射

本文主要是介绍9.15JavaWeb之Servlet虚拟路径映射,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

9.15JavaWeb之Servlet虚拟路径映射

什么是虚拟路径映射

概念:

客户端通过 URL 地址来访问 Web 服务器中的资源,Servlet 程序若想被外界访问,就必须被映射到一个 URL 地址上。

特点:

  • 该 URL 地址和 Servlet 程序的物理路径(在硬盘上的存储位置)不一致,被称为虚拟路径。

  • Servlet 与虚拟路径的对应关系叫做 Servlet 虚拟路径映射。

Servlet虚拟路径映射分类

  1. 单一映射

  2. 多重映射

单一映射

  • 使用web.xml实现单一映射

  • 使用@WebServlet实现单一映射

  • 使用urlPatterns实现单一映射


web.xml实现单一映射

使用方法:

使用 <servlet><servlet-mapping> 元素实现 Servlet 单一映射

<?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_3_0.xsd"
version="3.0" metadata-complete="true">
    <servlet>
        <servlet-name>MyServletDemoNo3</servlet-name>
        <servlet-class>net.biancheng.www.MyServletDemoNo3</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
   <servlet-mapping>
        <servlet-name>MyServletDemoNo3</servlet-name>
        <url-pattern>/MyServletDemoNo3</url-pattern>
    </servlet-mapping>
</web-app>
@WebServlet实现单一映射

使用方法:

直接在@WebServlet注解后+路径:

package ServletPractice;
​
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;
import java.io.PrintWriter;
​
/**
 * 编写一个Servlet容器,不使用注释的方法
 * @since JDK 1.8
 * @date 2021/09/15
 * @author Lucifer
 */
@WebServlet("/MyServletDemoNo6")
public class MyServletDemoNo6 extends HttpServlet {
    //Get方法
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向控制台打印内容
        PrintWriter writer = response.getWriter();
        writer.write("HelloMyServletDemoNo6");
        writer.close();
    }
​
    //销毁对象
    @Override
    public void destroy(){
        System.out.println(this.getServletName() + ":销毁");
    }
​
    //初始化Servlet容器
    @Override
    public void init() throws ServletException {
        System.out.println(this.getServletName() + ":初始化完成");
    }
}
urlPatterns实现单一映射

在@WebServlet内使用urlPatterns属性:

package ServletPractice;
​
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;
import java.io.PrintWriter;
​
/**
 * 编写一个Servlet容器,不使用注释的方法
 * @since JDK 1.8
 * @date 2021/09/15
 * @author Lucifer
 */
@WebServlet(urlPatterns = "/MyServletDemoNo6")
public class MyServletDemoNo6 extends HttpServlet {
    //Get方法
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向控制台打印内容
        PrintWriter writer = response.getWriter();
        writer.write("HelloMyServletDemoNo6");
        writer.close();
    }
​
    //销毁对象
    @Override
    public void destroy(){
        System.out.println(this.getServletName() + ":销毁");
    }
​
    //初始化Servlet容器
    @Override
    public void init() throws ServletException {
        System.out.println(this.getServletName() + ":初始化完成");
    }
}

Servlet多重映射

  • 配置多个<servlet-mapping> 元素

  • 配置多个<url-pattern>子元素

  • @WebServlet+urlPatterns实现


配置多个<servlet-mapping>元素

配置多个元素,使多个元素指向一个<servlet-name>元素:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    id="WebApp_ID" metadata-complete="false" version="4.0">
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>net.biancheng.www.MyServletDemoNo3</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/myServlet2</url-pattern>
    </servlet-mapping>
</web-app>

这样配置以后在网页可以访问到该Servlet类的URL就有两个:

  • http://localhost:8080/servletPractice/myServlet

  • http://localhost:8080/servletPractice/myServlet2

还可以在一个servlet-mapping下配置多个<url-pattern>子节点:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    id="WebApp_ID" metadata-complete="false" version="4.0">
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>net.biancheng.www.MyServletDemoNo3</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/myServlet</url-pattern>
        <url-pattern>/myServlet3</url-pattern>
    </servlet-mapping>
</web-app>
@WebServlet实现多重映射

实现方法:

使用@WebServlet注释+urlPattern实现:

package ServletPractice;
​
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;
import java.io.PrintWriter;
​
/**
 * 使用@WebServlet注释+urlPatter实现多重映射一个Servlet资源
 * @since JDK 1.8
 * @date 2021/09/15
 * @author Lucifer
 */
@WebServlet(urlPatterns = {
        "/MyServletNo1",
        "MyServletNo2"
})
public class MyServletDemoNo7 extends HttpServlet {
    //定义一些属性
    private static final long serialVersionUID = 1L;
    private int initCount = 0;
    private int httpCount = 0;
    private int destoryCount = 0;
    //Get方法
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向控制台打印结果
        httpCount++;
        // 控制台输出doGet方法次数
        System.out.println("doGet方法:" + httpCount);
        // 设置返回页面格式与字符集
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        // 向页面输出
        writer.write("初始化次数:" + initCount + "<br/>" + "处理请求次数:" + httpCount + "<br/>" + "销毁次数:" + destoryCount);
        writer.close();
    }
​
    //Post方法
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        doGet(request, response);
    }
​
    //初始化Servlet容器--->getServletName方法比较关键
    @Override
    public void init(){
        System.out.println(this.getServletName() + ":初始化完成");
    }
​
    //销毁Servlet容器
    @Override
    public void destroy(){
        System.out.println(this.getServletName() + "销毁完成");
    }
}

这种方式也可以实现访问不同的Url获取到相同的Servlet资源

这篇关于9.15JavaWeb之Servlet虚拟路径映射的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!