Spring MVC整体架构请求流程如图:
step1:
首先用户发送请求到前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;
step2:
页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)
step3:
前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
step4:
前端控制器再次收回控制权,将响应返回给用户;至此整个结束。
SpringMVC的核心组件有:
1. DispatcherServlet 前端控制器
2. HandlerMapping 处理器的规则映射
3. HandlerAdapter 处理器适配器
4. controller 处理器或者页面控制器
5. HandlerExceptionResolver 处理器异常解析
6. ViewResolver 视图解析器
当我们在做一个Spring MVC准备的工作的时候,导入固定的项目包之后,就要写web.xml的配置文件:
<servlet>
<servlet-name> dispatcher </servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name> dispatcher </servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
load-on-startup:表示启动容器时初始化该Servlet;
url-pattern:表示哪些请求交给Spring Web MVC处理, “/app/*” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。
自此请求已交给MVC框架处理,因此我们需要配置Spring的配置文件,默认DispatcherServlet会加载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。比如:WEB-INF/ dispatcher-servlet.xml
然后配置组件项:
在dispatcher-servlet.xml中添加:
<mvc:annotation-driven/>
该标签的作用是可以自动识别HandlerMapping,HandlerAdapter的默认相关实例,这样在添加@Controller @RequestMapping标注的类和方法会被自动扫描注册。
可以看一下HandlerMapping的关系:
工作中基于开发效率,我们最常用的也是 DefaultAnnotationHandlerMapping
完整的dispatcher-servlet.xml文件:
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<pre name="code" class="java"><span style="font-family:宋体;"> //HandlerMapping</span>
<context:component-scan base-package="zttc.itat.controller"/>
<mvc:annotation-driven/>
<!-- 将静态文件指定到某个特殊的文件夹中统一处理 --><mvc:resources location="/resources/" mapping="/resources/**"/> //视图处理<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!-- 设置multipartResolver才能完成文件上传 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="5000000"></property></bean><bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="zttc.itat.model.UserException">error</prop></props></property></bean></beans>
Controller层面的写法:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(@RequestParam("username") String username){
System.out.println("start----");
System.out.println(username);
return "hello";
<span style="font-family:宋体;"> </span>}
}
控制器的建立可以通过实现Controller接口实现,也可以通过@Controller注解将某个类声明为Controller,本节主要讲解注解式控制器的使用。
注解式控制器通过@Controller和@RequestMapping注解定义我们的处理器类。需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和@RequestMapping注解的处理器。
传值的问题:
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
如果数据绑定了@RequestParam 那么url上面一定要绑定数据,否则会报“400”错误。一般只有在这个数据一定是要填写的,我们才会去绑定了@RequestParam,不然我们不要添加@RequestParam,直接写参数也是可以的。