要想成功的配置和调试springmvc,了解掌握它的执行流程是必不可少的,话不多说,看下图:
我们边说执行边讲配置,首先,想要使用springmvc,依赖是必不可少的,在pom里边加入如下依赖:
<!--spring mvc-json依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- aop**** aspectj 相关 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>
执行流程:
用户发起一个请求,然后这个请求首先回到springmvc的前端控制器--DispatcherServlet(1),然后这个前端控制器会去调用映射处理器,与前端控制器一起完成对请求界面的拦截。如果成功拦截,呢么就返回一个执行链,返回处理器对象(2、3)。返回到前端控制器。然后前端控制器再将这个处理器对象派发给处理器适配器执行(4),处理器适配器根据判断交给对应的处理器执行(5),得到结果后是一个ViewAndModel,处理器把执行的结果返回给处理器适配器(6),处理器适配器再将ModelAndView返回给总前端控制器(7),前端控制器此时是无法完成界面展示的。它再将这个结果配发给视图解析器(8),视图解析器根据自己配置的前后缀得出完整的url路径,将这个view返回给前端控制器,此时view里边并没有加载数据(9)。所以前端控制器需要将这个view派发给视图,视图将model里边的数据加载到view中,俗称渲染(10)。渲染后,整个view就已经加载处理完毕了,此时返回给前端控制器,前端控制器将其返回给用户(11),一整套流程完毕。
下边我们就根据上述所说的流程一步一步来配置springmvc:
建立工程:
1、配置前端控制器(在web.xml文件下):
其实这里边的servlet是基于jsp的servlet,功能结构跟servlet也是大同小异,只不过以不同的形式出现罢了,比如init-param就是servlet里边的init方法,会加载一次。其中url-pattern是springmvc的拦截路径。具体的意义就是拦截这个配置的路径下的所有请求,然后将这些拦截的请求送去整个mvc执行流程中去执行,如果没有对应的控制器是会报错的(比如js和bootstrap的依赖),如果有的话就会继续执行。param-value是springmvc的配置文件,根据自己配置的路径进行填写。
<!-- 配置springvmc的总调度器-->
<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-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置完总调度器后,继续去配置映射处理器,这个时候我们需要在resource目录下建立一个springmvc-config的springmvcxml文件。具体建立方法:
建立后配置映射处理器:需要注意的是在此处是可以不配置的,会有默认的配置。一共有两种配置方式。下文注销的呢一种是普通的需要处理器继承Controller接口,因为此种方法比较鸡肋,所以着重讲注解的呢一种。建立完映射处理器后,我们就可以配置自定义处理器了。
<!-- 开启包扫描-->
<context:component-scan base-package="com.aaa"></context:component-scan>
<!--配置映射处理器: 负责url的匹配--><!-- 映射处理器和适配器默认有配置-->
<!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
配置自定义处理器:此处,加的@Controller是为了将此类加载到spring容器中。@RequestMapping填写的是对应的请求路经。
modelview构造方法里边填写的是逻辑路径。跟后边视图解析器配合拼接出全部的响应界面路径
@Controller
public class ParaController {
@RequestMapping(value = "/deptLis",method = RequestMethod.GET )// 请求映射路径
public ModelAndView list(){
//通过构造去设置逻辑视图名
ModelAndView modelAndView=new ModelAndView("dept/list");
modelAndView.addObject("deptList","模拟部门查询");
return modelAndView;
}
配置适配处理器:此处会去寻找我们对应的自定义控制器中去寻找对应的控制器。
<!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>-->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
配置视图解析器:此处看一下我设置的文件路径:
视图解析器就是为了配合逻辑路径来拼接完整的路径。返回数据。
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- 前缀-->
<property name="prefix" value="/jsp/"></property>
<!--后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
到此,springmvc配置完毕。
附上完整的配置文件:
<!-- 开启包扫描-->
<context:component-scan base-package="com.aaa"></context:component-scan>
<!-- 开启mvc注解驱动 默认情况已经开启了 json于实体的转换-->
<!-- <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>-->
<!--配置映射处理器: 负责url的匹配--><!-- 映射处理器和适配器默认有配置-->
<!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
<!-- 配置处理适配器-->
<!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>-->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- 前缀-->
<property name="prefix" value="/jsp/"></property>
<!--后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>