SpringMvc整个的执行流程:
1、发起请求到前端控制器(DispatcherServlet )
2、前端控制器请求HandlerMapping查找Handler(可以根据xml、注解进行查找)
3、处理器映射器HandlerMapping向前端控制器DispatcherServlet 返回Handler
4、前端控制器DispatcherServlet 调用处理器适配器HandlerAdapter 执行Handler
5、处理器适配器HandlerAdapter 执行Handler
6、Handler执行完给处理器适配器返回ModelAndView
7、处理器适配器向前端控制器返回ModelAndView (ModelAndView 是SpringMvc的底层对象 包括model和view)
8、前端控制器请求视图解析器去解析视图
根据逻辑视图名解析成真正的视图(jsp)
9、视图解析器向前端控制器返回view
10、前端控制器进行视图渲染
视图渲染将模型数据(模型数据在ModelAndView对象中)填充到request域
11、前端控制器向用户响应结果
在xml文件中的配置
<!-- 只有注册了DispatcherServlet才能让SpringMVC工作,帮我们管理请求
-->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping
SpringMVC xml文件的基本配置
<!-- 扫描@Controller的注解 -->
<context:component-scan base-package="com.lanou"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 视图解析器 如果Controller中的方法是跳转页面,将由视图解析器拼接跳转地址-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- prefix的value + return的字符串 + suffix的value -->
<!-- /resource/views/index.jsp -->
<property name="prefix" value="/resource/views/"></property><!--视图的路径 -->
<property name="suffix" value=".jsp"></property><!-- 视图的格式 -->
</bean>
<!-- 静态资源的处理 js css img -->
<mvc:resources location="/resource/" mapping="/resource/**"></mvc:resources>
<!-- 启动注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 文件上传配置 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880"></property>
<property name="defaultEncoding" value="UTF-8"></property>
<property name="resolveLazily" value="true"></property>
</bean>
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 只声明bean,所有的请求都需要经过这个拦截器的处理 -->
<bean class="com.lanou.interceptor.LoginInterceptor"></bean>
<mvc:interceptor>
<!-- 拦截该路径的请求 -->
<mvc:mapping path="/user/*" />
<!-- 将该路径的请求排除 -->
<mvc:exclude-mapping path="/user/login" />
<bean class="com.lanou.interceptor.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
要使用拦截器,创建的类就需要实现HandlerInterceptor
执行的顺序 pre-->Controller-->post-->after
拦截器嵌套时的执行顺序pre1-->pre2-->Controller-->post2-->post1-->after2-->after1
preHandle方法通过返回值决定是否允许执行到链条的下一个方法 false就不会再执行了 true就是放行 常在这个方法中进行是否登录的判断
postHandle在执行完controller的方法之后执行 在这个方法中可以通过形参中的ModelAndView modelAndView
获取Controller想要跳转的路径,并对其进行修改
afterCompletion在前端接收到后端的响应后才执行
Controller层中数据的获取:
如果要用实体类进行数据的接收,只要我们告诉前端要传递参数的key与我们实体类的属性对应就可以接收到了,
如果要传递的属性 是当前这个对象的的一个对象属性的属性,我们直接将参数写成对象属性名.属性即car.carName
@DateTimeFormat(pattern="yyyy-MM-dd") Date birthday,可以将数据由字符串装换成Date类型的数据
@RequestParam(name="name")String userName 可以修改请求的参数名,前端与后端参数名不一样也能运行
springMVC的请求方法中 如果我们需要使用request,response ,session。这时候我们可以在请求方法的参数列表上直接以形参的方式将他们注入进来使用,因为SpringMVC本质是基于Servlet的。
//文件上传
//前段部分
//1.input框的type属性使用file 增加name属性(用来匹配后台接收的形参)
//2.使用form标签对input框进行包裹并使用post请求 需要设置 enctype="multipart/form-data"
//后端部分
//1.引入jia包 commons-fileupload-1.3.2.jar commons-io-2.4.jar
//2.需要在SpringMVc的配置文件中配置SprinMVC给我们提供的处理文件上传的类
//org.springframework.web.multipart.commons.CommonsMultipartResolver
//在SpringMVC配置文件中创建这个bean并设置对应的属性
//3.在对应的请求方法上使用 MultipartFile 类型来接收前端传输过来的文件
//4.在请求方法中做相应的文件操作如 MultipartFile给我们提供的transferTo(文件要保存的位置)
相当于请求转发和重定向
@RequestMapping(value="/first")
public String name(String name) {
System.out.println("first.name:"+name);
return "forward:forwards";
//return "redirect:redirects";
}