2.3 集成Spring MVC框架
Web项目集成Spring框架之后,我们继续把Spring MVC集成进来,具体如下:
首先,把集成Spring MVC所需要的Maven依赖包和相关的属性值添加到pom.xml文件中,具体代码如下:
其次,在web.xml配置文件中添加DispatcherServlet配置,具体代码如下:
-
DispatcherServlet类:
DispatcherServlet是前置控制器,主要用于拦截匹配的请求,拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置Spring MVC的第一步。
-
<init-param>:
整个项目的局部变量,相当于设定了一个固定值,只能在当前的Servlet中被使用。param-name是键,相当于就是参数名,param-value是值,相当于参数值。容器启动时会加载配置文件spring-mvc.xml。
-
<load-on-startup>:
表示启动容器时初始化该Servlet。当值为0或者大于0时,表示容器在应用启动时加载并初始化这个Servlet。如果值小于0或未指定时,则指示容器在该Servlet被选择时才加载。正值越小,Servlet的优先级越高,应用启动时就越先加载。值相同时,容器就会自己选择顺序来加载。
-
<servlet-mapping>:
标签声明了与该Servlet相应的匹配规则,每个<url-pattern>标签代表一个匹配规则。
-
<url-pattern>:
URL匹配规则,表示哪些请求交给Spring MVC处理,“/”表示拦截所有的请求。
URL匹配规则有如下几种:
(1)精准匹配
<url-pattern>中的配置项必须与URL完全精确匹配。
当在浏览器中输入如下几种URL时,都会被匹配到该Servlet:
(2)扩展名匹配
以“*.”开头的字符串被用于扩展名匹配。
当在浏览器中输入如下几种URL时,都会被匹配到该Servlet,具体代码如下:
(3)路径匹配
以“/”字符开头,并以“/*”结尾的字符串用于路径匹配。
当在浏览器中输入如下几种URL时,都会被匹配到该Servlet:
注意
路径匹配和扩展名匹配无法同时设置,如果设置,启动tomcat服务器会报错。例如下面3个匹配规则是错误的:
(4)默认匹配
(5)匹配顺序
当一个URL与多个Servlet的匹配规则可以匹配时,则按照“精确路径 > 最长路径 >扩展名”这样的优先级匹配到对应的Servlet。举例如下:
-
比如ServletA的url-pattern为/test,ServletB的url-pattern为/*,如果访问的URL路径为http://localhost/test,容器会优先进行精确路径匹配,发现/test正好被ServletA精确匹配,那么就会调用ServletA,而不是ServletB。
-
比如ServletA的url-pattern为/test/*,而ServletB的url-pattern为/test/a/*,如果访问的URL路径为http://localhost/test/a,容器会选择路径最长的Servlet来匹配,也就是ServletB。
-
比如ServletA的url-pattern:*.action,ServletB的url-pattern为/*。如果访问的URL路径为http://localhost/test.action,容器会优先进行路径匹配,而不是扩展名匹配,这样就去调用ServletB。
接着,我们在/src/main/resources目录下创建配置文件spring-mvc.xml,具体代码如下:
-
<context:component-scan>:
扫描base-package包或者子包下所有的controller类,并把匹配的controller类注册成Bean。
-
<mvc:annotation-driven/>:
该注解会自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter两个Bean,是Spring MVC为@Controller分发请求所必须的,并提供了数据绑定支持、@NumberFormatannotation支持、@DateTimeFormat支持、@Valid支持、读写XML的支持(JAXB)和读写JSON的支持(Jackson)等功能。
-
InternalResourceViewResolver:
最常用的视图解析器,当控制层返回“hello”时,InternalResourceViewResolver解析器会自动添加前缀和后缀,最终路径结果为:/WEB-INF/views/hello.jsp。
最后,在/src/main/java目录下创建包com.ay.controller,并创建控制层类AyTestController,具体代码如下:
-
@Controller:
标明AyTestController是一个控制器类,使用@Controller标记的类就是一个Spring MVC Controller对象。
-
@RequestMapping:
是一个用来处理请求地址映射的注解,可用于类或者方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。@RequestMapping注解有value、method等属性,value属性可以默认不写。“/test”就是value属性的值。value属性的值就是请求的实际地址。
-
@GetMapping:
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get请求映射到特定的处理方法上。类似的@PostMapping注解是@RequestMapping(method = RequestMethod. POST)的缩写。@PutMapping注解是@RequestMapping(method = RequestMethod. PUT)的缩写。@DeleteMapping注解是@RequestMapping(method = RequestMethod. DELETE)的缩写。@PatchMapping注解是@RequestMapping(method = RequestMethod.PATCH)的缩写。
在/src/main/webapp/WEB-INF目录下创建views文件夹,在views文件下创建hello.jsp文件,具体代码如下:
至此,Web项目集成Spring MVC大功告成。我们把Web项目部署到Tomcat服务器上,成功启动Tomcat服务器后,在浏览器输入访问路径:http://localhost:8080/test/sayHello。当出现如图2-7所示的结果时,代表Web项目集成Spring MVC成功。
图2-7 集成Spring MVC框架测试
v7X6LylmJdec4QDDGgjlmg1iYT764ucLXfswUk/inEB9BQtI+89c5CfNMcIDf/c/