Springmvc.xml解析

来自Wikioe
跳到导航 跳到搜索

关于<mvc:default-servlet-handler/>

RESTful风格的URL不带 .html 或 .do 等后缀,所以会将DispatcherServlet请求映射配置为"/"(<url-pattern>/</url-pattern>),这就对静态资源的访问带来了影响:

SpringMVC将捕获Web容器所有请求都看作是一个普通的请求,包括对于静态资源的请求。这样以来,所有对于静态资源的请求都会被看作是一个普通的后台控制器请求,导致请求找不到而报 404 异常错误。
(即:DispatcherServlet完全取代了default servlet,将不会再访问容器中原始默认的servlet,而对静态资源的访问就是通过容器默认servlet处理的,故而这时候静态资源将不可访问。)

如何让Spring框架能够捕获所有URL的请求,同时又将静态资源的请求转由Web容器处理,是可将DispatcherServlet的请求映射配置为"/"的前提。Spring框架给出了两种解决方案:

<mvc:default-servlet-handler/>

在xml文件中配置<mvc:default-servlet-handler/>后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,对进入 DispatcherServlet 的 URL 进行筛查,静态资源由 Web 服务器默认的 Servlet 处理,非静态资源的请求,由 DispatcherServlet 处理。

	<mvc:default-servlet-handler/>
  • 一般Web应用服务器默认的Servlet名称是“default”。如果所使用的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:
    <mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

<mvc:resources />

springMVC中使用<mvc:resources />可以实现对静态资源(如js、css、img)进行映射访问:(参考[1]

  1. <mvc:resources>由springMVC框架自己处理资源,与容器无关;
  2. 隐藏了真实路径结构;
  3. 允许静态资源放在任何地方;
    如WEB-INF目录下、类路径下,甚至打到JAR包中;
    可在location属性中使用诸如“classpath:”等的资源前缀指定资源位置;
  • (“/”:表示WebRoot目录)
	<mvc:resources location="/js/,/jquery/,/WEB-INF/jscript/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>

区别

  • <mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。
  • 而<mvc:resources />由Spring MVC框架自己处理静态资源。

关于<mvc:view-controller/>

<mvc:view-controller/>此标签用以在springMVC配置文件中实现路径的转发和资源的请求。
配合视图解析器的前后缀,直接访问某个jsp页面,而不经过controller!

	<!-- url项目根地址,配合视图解析器的前后缀,直接访问某个jsp页面,而不经过controller -->
	<mvc:view-controller path="/" view-name="login"/>
    
	<!-- 视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"/>
		<property name="suffix" value=".jsp"/>
	</bean>

如上,可以直接访问项目中的“/WEB-INF/jsp/login.jsp”资源(http://localhost:8080/springmvc_mybatis1208_2/login”),并不经任何Controller处理。
如果不使用<mvc:view-controller/>,访问该资源则需要Controller做转发映射(http://localhost:8080/springmvc_mybatis1208_2/tologin”):

	@Controller
	public class UserController {

		@RequestMapping("/tologin")
		public String login(){
			return "login";
		}
	}