一、简介SpringMVC
1.1 MVC
- Model(模型):模型包含业务模型和数据模型,数据模型⽤于封装数据,业务模型⽤于处理业务。
- View(视图): 通常指的就是我们的 jsp 或者 html。作⽤⼀般就是展示数据的。通常视图是依据模型数据创建的。
- Controller(控制器): 是应⽤程序中处理⽤户交互的部分。作⽤⼀般就是处理程序逻辑的。
- MVC提倡:每⼀层只编写⾃⼰的东⻄,不编写任何其他的代码;分层是为了解耦,解耦是为了维
护⽅便和分⼯协作。
1.2 SpringMVC
- 它通过⼀套注解,让⼀个简单的 Java 类成为处理请求的控制器,⽽⽆须实现任何接⼝。同时它还⽀持RESTful 编程⻛格的请求。
- 总之:Spring MVC和Struts2⼀样,都是 为了解决表现层问题 的web框架,它们都是基于 MVC 设计模式的。⽽这些表现层框架的主要职责就是处理前端HTTP请求。
- Spring MVC 本质可以认为是对servlet的封装,简化了我们serlvet的开发
- 作⽤:1)接收请求 2)返回响应,跳转⻚⾯
1.3 SpringMVC ⼯作流程
开发过程
- 配置DispatcherServlet前端控制器
- 开发处理具体业务逻辑的Handler(@Controller、@RequestMapping)
- xml配置⽂件配置controller扫描,配置springmvc三⼤件(视图解析器、处理器映射器、处理器适配器)
- 将xml⽂件路径告诉springmvc(DispatcherServlet)
1.4 Spring MVC 请求处理流程
架构流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。
1.5 Spring MVC 九⼤组件
- HandlerMapping(处理器映射器)
HandlerMapping 是⽤来查找 Handler的,也就是处理器,具体的表现形式可以是类,也可以是⽅法。⽐如,标注了@RequestMapping的每个⽅法都可以看成是⼀个Handler。Handler负责具体实际的请求处理,在请求到达后,HandlerMapping
的作⽤便是找到请求相应的处理器Handler 和 Interceptor.
- HandlerAdapter(处理器适配器)
HandlerAdapter 是⼀个适配器。因为 Spring MVC 中 Handler可以是任意形式的,只要能处理请求即可。但是把请求交给 Servlet 的时候,由于 Servlet的⽅法结构都是doService(HttpServletRequestreq,HttpServletResponseresp)形式的,要让固定的 Servlet 处理⽅法调⽤ Handler 来进⾏处理,便是HandlerAdapter 的职责。
- HandlerExceptionResolver
HandlerExceptionResolver ⽤于处理 Handler 产⽣的异常情况。它的作⽤是根据异常设置
ModelAndView,之后交给渲染⽅法进⾏渲染,渲染⽅法会将 ModelAndView 渲染成⻚⾯。
- ViewResolver
ViewResolver即视图解析器,⽤于将String类型的视图名和Locale解析为View类型的视图,只有⼀个resolveViewName()⽅法。从⽅法的定义可以看出,Controller层返回的String类型视图名 viewName最终会在这⾥被解析成为View。View是⽤来渲染⻚⾯的,也就是说,它会将程序返回的参数和数据填⼊模板中,⽣成html⽂件。ViewResolver 在这个过程主要完成两件事情: ViewResolver找到渲染所⽤的模板(第⼀件⼤事)和所⽤的技术(第⼆件⼤事,其实也就是找到 视图的类型,如JSP)并填⼊参数。默认情况下,SpringMVC会⾃动为我们配置⼀个InternalResourceViewResolver,是针对 JSP 类型视图的。
- RequestToViewNameTranslator
- LocaleResolver
- ThemeResolver
- MultipartResolver
MultipartResolver ⽤于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实现。MultipartHttpServletRequest 可以通过 getFile() ⽅法 直接获得⽂件。如果上传多个⽂件,还 可以调⽤getFileMap()⽅法得到Map<FileName,File>这样的结构,MultipartResolver 的作⽤就是封装普通的请求,使其拥有⽂件上传的功能。
- FlashMapManager
FlashMap ⽤于重定向时的参数传递,⽐如在处理⽤户订单时候,为了避免重复提交,可以处理完post请求之后重定向到⼀个get请求,这个get请求可以⽤来显示订单详情之类的信息。
二、 Spring应用
2.1 请求参数绑定
- 请求参数绑定:说⽩了SpringMVC如何接收请求参数
- 原⽣servlet接收⼀个整型参数:
1)String ageStr = request.getParameter("age");
2) Integer age = Integer.parseInt(ageStr);
- SpringMVC框架对Servlet的封装,简化了servlet的很多操作。SpringMVC在接收整型参数的时候,直接在Handler⽅法中声明形参即可
@RequestMapping("xxx")
public String handle(Integer age) {
System.out.println(age);
}
参数绑定:取出参数值绑定到handler⽅法的形参上
默认⽀持 Servlet API 作为⽅法参数
当需要使⽤HttpServletRequest、HttpServletResponse、HttpSession等原⽣servlet对象时,直接在handler⽅法中形参声明使⽤即可。
- 接收简单数据类型参数,直接在handler方法的形参中声明即可,框架会取出参数值然后绑定到对应参数上。如果形参名和参数名不一致,SpringMVC 使用@RequestParam注解接收简单数据类型参数
- 接收pojo类型参数,直接形参声明即可,类型就是Pojo的类型,形参名无所谓,但是要求传递的参数名必须和Pojo的属性名保持一致
- 绑定日期类型参数,如url:/demo/handle06?birthday=2019-10-08,需要定义一个SpringMVC的类型转换器 是一个接口,扩展实现接口即可,注册你的实现(在springmvc.xml中注册)
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
// 完成字符串向日期的转换
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date parse = simpleDateFormat.parse(source);
return parse;
} catch (ParseException e) {
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd");
e.printStackTrace();
}
return null;
}
}
2.2 Restful ⻛格请求⽀持
- Restful 是⼀种 web 软件架构⻛格,它不是标准也不是协议,它倡导的是⼀个资源定位及资源操作的⻛
格。 - REST(英⽂:Representational State Transfer,简称 REST)描述了⼀个架构样式的⽹络系统, REST 都倾向于⽤更加简单轻量的⽅法设计和实现。值得注意的是 REST 并没有⼀个明确的标准,⽽更像是⼀种设计的⻛格。
它本身并没有什么实⽤性,其核⼼价值在于如何设计出符合 REST ⻛格的⽹络接⼝。 - Restful 的优点
它结构清晰、符合标准、易于理解、扩展⽅便,所以正得到越来越多⽹站的采⽤。 - GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET ⽤来获取资源,POST ⽤来新建资源,PUT ⽤来更新资源,DELETE ⽤来删除资源。
2.3 Ajax Json交互
- 交互:两个⽅向
- 前端到后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使⽤注解@RequstBody
- 后台到前端:后台直接返回pojo对象,前端直接接收为json对象或者字符串,使⽤注解
- @ResponseBody注解
@ResponseBody注解的作⽤是将controller的⽅法返回的对象通过适当的转换器转换为指定的格式之后,写⼊到response对象的body区,通常⽤来返回JSON数据或者是XML数据。
注意:在使⽤此注解之后不会再⾛视图处理器,⽽是直接将数据写⼊到输⼊流中,他的效果等同于通过response对象输出指定格式的数据。
三,SSM整合
- SSM = Spring + SpringMVC + Mybatis = (Spring + Mybatis)+ SpringMVC
- 过程:
先整合 Spring + Mybatis
然后再整合 SpringMVC
3.1 Mybatis整合Spring
- 整合⽬标
- 数据库连接池以及事务管理都交给Spring容器来完成
- SqlSessionFactory对象应该放到Spring容器中作为单例对象管理
- Mapper动态代理对象交给Spring管理,我们从Spring容器中直接获得Mapper的代理对象
- web.xml文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置前端控制器(DispatcherSerlvet) -->
<servlet>
<servlet-name> SpringmvcMyBatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--指定springmvc配置文件的加载位置-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- load-on-startup:表示servlet随服务启动; -->
</servlet>
<!-- 配置<url-pattern></url-pattern> Servlet拦截方式,拦截用户请求 -->
<servlet-mapping>
<servlet-name> SpringmvcMyBatis</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 通过上面url-pattern的配置,知道拦截的规则,以action结尾的请求将被Spring MVC的DispatcherServlet截获。 -->
- Spring配置(applicationContext.xml)
jdbc
连接池
sqlsession工程
开启扫描的方式,自动去映射mapper包
注意整合Spring,面向接口,使用Mapper动态代理开发dao层需要:
1. java\com.lagou.edu.mapper\AccountMapper.java 接口
2. 还要有一个:和接口编译之后放在同一目录并且名称相同的xml文件(resources\com.lagou.edu.mapper\AccountMapper.xml)
- SpringMVC配置文件(springmvc.xml)
加上注解扫描
<context:component-scan base-package="cn.tz.xz"></context:component-scan>
启动注解驱动
<mvc:annotation-driven></mvc:annotation-driven>
配置视图解析器前缀路径和后缀路径
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
3.2 整合SpringMVC
- 整合思路
把SpringMVC的⼊⻔案例整合进来即可(在已有⼯程基础之上开发⼀个SpringMVC⼊⻔案例)