springMVC 请求404错误或静态资源无法访问

问题:springMVC 请求404错误或静态资源无法访问。

在web.xml中我们一般这样配置:

 

<!-- 默认所对应的配置文件是WEB-INF下的{servlet-name}-servlet.xml,这里便是:spring3-servlet.xml -->
	<servlet>
		<servlet-name>spring3</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>spring3</servlet-name>
		<!-- 这里可以用 / 但不能用 /*, "/"拦截了所有请求会导致静态资源无法访问,所以要在spring3-servlet.xml中配置mvc:resources -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>

    使用<url-pattern>/</url-pattern>可以实现rest风格,但是会拦截了所有的请求导致静态资源无法访问(解决方法后面说),<url-pattern>/</url-pattern>使用的是/,而不是/*,如果使用/*,那么请求时可以通过DispatcherServlet转发到相应的Action或者Controller中的,但是返回的内容,如返回的jsp还会再次被拦截,这样导致404错误,即访问不到jsp。所以如果以后发现总是有404错误的时候,别忘了check一下<url-pattern>/</url-pattern>的配置是否是/*.

 

    当然,如果你使用*.do、*.xhtml等就不会出现静态资源无法访问问题。

 

静态资源无法访问解决方案:

 

1,在spring3-servlet.xml中添加一下配置:

 

<mvc:resources location="/resources/" mapping="/resources/**"/>

    使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.

    另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
否则无法处理static resources request.

    如果加上以上配置还是不成功,检查一下是不是没有配置:

 

<mvc:annotation-driven/>

 

 

  2,在spring3-servlet.xml中添加一下配置:

 

<mvc:default-servlet-handler/>

 会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.

 

DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

 

    推荐使用 *.do 或 方案2,如果你访问一个网站的默认主页(也就是web.xml中配置的welcome-file)index.jsp,一般我们可以类似这样访问:http://localhost:8080/apprecommend-web/会自动跳转到http://localhost:8080/apprecommend-web/index.jsp,如果使用方案1,就不能这样访问了,因为spring会拦截所有的请求,但是拦截到的/apprecommend-web/没有匹配的处理action,而且就直接返回404,不再处理了,如果使用方案2,还会由DefaultServletHttpRequestHandler去调用Servlet容器自己的默认Servlet进行处理,然后返回。

你可能感兴趣的:(spring,404,静态资源,/*)