“Springmvc.xml解析”的版本间差异
(建立内容为“category:SpringMVC”的新页面) |
(→关于) |
||
(未显示同一用户的3个中间版本) | |||
第1行: | 第1行: | ||
[[category:SpringMVC]] | [[category:SpringMVC]] | ||
__TOC__ | |||
== 关于<mvc:default-servlet-handler/> == | |||
RESTful风格的URL不带 .html 或 .do 等后缀,所以会将DispatcherServlet请求映射配置为"/"(<syntaxhighlight lang="xml" inline><url-pattern>/</url-pattern></syntaxhighlight>),这就对静态资源的访问带来了影响:<br/> | |||
<pre> | |||
SpringMVC将捕获Web容器所有请求都看作是一个普通的请求,包括对于静态资源的请求。这样以来,所有对于静态资源的请求都会被看作是一个普通的后台控制器请求,导致请求找不到而报 404 异常错误。 | |||
(即:DispatcherServlet完全取代了default servlet,将不会再访问容器中原始默认的servlet,而对静态资源的访问就是通过容器默认servlet处理的,故而这时候静态资源将不可访问。) | |||
</pre> | |||
如何让Spring框架能够捕获所有URL的请求,同时又将静态资源的请求转由Web容器处理,是可将DispatcherServlet的请求映射配置为"/"的前提。Spring框架给出了两种解决方案:<br/> | |||
=== <mvc:default-servlet-handler/> === | |||
在xml文件中配置<mvc:default-servlet-handler/>后,会在Spring MVC上下文中定义一个<syntaxhighlight lang="java" inline>org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler</syntaxhighlight>,对进入 DispatcherServlet 的 URL 进行筛查,静态资源由 Web 服务器默认的 Servlet 处理,非静态资源的请求,由 DispatcherServlet 处理。 | |||
<syntaxhighlight lang="xml"> | |||
<mvc:default-servlet-handler/> | |||
</syntaxhighlight> | |||
* 一般Web应用服务器默认的Servlet名称是“default”。如果所使用的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定: | |||
*: <syntaxhighlight lang="xml" inline><mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" /></syntaxhighlight> | |||
=== <mvc:resources /> === | |||
springMVC中使用<mvc:resources />可以实现对静态资源(如js、css、img)进行映射访问:(参考[http://wiki.eijux.com/SpringMVC%EF%BC%9A%E9%AB%98%E7%BA%A7%E5%BA%94%E7%94%A8#.E9.9D.99.E6.80.81.E8.B5.84.E6.BA.90.E8.AE.BF.E9.97.AE.3Cmvc:resources.3E]) | |||
# <mvc:resources>由springMVC框架自己处理资源,与容器无关; | |||
# 隐藏了真实路径结构; | |||
# 允许静态资源放在任何地方; | |||
#: 如WEB-INF目录下、类路径下,甚至打到JAR包中; | |||
#: 可在location属性中使用诸如“classpath:”等的资源前缀指定资源位置; | |||
* (“/”:表示WebRoot目录) | |||
<syntaxhighlight lang="xml"> | |||
<mvc:resources location="/js/,/jquery/,/WEB-INF/jscript/,classpath:/META-INF/publicResources/" mapping="/resources/**"/> | |||
</syntaxhighlight> | |||
=== 区别 === | |||
* <mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。 | |||
* 而<mvc:resources />由Spring MVC框架自己处理静态资源。 | |||
== 关于<mvc:view-controller/> == | |||
<mvc:view-controller/>此标签用以在springMVC配置文件中实现路径的转发和资源的请求。<br/> | |||
'''配合视图解析器的前后缀,直接访问某个jsp页面,而不经过controller!''' | |||
<syntaxhighlight lang="xml"> | |||
<!-- 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> | |||
</syntaxhighlight> | |||
如上,可以直接访问项目中的“/WEB-INF/jsp/login.jsp”资源(<code>“http://localhost:8080/springmvc_mybatis1208_2/login”</code>),并不经任何Controller处理。<br/> | |||
如果不使用<mvc:view-controller/>,访问该资源则需要Controller做转发映射(<code>“http://localhost:8080/springmvc_mybatis1208_2/tologin”</code>): | |||
<syntaxhighlight lang="java"> | |||
@Controller | |||
public class UserController { | |||
@RequestMapping("/tologin") | |||
public String login(){ | |||
return "login"; | |||
} | |||
} | |||
</syntaxhighlight> |
2020年10月6日 (二) 18:40的最新版本
关于<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";
}
}