Servlet配置中servlet-mapping的配置问题

Java Servlet Specification 3.1

https://jcp.org/aboutJava/communityprocess/final/jsr340/index.html

专门使用一章的内容讲请求和Servlet之间的映射,下面将翻译该章的内容。

将请求映射到对应的Servlet

本章主要描述web容器怎样将客户端请求映射到对应的Servlet上。

12.1关于URL路径

web容器接收到客户端请求后,首选要确定使用容器内的那个web应用来处理该请求,比如http://host:port/xxx/user/add.jsp?id=1,其中/xxx/user/add.jsp为请求URL,/xxx为context path,用来匹配使用那个web应用处理该请求,如果各个web应用都无法匹配该路径,则使用根应用(ROOT)来处理,tomcat中的根应用可以直接放到目录下的webapps目录下的ROOT文件夹内,或者在<Host>元素中配置,主要正确的配置方式是path=""空字符串。

<Context path="" docBase="F:/Workspaces/MyEclipse2014/test/WebRoot" reloadable="false" crossContext="false"/>

确定使用哪个web应用处理请求后,根据具体web应用的配置(主要是Servlet配置的<url-pattern>),确定使用哪一个Servlet来处理请求,在请求URL中去掉context path和请求参数后,按照顺序,根据如下规则进行匹配,使用第一个匹配成功的规则进行处理。

1.完整路径匹配;

2.根据路径前缀,进行最长匹配,使用'/'作为路径分隔符;

3.使用请求路径中的后缀进行匹配,比如'.jsp';

4.如果以上都没有匹配到合适的Servlet,将使用默认(default)Servlet来处理请求;

注意:路径匹配过程中,区分大小写;

12.2如何配置Servlet中的<url-pattern>

使用‘/’开头,使用‘/*’结尾,表示使用路径匹配,比如/foo/bar/*

使用'*.xxx'表示使用后缀匹配;

只使用‘/*’,表示匹配所有的请求;

只使用'/',表示是一个默认的Servlet;

除此之外,其他的字符都是准确匹配;

12.3例子

【注意】/catalog是准确匹配

匹配结果:

Spring MVC的DispatcherServlet的配置

<!-- 配置spring mvc -->
<servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

映射方式,采用如下两种方式:

<!-- 配置spring mvc mapping -->
<servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

或者采用后缀映射

<!-- 配置spring mvc mapping -->
<servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

【注意】一定不能写为<url-pattern>/*</url-pattern>,这样的话,所有的请求将全部由Spring的DispatcherServlet来处理,显然是不合适的,jsp文件还是应该由Tomcat配置的JSP Servlet来处理。

Tomcat,在conf/web.xml中配置了一个default Servlet,一个jsp Servlet

<servlet>
	<servlet-name>default</servlet-name>
	<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
	<init-param>
		<param-name>debug</param-name>
		<param-value>0</param-value>
	</init-param>
	<init-param>
		<param-name>listings</param-name>
		<param-value>false</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
	<servlet-name>jsp</servlet-name>
	<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
	<init-param>
		<param-name>fork</param-name>
		<param-value>false</param-value>
	</init-param>
	<init-param>
		<param-name>xpoweredBy</param-name>
		<param-value>false</param-value>
	</init-param>
	<load-on-startup>3</load-on-startup>
</servlet>

<!-- The mapping for the default servlet -->
<servlet-mapping>
	<servlet-name>default</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
	<servlet-name>jsp</servlet-name>
	<url-pattern>*.jsp</url-pattern>
	<url-pattern>*.jspx</url-pattern>
</servlet-mapping>

使用Spring的DispatcherServlet作为默认Servlet后,如果静态资源还需要由Tomcat配置的default Servlet来配置,可以参考Spring中静态资源的配置方式,个人比较倾向于使用如下配置,这样对静态资源的请求就不需要DispatcherServlet来处理了。

<!-- 使用Tomcat默认Servlet处理静态资源,该配置仅适用Tomcat容器 -->
<servlet-mapping>
	<servlet-name>default</servlet-name>
	<url-pattern>*.css</url-pattern>
	<url-pattern>*.jpg</url-pattern>
	<url-pattern>*.gif</url-pattern>
	<url-pattern>*.js</url-pattern>
</servlet-mapping>

 

  • 27
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: servlet mapping的url-pattern是指用于匹配请求URL的模式,它可以是一个具体的URL路径,也可以是一个通配符表达式,用于匹配多个URL路径。在web.xml文件配置servlet mapping时,需要指定url-pattern,以便将请求分发到对应的servlet处理。例如,url-pattern可以是"/hello",表示匹配请求路径为"/hello"的URL,也可以是"/*",表示匹配所有请求路径的URL。 ### 回答2: 在Servlet,url-pattern用于指定一个URL与Servlet的映射关系。当浏览器发送请求时,服务器会根据URL的匹配规则找到对应的Servlet来处理请求。 url-pattern可以使用多种形式的通配符来定义,常见的有以下几种: 1. 精确匹配:使用完整的URL路径来匹配,例如"/example"表示只有当请求的URL路径为"/example"时才能匹配到对应的Servlet。 2. 路径匹配:使用通配符"*"来匹配任意路径段,例如"/example/*"表示可以匹配任意以"/example/"开头的URL路径。 3. 后缀匹配:使用通配符"*.后缀名"来匹配以指定后缀名结尾的URL路径,例如"*.do"表示可以匹配以".do"结尾的URL路径。 4. 默认匹配:使用"/"作为url-pattern的值时,表示该Servlet是默认的Servlet,会处理所有未被其他Servlet匹配到的请求。 url-pattern的配置可以在Servlet的部署描述符(web.xml)进行,也可以使用注解(@WebServlet)来进行配置。在配置时需要注意url-pattern的顺序,首先匹配到的Servlet将处理请求。 总之,url-pattern用于定义Servlet与URL之间的映射关系,通过合适的配置可以确保请求能够被正确地分发给对应的Servlet进行处理。 ### 回答3: 在Servlet,url-pattern是用来指定Servlet在Web应用的URL映射的规则。通过url-pattern,可以将Servlet与特定的URL路径进行关联,使得当该URL被访问时,对应的Servlet能够被正确调用和执行。 url-pattern可以使用一种简单的通配符规则,以匹配不同的URL路径,包括以下几种形式: 1. 精确匹配:可以直接指定一个具体的URL路径,例如"/myservlet",表示该Servlet与路径为"/myservlet"的URL进行匹配。 2. 后缀匹配:可以使用"*.后缀名"的形式进行匹配,例如"*.do",表示该Servlet与所有以".do"结尾的URL进行匹配。 3. 前缀匹配:可以使用"前缀/*"的形式进行匹配,例如"/servlet/*",表示该Servlet与所有以"/servlet"开头的URL进行匹配。 4. 扩展名匹配:可以使用"/"和"*"进行匹配,例如"/servlet/*",表示该Servlet与所有的URL进行匹配。 在实际应用,url-pattern的选择根据具体的需求来确定。精确匹配通常用于与特定的URL建立直接联系,后缀匹配和前缀匹配用于处理一类具有相同特征的URL,而扩展名匹配则用于处理所有的URL请求。 需要注意的是,当存在多个url-pattern匹配同一个URL地址时,Servlet容器会选择匹配规则最准确的Servlet进行处理。因此,在配置url-pattern时,应确保不会引起冲突或模糊性,避免出现无法预期的结果。 总之,url-pattern是Servlet映射和URL访问的重要方式,通过合理配置url-pattern,可以实现灵活、高效的URL映射和Servlet调用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值