springMVC中web.xml配置/和/*的区别

本文转载自:http://blog.sina.com.cn/s/blog_54829a240102vj0z.html

感谢作者的分享!

新建一个spring项目发现无法访问到jsp页面,静态html也无法访问,终于找到答案,原来是spring拦截配置的不对,一直写的是这种配置,今天发现是不对的,好在找到了答案:)

<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

 

一、我们都知道在基于Spring的Application中,需要在web.xml中增加下面类似的配置信息:

此处需要特别强调的是 /使用的是/,而不是/*,如果使用/*,那么请求时可以通过DispatcherServlet转发到相应的Action或者Controller中的,但是返回的内容,如返回的jsp还会再次被拦截,这样导致404错误,即访问不到jsp。所以如果以后发现总是有404错误的时候,别忘了check一下 /的配置是否是/*.

二、其实Spring 的Servlet拦截器匹配规则(即 ... )都可以自己定义,例:当映射为@RequestMapping("/user/add")时

1、拦截*.do、*.htm, 例如:/user/add.do

这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。

2、拦截/,例如:/user/add

可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。

弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。想实现REST风格,事情就是麻烦一些。后面有解决办法还算简单。

3、拦截/*,这是一个错误的方式,请求可以走到Action中,但转到jsp时再次被拦截,不能访问到jsp。

三、如何访问到静态的文件,如jpg,js,css?

如果你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。 

如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。 

我们要解决这个问题。

目的:可以正常访问静态文件,不可以找不到静态文件报404。

方案一:激活Tomcat的defaultServlet来处理静态文件



 特点:1.  要配置多个,每种文件配置一个。

            2.  要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了。

            3. 高性能。

备注:

Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default" 
Google App Engine 自带的 
默认Servlet的名字 -- "_ah_default" 
Resin 自带的 
默认Servlet的名字 -- "resin-file" 
WebLogic 自带的 
默认Servlet的名字  -- "FileServlet" 
WebSphere  自带的 默认Servlet的名字 -- "SimpleFileServlet"

方案二: 在spring3.0.4以后版本提供了mvc:resources ,  使用方法:

 

images/**映射到 ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache 

  
如果出现下面的错误,可能是没有配置的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC' 

 

使用元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中, 
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler, 
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问. 
另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler, 
否则无法处理static resources request.

方案三 ,使用



会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回. 
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

补充说明:多个HandlerMapping的执行顺序问题:

DefaultAnnotationHandlerMapping的order属性值是:0 

<<SPAN class="Apple-converted-space"> 
mvc:resources/ > 自动注册的 SimpleUrlHandlerMapping 的order属性值是: 2147483646

自动注册 的SimpleUrlHandlerMapping 的order属性值是: 2147483647

spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,因为我们没有叫a.jpg的Action。然后再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定会匹配上,就可以响应图片。 访问一个图片,还要走层层匹配。不知性能如何?

最后再说明一下,方案二、方案三 在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。

如何你的DispatcherServlet拦截 *.do这样的URL后缀,就不存上述问题了。还是有后缀方便。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<h3>回答1:</h3><br/>SpringMVCweb.xml配置主要包括以下内容: 1. 配置DispatcherServlet 在web.xml配置DispatcherServlet,指定它的servlet-name和servlet-class,以及它所处理的请求的url-pattern。 2. 配置ContextLoaderListener 在web.xml配置ContextLoaderListener,指定它的listener-class,以及它所加载的Spring配置文件的位置。 3. 配置字符编码过滤器 在web.xml配置字符编码过滤器,指定它的filter-name、filter-class和encoding。 4. 配置静态资源访问 在web.xml配置静态资源访问,指定它的servlet-name、url-pattern和文件路径。 5. 配置异常处理器 在web.xml配置异常处理器,指定它的error-page和exception-type,以及处理异常的servlet或jsp页面。 6. 配置文件上传 在web.xml配置文件上传,指定它的servlet-name、url-pattern和文件上传的最大大小。 以上是SpringMVCweb.xml配置的主要内容。 <h3>回答2:</h3><br/>Spring MVC是一个基于Java的web框架,它提供了一种轻量级的WEB开发方式。在使用Spring MVC时,我们需要对其进行web.xml配置,以实现相应的功能。 在web.xml,我们需要将Spring MVC的DispatcherServlet配置为Servlet组件,并添加相应的Servlet映射规则。同时,我们还需要配置Spring MVC的上下文环境,并在其配置Spring MVC的bean以及其他的第三方组件和服务。 下面我们来详细说明Spring MVCweb.xml配置。 1. 配置DispatcherServlet DispatcherServlet是Spring MVC的核心控制器,用于接收和分发客户端请求。为了配置DispatcherServlet,我们需要在web.xml文件添加以下条目: ``` <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 其,Servlet名称(servlet-name)用于标识DispatcherServlet组件,而Servlet类(servlet-class)则指定了DispatcherServlet的Java类。 2. 配置上下文环境 我们需要在web.xml配置Spring MVC的上下文环境。因为Spring框架使用了IoC(Inverse of Control,控制反转)和依赖注入的机制,在这里我们需要指定Spring MVC用来扫描和装载的应用程序上下文。为了配置上下文环境,我们需要添加以下条目: ``` <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ``` 在这里,我们指定了一个Spring配置文件的位置,使得DispatcherServlet能够找到它。同时,我们还需要添加一个监听器,使得Spring MVC能够在应用程序启动时初始化上下文环境。 3. 配置字符编码过滤器 在Spring MVC,我们常常需要处理文字符,因此在web.xml需要设置字符编码,以保证数据能够正确传输。为了配置字符编码过滤器,我们需要添加以下条目: ``` <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 在这里,我们使用CharacterEncodingFilter作为过滤器,将编码设置为UTF-8,并强制进行编码转换。 4. 配置视图解析器 Spring MVC的视图解析器用于将处理器(例如控制器)返回的逻辑视图名称转换为Servlet的URL路径。对于视图解析器的设置,我们需要添加以下条目: ``` <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> ``` 这里我们定义了一个名为viewResolver的bean,它作为视图解析器用来解析视图的逻辑名称。prefix属性指定了视图文件所在的文件夹,而suffix属性指定了视图文件的扩展名。 5. 配置文件上传 在web应用,文件上传是一个常见的需求。Spring MVC提供了丰富的API来实现文件上传。为了配置文件上传,我们需要添加以下条目: ``` <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10240000"/> </bean> ``` 在这里,我们使用了CommonsMultipartResolver来实现文件上传,并设置了最大文件上传的大小为10MB。 以上是Spring MVC的常见web.xml配置。当然,根据应用程序的需求,还可以添加其他的组件,例如拦截器、数据源等。总之,web.xml配置能够为应用程序提供丰富的功能支持,让开发者能够更加高效、便捷地进行开发。 <h3>回答3:</h3><br/>Spring MVC是一种流行的Java Web框架,它使用基于注解的控制器和依赖注入的方式实现Web应用程序的开发。Spring MVCWeb.xml配置文件是其一个非常重要的配置文件。 在Spring MVC框架Web.xml文件具有指定DispatcherServlet和其他Servlet之间的关系的能力。我们可以通过Web.xml文件来指定Spring MVC的各种组件的配置和部署环境。 通常,Web.xml文件包含两个Servlet: - DispatcherServlet,用于将请求路由到正确的处理程序并返回响应。DispatcherServlet是整个Spring MVC应用程序的核心部分。 - ContextLoaderListener,用于加载整个应用程序的根Web应用程序上下文。 在Web.xml文件,我们需要配置这些元素: - Context Param:在应用程序的所有Servlet,定义有关应用程序环境的参数的全局配置。例如,我们可以使用上下文参数指定应用程序使用的数据库连接的URL和密码等。 - Servlet:程序的每个Servlet必须在Web.xml文件定义。Servlet在Web应用程序扮演处理HTTP请求的角色。DispatcherServlet是一个Servlet,它接受请求并处理Web应用程序的所有Servlet。 - Servlet Mapping:Servlet和URL之间的关系必须在Web.xml文件定义。Servlet映射决定哪个Servlet处理来自特定URL的请求。 - Filter:过滤器是Web应用程序的组件,它可以用于修改从客户端到服务器的请求或从服务器到客户端的响应。Filter也在Web.xml文件定义,以便和其他组件建立正确的关系。 总而言之,Web.xml文件是配置Spring MVC的一个必要的指南。在配置Web.xml文件时,需要详细了解各个元素的作用和相互之间的关系。对于开发人员而言,熟悉Web.xml配置是非常重要的一步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值