Servlet url-pattern /与/*区别

以前在使用Servlet的时候,配置url-pattern基本上都是指定的路径,也没有仔细的研究,最近突然发现了一个问题,我们将url-pattern配制成/*,那么Servlet会处理与其匹配的路径,那么我们配制成/是不是效果一样呢?下面我们将通过实际示例来验证一下。
首先我们新建一个Web程序,创建过程这里就不再叙述了。然后我们再创建一个Servlet用于测试

package com.gujin.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UrlPatternTest extends HttpServlet
{
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException
   {
      PrintWriter writer = resp.getWriter();
      writer.print("this is UrlPatternTest Servlet.");
      writer.flush();
      writer.close();
   }
}

这个Servlet很简单,只是向页面输出一句话,我们需要在web.xml中进行配置,让其生效。首先我们先将url-pattern配制成/*看一下效果。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Servlet</display-name>
  <servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>com.gujin.servlet.UrlPatternTest</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

运行程序,通过浏览器访问一下:
我们在浏览器地址栏输入:http://127.0.0.1/Servlet/,查看页面显示结果:

Tomcat会把这个请求交给我们刚才创建的Servlet去处理,再输入一些其他的地址也会交给这个Servlet来处理,那么我们是不是可以推断,当url-pattern配置成/*的时候,Tomcat会将所有的请求全部交由对应的Servlet进行处理。当访问的地址正好有对应的文件存在时,依然如此吗?我们来验证一下。
我们继续创建两个文件:test.jsp和test.html

test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>this is test page.
</body>
</html>

test.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>this is test.jsp page.
</body>
</html>

然后我们通过浏览器访问http://127.0.0.1/Servlet/test.htmlhttp://127.0.0.1/Servlet/test.jsp,我们发现请求依然是交给了我们的Servlet去处理。

下面,修改url-pattern/,我们来验证一下与/*是否相同

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Servlet</display-name>
  <servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>com.gujin.servlet.UrlPatternTest</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

修改完成后,我们先来访问http://127.0.0.1/Servlet/,结果好像与原来一样,再访问http://127.0.0.1/Servlet/test.html,结果还是一样,我们现在可能会想这两者会不会就没区别呢?别急,我们还有一个地址,好吧,我们最后再访问http://127.0.0.1/Servlet/test.jsp,神奇的事情出现了,结果与原来不一样了。

这个时候访问到了真正的jsp页面,而不是由我们的Servlet来处理请求。

最后,我们来总结一下:当url-pattern配置成/*的时候,Tomcat会将所有的请求交给对应的Servlet进行处理,当url-pattern配置成/的时候,多数情况下与/*效果一致,但是,当访问的路径正好对应jsp文件时,Tomcat会访问真实的jsp文件而不是把请求交给对应的Servlet处理。

以上为个人的疑问以及验证的过程,有不对的地方,欢迎指正。

时间: 2024-10-29 13:55:17

Servlet url-pattern /与/*区别的相关文章

ASP.NET中URL Routing和IIS上URL Rewriting的区别_自学过程

前言 前面有2篇帖子提到了关于URL Routing的特性,但是发现有很多人误会URL Routing就是URl Rewriting,其实2个虽然都提供相似的功能(提高友好的URL方便搜索引起收录),但是2者的原理和运行周期是完全不一样的,本篇文章我们就来分析一下具体有什么不同. 例子 在分析原理之前,我们先来做一个例子测试一下(IIS URL Rewrite模块需要IIS7的支持). 1.为Customer/1的URL建立对应的MVC程序 首先建立一个普通的MVC3程序,建立一个简单的Cust

servlet/filter/listener/interceptor区别与联系

下面从几个方面阐述一下题目中四个概念的区别与联系:         1.概念          2.生命周期          3.职责          4.执行过程                   一.概念:          1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.          2.filter:filter是一个可以复用的代码片段,可以用来转换HTT

tomcat 中 /servlet url 映射

servlet 我一直以为最新版是功能最完美的,所以我使用了tomcat5.0.19,但按书上定的我编每个servlet,调试时都要在项目目录下的web-inf/web.xml加入类似以下的代码: <servlet> <servlet-name>CounterServlet </servlet-name> <servlet-class>mypack.CounterServlet </servlet-class> </servlet>

HTML.ActionLink 和 Url.Action 的区别

html.ActionLink生成一个<a href=".."></a>标记.而Url.Action只返回一个url. 例如: @Html.ActionLink("链接文本"."someaction"."somecontroller",new { id = " 123 " },null) 生成: < a href = " / somecontroller / some

LoadRunner中HTML模式与URL模式的区别

在Web(HTTP/HTML)录制中,有2种重要的录制模式. 用户该选择那种录制模式呢? 一)HTML-mode录制是缺省也是推荐的录制模式.它录制当前网页中的HTML动作. 在录制会话过程中不会录制所有的资源.在回放时,HTML-mode脚本积极地解析返回的信息来获得要下载的资源. HTML-mode是亦称上下文敏感方式因为它只能在先前请求的结果的上下文之内执行.由于许多的HTTP 请求数据都是从内存中取出来的,所以语句必须在正确的前个请求之后执行. HTML-mode录制的优点是: 1.资源

解析URI与URL之间的区别与联系_基础知识

今天在看STRUTS配置的时候,发现一个问题,就是在看配置文件的时候,有时出现URL有时又是URI, 让我心生不解,到网上查了一圈,解释都含糊不清, 索性自己总结一下,仅代表个人理解,由于本人知识实在有限,可能会有错误,不过我认为是应该这样的. 总结如下: 1.简写:URI (uniform resource identifier)统一资源标志符:URL(uniform resource location )统一资源定位符(或统一资源定位器):URN(uniform resource name

Servlet容器Tomcat中web.xml中url-pattern配置详解

前言 今天研究了一下tomcat上web.xml配置文件中url-pattern的问题. 这个问题其实毕业前就困扰着我,当时忙于找工作. 找到工作之后一直忙,也就没时间顾虑这个问题了. 说到底还是自己懒了,没花时间来研究. 今天看了tomcat的部分源码 了解了这个url-pattern的机制.  下面让我一一道来. tomcat的大致结构就不说了, 毕竟自己也不是特别熟悉. 有兴趣的同学请自行查看相关资料. 等有时间了我会来补充这部分的知识的. 想要了解url-pattern的大致配置必须了解

架构师之路-在Dubbo中开发REST风格的远程调用

概述 dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议).WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持. 有鉴于此,我们基于标准的Java REST API--JAX-RS 2.0(Java API for REST

Java中路径的获取总结以及URL和URI的区别

先描述一下资源的位置:我在src下建了一个cn.config的包,里面有Config.xml这个文件.来看这一段代码 package cn.test; import java.net.URISyntaxException; import java.net.URL; public class PathTest {  public static void getURL()  {   URL url = PathTest.class.getClassLoader().getResource("&quo

spring mvc-ssh框架及,springMVC,javaBean,servlet的区别

问题描述 ssh框架及,springMVC,javaBean,servlet的区别 spring,struts,hibernate,springMVC,javabean,servlet都有什么区别 自从学了j2EE 以后就没搞清这些东西都是干什么的,有什么区别 ,一直都不能理解 看小例子这些框架都能自己做出一个用户登录的页面,我没看出区别来.本人自学没经历实践求大神详细讲解一下,最好能做出类比 解决方案 基本的J2EE开发模式JSP+Servlet+JDBC开发不知道你学没学过,如果学过类比就很