1. Spring MVC开发过程
1.web.xml中配置DispetcherServclet前端控制器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--
配置Servlet
1.配置servlet标签
servlet-name
servlet-class org.springframework.web.servlet.DispatcherServlet
2.配置servlet-mapping标签
servlet-name 跟servlet标签中一样
url-pattern 拦截哪些请求
方式一:带后缀,比如*.action *.do *.aaa *.bbb
方式二:/ 不会拦截.jsp
方式三:/* 拦截所有请求,包括jsp
推荐使用方式一或方式二
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.开发处理具体业务逻辑的Handler(@Controller、@RequestMapping)
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/handle01")
public ModelAndView handle01(){
Date date = new Date();
//封装了数据和页面信息的 ModelAndView
ModelAndView modelAndView = new ModelAndView();
//addObject 其实是向请求域中放入数据信息 类似:request.setAttribute("date",date);
modelAndView.addObject("date",date);
// 视图信息(封装跳转的页面信息)
// modelAndView.setViewName("/WEB-INF/jsp/success.jsp");
modelAndView.setViewName("success");
return modelAndView;
}
}
<%@ page isELIgnored="false"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
跳转成功!当前系统时间:${date}
</body>
</html>
3.springmvc.xml配置文件配置controller扫描,配置springmvc三大件
<?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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!--开启controller扫描-->
<context:component-scan base-package="com.lagou.edu.controller"/>
<!--配置视图解析器 配置视图信息的前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--
自动注册最合适的处理器映射器,处理器适配器
-->
<mvc:annotation-driven/>
<!-- 静态资源配置,方案一 -->
<!--
原理:添加改标签配置之后,会在springmvc上下文中定义一个DefaultServletHttpRequestHandler对象
这个对象如同一个检察人员,对进入DispatcherServlet的url请求进行过滤筛查,如果发现是一个静态资源请求
会把请求转由web应用服务器(tomcat)默认的DefaultServlet来处理,如果不是静态资源请求,
name继续由SpringMVC框架处理
-->
<mvc:default-servlet-handler/>
<!--
静态资源配置,方案二 SpringMVC框架自己处理静态资源
mapping:约定静态资源的url规则
location:约定的静态资源的存放位置
-->
<!--<mvc:resources location="classpath:/" mapping="/resources/**"/>-->
</beans>
4.将xml文件路径告诉springmvc(DispatcherServlet)
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>lagoumvc</servlet-name>
<servlet-class>com.lagou.edu.mvcframework.servlet.LagouDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springmvc.properties</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>lagoumvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
5.测试代码
2. Spring MVC请求处理流程
流程说明
第一步:用户发送请求至前端控制器DispatcherServlet
第二步:DispatcherServlet收到请求调用HandlerMapping处理器映射器
第三步:处理器映射器根据请求url找到具体的Handler(后端控制器),生成处理器对象及处理器拦截器(如果有则生成),一并返回DispatcherServlet
第四步:DispatcherServlet调用HandlerAdapter处理器适配器去调用Handler
第五步:处理器适配器执行Handler
第六步:Handler执行完成给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView,ModelAndView是Spring MVC框架的一个底层对象,包括Model 和 View
第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名来解析真正的视图。
第九步:视图解析器向前段控制器返回View
第十步:前端控制器进行视图渲染,就是将模型数据(在ModelAndView对象中)填充到Request域
第十一步:前端控制器向用户响应结果
3. Spring MVC 九大组件
-
HandlerMapping(处理器映射器)
HandlerMapping是用来查找Handler的,也就是处理器。具体的表现形式可以是类,也可以是方法。比如,标注了@RequestMapping的每个方法都可以看成是一个Handler。Handler负责具体实际的处理请求,在请求到达后,HandlerMapping的作用便是找到请求对应的处理器Handler和Interceptor
-
HandlerAdapter(处理器适配器)
handlerAdapter是一个适配器。因为Spring MVC中Handler可以使任意形式的,只要能处理请求即可。但是把请求交给Servlet的时候,由于Servlet的方法结构都是doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定Servlet处理方法调用Handler来进行处理,便是HandlerAdapter的职责
-
HandlerExceptionResolver
HandlerExceptionResolver用于处理Handler产生的异常情况。它的作用是根据一场设置ModelAndView,之后交给渲染方法进行渲染,渲染方法会将ModelAndView渲染成页面。
-
ViewResolver
ViewResolver即视图解析器,用于将String类型的视图名和Locale解析为View类型的视图,只有一个resolverViewName()方法。从定义的方法可以看出,Controller层返回的String类型视图名的参数和数据填入模板中,生成html文件。ViewResolver在这个过程主要完成两件事:ViewResolver找到渲染所用的模板(第一件大事)和所用的技术(第二件大事,其实也就是找到视图的类型,如JSP)并填入参数。默认情况下,Spring MVC会自动为我们配置一个InternalResourceViewResolver,是针对JSP类型视图的。
-
RequestToViewNameTranslator
RequestToViewNameTranslator组件的作用是从请求中获取ViewName,因为ViewResolver根据ViewName查找View,但有的Handler处理完成之后,没有设置View,也没有设置ViewName,便要通过这个组件从请求中查找ViewName。
-
LocaleResolver
ViewResolver组件的resolveViewName方法需要两个参数,一个是视图名,一个是Locale。LocaleResolver用于从请求中解析出Locale,比如中国Locale是zh-CN,用来表示一个区域。这个组件也是i18n的基础。
-
ThemeResolver
ThemeResolver组件是用来解析主题的。主题是样式、图⽚及它们所形成的显示效果的集合。Spring MVC 中⼀套主题对应⼀个 properties⽂件,⾥⾯存放着与当前主题相关的所有资源,如图⽚、 CSS样式等。创建主题⾮常简单,只需准备好资源,然后新建⼀个“主题名.properties”并将资源设置进去,放在classpath下,之后便可以在⻚⾯中使⽤了。 SpringMVC中与主题相关的类有ThemeResolver、 ThemeSource和Theme。 ThemeResolver负责从请求中解析出主题名,ThemeSource根据主题名找到具体的主题,其抽象也就是Theme,可以通过Theme来获取主题和具体的资源。
-
MultipartyResolver
MultipartResolver ⽤于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实现。 MultipartHttpServletRequest 可以通过 getFile() ⽅法 直接获得⽂件。如果上传多个⽂件,还可以调⽤ getFileMap()⽅法得到Map<FileName, File>这样的结构, MultipartResolver 的作⽤就是封装普通的请求,使其拥有⽂件上传的功能。
-
FlashMapManager
FlashMap ⽤于重定向时的参数传递,⽐如在处理⽤户订单时候,为了避免重复提交,可以处理完post请求之后重定向到⼀个get请求,这个get请求可以⽤来显示订单详情之类的信息。这样做虽然可以规避⽤户重新提交订单的问题,但是在这个⻚⾯上要显示订单的信息,这些数据从哪⾥来获得呢?因为重定向时么有传递参数这⼀功能的,如果不想把参数写进URL(不推荐),那么就可以通过FlashMap来传递。只需要在重定向之前将要传递的数据写⼊请求(可以通过ServletRequestAttributes.getRequest()⽅法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE中,这样在重定向之后的Handler中Spring就会⾃动将其设置到Model中,在显示订单信息的⻚⾯上就可以直接从Model中获取数据。 FlashMapManager 就是⽤来管理 FalshMap 的。