Springmvc.xml解析
关于<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])
- <mvc:resources>由springMVC框架自己处理资源,与容器无关;
- 隐藏了真实路径结构;
- 允许静态资源放在任何地方;
- 如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";
}
}