1.使用 Spring MVC 进行环境搭建
1.1认识 Spring MVC
Spring MVC 是 Spring 框架中用于 Web 应用开发的一个模块,是 Spring 提供的一个基于 MVC 设计模式的优秀的 Web 开发框架。其本质相当于 servlet。在 MVC 设计模式中,Spring MVC 作为控制器(Controller)来建立模型与视图,的数据交互,是结构最清晰的 MVC Model2实现。Spring MVC 框架采用松耦合课插拔的组件结构,具有高度可配置性,比其他MVC 框架更具扩展性和灵活性。 此外, SpringMVC 的注解驱动和对REST 风格的支持,是它最具特色的功能。无论是在框架设置,还是在扩展性、灵活性等方面都超越了 Struts2 等MVC 框架,而且它本身也是 Spring 框架的一部分,与Spring 框架的整合可以说是无缝集成,性能方面具有天生的优越性。
1.2环境的搭建
在 idea 中使用 SpringMVC 框架的步骤如下:
1、引入相应的依赖。
2、 Spring MVC 配置。
a.在 web.xml 中配置servlet, 定义 Spring MVC 的核心 DispatcherServlet.
b.创建和编写 SpringMVC 的配置文件。
3、 创建 Controller(处理请求额的控制器)。
4、 创建 View。
5、 部署运行。
一、新建一个 Maven 的 webapp项目,在 pom.xml 中添加相应的依赖:
如下图示:
在pom.xml中添加需要用到的 jar 包,这里我还导入了 myBatis 和 Spring 的一些 依赖:
二、在web.xml 中配置 Servlet
Spring MVC 是基于 Servlert 的框架, DispatcherServlet 是整个 Spring MVC 框架的核心,它负责截获请求并将其分派给相应的处理器处理。下面是对 在 web.xml 中 Servlet 的配置。
<!--配置 SpringMVC 的核心控制器 DispatcherServlet-->
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Springmvc-Servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
上述代码中的 Servlet 就相当于是 SpringMVC 的入口,通过“<load-on-startup>1</load-on-startup>” 配置标记容器在启动的时候就加载此 DispatcherServlet,即自动启动。然后通过 servlet-mapping 映射到 “/”,即 DispatcherServlet 需要截获并处理该项目的所有URL 请求。在配置 DispatcherServlet 的时候,通过设置 contextConfigLocaiton 参数来指定 Spring MVC 配置文件的位置,此处使用 Spring 资源路径的方式进行指定(classpath:Sspringmvc-servlet.xml)。
补充:*“/” 和 "/"的区别:
< url-pattern > / </ url-pattern > 不会匹配到*.jsp,即:.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > / </ url-pattern > 会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
总之,关于web.xml的url映射的小知识:
< url-pattern>/</url-pattern>
会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
< url-pattern>/*</url-pattern>
会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html
等)
-
首先/这个是表示默认的路径,及表示:当没有找到可以匹配的URL就用这个URL去匹配。
-
在springmvc中可以配置多个DispatcherServlet,比如: 配置多个DispatcherServlet有/和/*,先匹配的是/*这个
-
当配置相同的情况下,DispathcherServlet配置成/和/的区别
<一>/:使用/配置路径,直接访问到jsp,不经springDispatcherServlet
<二> /:配置/*路径,不能访问到多视图的jsp
当我在客户端调用URL:/user/list然后返回user.jsp视图,当配置的是/:DispathcherServlet拿到这个请求然后返回对应的controller,
然后依据 Dispather Type为Forward类型转发到user.jsp视图,即就是请求user.jsp视图(/user/user.jsp),此时Dispather没有拦截/user/user.jsp,
因为此时你配置的是默认的 /,就顺利的交给 ModleAndView 去处理显示了。
当配置的是/*:DispathcherServlet拿到这个请求然后返回对应的controller,然后通过Dispather Type通过Forward转发到user.jsp视图,
即就是请求user.jsp视图(/user/user.jsp),此时Dispather已经拦截/user/user.jsp,Dispatcher会把他当作Controller去匹配,没有匹配到就会报404错误。
结论:在配置视图的时候尽量用 “/” 这种方式。
三、创建 Spring MVC 的配置文件。如下示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/p http://www.springframework.org/schema/p/spring-p-4.0.xsd">
<!--声明控制器的Bean-->
<bean name="/index" class="controller.TestController"/>
<!--完成视图对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
在上述配置中,主要完成一下两部分内容。
(1)、配置处理映射器。
DispatcherServlet 接收到请求后,通过咨询一个名为 HandlerMapping 的 Bean ,把一个 URL 请求指定给一个 Controller 处理。Spring 提供了多种处器映射(HandlerMapping )的支持,比如:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
BeanNameUrlHandlerMapping 是根据spring容器中配置的bean名称【注意bean的名称需要以’/'开头】和Controller来定义映射关系的, 根据请求路径path去查找beanName和path一致的bean【其中bean必须继承Controller并实现handleRequest方法】,然后调用handleRequest来处理请求。
SimpleUrlHandlerMapping 是根据其mappings属性中配置的key-value来定义映射关系的,根据请求path【作为映射关系中的key】,找到对应的Controller【此时只要找到Controller就可以了,不用到具体方法,因为自定义的Controller必须继承Controller接口,并实现handleRequest方法,最后也是执行handleRequest方法】
RequestMappingHandlerMapping 是依赖注解RequestMapping来实现path和Hander的映射关系的,具体是根据注解中的value值作为key,注解所在方法作为Handler设置映射关系,然后请求到达时则根据请求path去查找对应的Handler【具体Controller中的Method】。
若没有做任何说明,Spring 会默认使用 BeanNameUrlHanLerMapping ,即在Spring 容器中查找与请求 URL同名的Bean。这个映射器不需要配置,根据请求的URL路径即可映射到控制器 Bean 的名称。如下代码所示:
(2)、配置视图解析器
DispatcherServlet 会查找到一个视图解析器,将控制器返回的逻辑视图名称装换成渲染结果的实际视图。
Spring 提供了多种视图解析器,比如:
视图解析器 | 说明 |
---|---|
XmlViewResolver | 接口 ViewResolver 的实现,从 XML 配置文件中查找视图实现(默认 XML 配置文件为 /WEB-INF/views.xml) |
ResourceBundleViewResolver | 接口 ViewResolver 的实现,用于从 properties 文件中查找视图 |
UrlBasedViewResolver | 接口 ViewResolver 的实现,用于根据请求的 URL 路径返回相应的视图,该视图需为抽象类 AbstractUrlBasedView 的实现,它还有些子类,如 InternalResourceView 和 JstlView 等 |
InternalResourceViewResolver | UrlBasedViewResolver 的子类,通常用于查找 JSP(类 InternalResourceView)和 JSTL(类 JstlView,InternalResourceView 的子类)等视图 |
VelocityViewResolver /FreeMarkerViewResolver | UrlBasedViewResolver 的子类分别用于支持 Velocity(类 VelocityView)和 FreeMark 视图(类 FreeMarkerView) |
ContentNegotiatingViewResolver | 接口 ViewResolver 的实现,用于根据请求文件的后缀名或请求的 header 中的 accept 字段查找视图 |
四、创建 Controller
src 目录下创建 congtroller 包在该包中创建 Controller 类,继承org.springframework.web.servlet.mvc.AbstractController
,实现 handleRequestInternal 方法就可使该类变成一个可以处理前端请求的控制器了。示例如下:
public class TestController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
System.out.println("你好中国!");
//ModelAndview 对象既包含视图信息,也包含模型数据信息。index 为视图的逻辑名称。
return new ModelAndView("index");
}
}
ModelAndView 对象代表 SpringMvc 中呈现视图界面时所使用的 Model(模型数据) 和 View(逻辑视图名称)。ModelAndView 对象的作用就是封装这两个对象。返回的视图和模型是可选的,在一些情况下,模型中没有任何数据,name值返回视图即可,或者只返回模型,让 Spring 根据请求 URL 来决定视图。
五、创建 View(省略),部署运行:
点击右上角运行启动tomcat
在地址栏中输入相应的 URL ,此处为 index
控制台也有输出内容,只是有中文乱码,解决:
总结 Spring MVC 处理的流程:
当用户发送 URL 请求http://localhost:8080/SpringMvc_7_9_war_exploded/index 时,根据 web.xml 中对于DispatcherServlet 的配置, 该请求被 DispatcherServlet 截获,并根据 HandlerMapping 找到处理相应请求的 Controller(IndexController); Controler 处理完成后,返回 ModelAndView对象;该对象告诉 DispatcherServlet 需要通过那个视图来进行数据模型的展示, DispatcherServlet 根据视图解析器把 Controller 返回的逻辑视图名转换成真正的视图并输出,呈现给用户。
六、使用<mvc:annotation-driven/> 的一键式配置方法:
<mvc:annotation-driven/> 是 Spring MVC 提供的一键式配置方法,配置此标签后 Spring MVC 会帮我们自动做一些注册组件之类的工作。配置此标签后,我们可以通过注解的方式,把一个 URL 映射到 Controller 上。
修改 springmvc-servlet.xml 的代码:
<!--扫描基准包中的注解-->
<context:component-scan base-package="controller"/>
<!--一键式配置映射-->
<mvc:annotation-driven/>
<!--完成视图对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".html"/>
</bean>
上述代码中两个标签的作用:
<mvc:annotation-driven/>
配置该标签自动注册 DefaultAnnotationHandlerMapping(处理映射器) 与 AnnotationMehodHandlerAdapter(处理适器适配器) 这两个 Bean。 Spring MVC 需要通过这两个 Bean 实例来完成对@Controller 和 @requestMapping 等注解的支持,从而找出 URL 与 handler method 的关系并予以关联。
<context:componet-scan …/>。该标签是对包进行扫描,实现注解驱动 Bean 的定义,同时将 Bean 自动注入到容器中使用。即使标注了 SpringMVC 注解(如@Controller)的 Bean 生效。