通常在开发JavaEE项目中Web应用比较常用的框架组合Struts+Spring+Hibernate(SSH)和Struts+Spring+Mybatis(ibatis)(SSM)。
当使用Spring的MVC时候,整个Web应用的层次更加简单和情绪。
引入SpringMVC所依赖的两个jar,Spring-web-*.jar Spring-webmv-*.jar(*表示对应的版本)
在Web应用(web.xml)中配置Spring WebAppliactionContext的监听
1
2
3
4
5
6
7
|
<
context-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:spring-context-*.xml</
param-value
>
</
context-param
>
<
listener
>
<
listener-class
>org.springframework.web.context.ContextLoaderListener</
listener-class
>
</
listener
>
|
Spring的配置文件进行了拆分,配置文件名格式为:spring-context-*.xml, 位于classes(src)目录下。
在Web应用(web.xml)中配置Spring MVC的Servlet(SpringMVC的核心类,前端控制器,处理请求)
1
|
<
span
style
=
"font-size:14px;font-family:arial, helvetica, sans-serif;"
><
br
><
servlet
><
br
> <
servlet-name
>spring</
servlet-name
><
br
> <
servlet-class
>org.springframework.web.servlet.DispatcherServlet</
servlet-class
><
br
> <
init-param
><
br
> <
param-name
>contextConfigLocation</
param-name
><
br
> <
param-value
>classpath:spring-web-servlet.xml</
param-value
><
br
> </
init-param
><
br
> <
load-on-startup
>2</
load-on-startup
><
br
> </
servlet
><
br
> <
br
> <
servlet-mapping
><
br
> <
servlet-name
>spring</
servlet-name
><
br
> <
url-pattern
>/</
url-pattern
><
br
> </
servlet-mapping
><
br
></
span
>
|
SpringMVC的默认配置文件名为:<servletname>-servlet.xml 并且位于WEB-INF下,上面通过servlet的初始化参数contextConfigLocation对配置文件重新设置和命名。
关于servlet的url-pattern的设置非常重要的,并且很容易出错。上述配置表示所有的请求都要经servlet name是spring的这个servlet来处理,并且名为spring这个servlet的Web应用的默认servlet。
关于servlet的url-pattern的设置可以仔细阅读这篇文章:http://blog.csdn.net/caoxu1987728/article/details/2757877
4.处理特殊请求
根据上面的配置所有请求就要经过spring这个servlet来处理,这样对静态文件的请求由于没有对应的请求处理程序,将无法访问到静态资源,这个问题的解决方法是在spring-web-servlet.xml(如果不设置默认名称为:spring-servlet.xml)中添加静态资源处理配置。
1
|
<
span
style
=
"font-size:14px;font-family:arial, helvetica, sans-serif;"
><
br
><
mvc:resources
location
=
"/resource/css/"
mapping
=
"/resource/css/**"
<br> cache-period="3600000" /><
br
> <
mvc:resources
location
=
"/resource/images/"
mapping
=
"/resource/images/**"
<br> cache-period="3600000" /><
br
> <
mvc:resources
location
=
"/resource/js/"
mapping
=
"/resource/js/**"
<br> cache-period="3600000" /><
br
></
span
>
|
5.servlet的url-pattern
a.如果url-pattern设置为:*.do,则请求通过扩展名类分发,就不存在4中的静态资源无法访问的问题
b.如果url-pattern设置为:/*, 则请求经过再次转发,重定向将再次被名为spring的servlet拦截(导致.*.jsp无效得到解析),默认的servlet名则是取自对应的web应用服务器的默认servlet命名。
下面配置是来自tomcat下conf/web.xml文件:
1
|
<
span
style
=
"font-size:14px;font-family:arial, helvetica, sans-serif;"
><
br
>
<!-- 注: 由此看出tomcat的默认servlet name是default-->
<
br
><
br
><
servlet-mapping
><
br
> <
servlet-name
>default</
servlet-name
><
br
> <
url-pattern
>/</
url-pattern
><
br
> </
servlet-mapping
><
br
> <
br
></
span
>
|
1
|
<
span
style
=
"font-size:14px;font-family:arial, helvetica, sans-serif;"
><
br
><
servlet-mapping
><
br
> <
servlet-name
>jsp</
servlet-name
><
br
> <
url-pattern
>*.jsp</
url-pattern
><
br
> <
url-pattern
>*.jspx</
url-pattern
><
br
> </
servlet-mapping
><
br
></
span
>
|
c.如果url-pattern设置为:/, 则覆盖了DefaultServlet,但是隐式的JspServlet仍然可以映射。
上面 a 是后缀映射,b是路径映射, c是默认映射,其它(/a/c/d, /a/b/c.do)这些都是精确的映射。
6.基于注解写一个SpringMVC的Controller用来处理请求
1
|
<span style=
"font-size:14px;font-family:arial, helvetica, sans-serif;"
><br>
package
com.name.web;<br><br>
import
java.util.Date;<br>
import
java.util.Map;<br><br>
import
javax.servlet.http.HttpServletRequest;<br><br>
import
org.springframework.stereotype.Controller;<br>
import
org.springframework.web.bind.annotation.PathVariable;<br>
import
org.springframework.web.bind.annotation.RequestMapping;<br>
import
org.springframework.web.bind.annotation.RequestMethod;<br><br>
@Controller
<br>
@RequestMapping
(value = {
"/hello"
})<br>
public
class
HelloController {<br><br>
@RequestMapping
(value =
"/index"
, method = RequestMethod.GET)<br>
public
String index(HttpServletRequest request, Map<String, Object> model) {<br>
return
"index"
;<br> }<br>}<br></span>
|
注:
编写这个示例用到Spring的注解,SpringMVC的jsp视图处理。因此需要在spring-web-servlet.xml文件中添加如下配置:
1
|
<
span
style
=
"font-family:arial, helvetica, sans-serif;"
> <
br
> <
context:component-scan
base-package
=
"com.name.web"
></
context:component-scan
><
br
></
span
>
|
1
|
<
span
style
=
"font-size:14px;font-family:arial, helvetica, sans-serif;"
><
br
><
bean
<br> class="org.springframework.web.servlet.view.InternalResourceViewResolver"><
br
> <
property
name
=
"viewClass"
<br> value="org.springframework.web.servlet.view.JstlView"><
br
> </
property
><
br
> <
property
name
=
"prefix"
value
=
"/WEB-INF/view/"
></
property
><
br
> <
property
name
=
"suffix"
value
=
".jsp"
/><
br
> </
bean
><
br
></
span
>
|
在/WEB-INF/view/下创建index.jsp文件,然后通过GET方式访问:http://localhost/webname/hello/index 将返回index.jsp中的内容。
7.Web应用中spring MVC和Spring WeabAppliactionContext(IOC)的关系
从上面的web.xml配置文件中可以看到SpringMVC的集成我们使用了配置org.springframework.web.servlet.DispatcherServlet,而servlet确实是可以在一个Web应用中配置多个,所以我们可以配置多个这样的servlet。
如下图是SpringWeb应用中Spring WebApplicationContext和Spring MVC(DispatcherServlet)的WebApplicationContext的关系
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1435033,如需转载请自行联系原作者