SpringMVC是什么
Spring web mvc和Struts2都属于表现层(web)的框架,它是Spring框架的一部分,我们亏从Spring整体结构图中看出:
SpringMVC处理流程
入门程序
(1)创建Maven的web工程
(a)创建maven工程
(b)maven的配置
(c)webapp目录
(d)告诉IDEA,这是一个web项目,
修改配置
指定web.xml
指定webapp目录
(c)运行起来
(2)导包
修改Pom.xml即可
(3)需求提出
访问一个商品列表的Controller,返回商品数据和页面,
(4)创建Springmvc.xml
SpringMvc本身就是Spring的子项目,对Spring兼容性很好,有天然的继承关系,对于SpringMVC配置来讲,不要配置太多的东西,只需要支配 控制器 即可,让SpringMVC对页面控制Controller(Servlet)进行管理
(5)配置前端控制器
配置springMVC的前端控制器DispatcherServlet,在web.xml中配置Servlet方式
(6)创建商品控制
ProductController就是一个普通Java类,不实现任何接口
需要在类上面添加@Controller,把control交给Spring管理
在方法上面RequestMapping注解,指定请求URL地址,其中“.action”可以不写,URL地址和方法的一一对应,可以理解为HashMap<URL,methods>
@RequestMapping(value = "/product/productList.action")
(7)联调测试
测试是否能访问到Controller
Controller能打印提示,但是页面显示404:有来无回
(8)完善Controller
返回返回值
SpringMVC架构
(1)框架结构(面试)
(2)架构流程
1、用户发送请求到前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用处理器映射器(HandlerMapping)
3、处理器映射器根据请求的URL地址找到具体的处理器,生成 处理器对象以及拦截器(如果有就生成),一并返回给DispatcherServlet
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(controller,也叫后端控制器)
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将Controller执行的结果ModelAndView返回给DispatcherServlet
8、解析ModelAndView中View,根据View的地址得到一个View对象。
9、返回view对象
10、DispatcherServlet对View进行渲染(将数据模型的数据填充到视图中,就变成HMTL),
11、DispatcherServlet相应用户,返回HTML
(3)主键说明
以下组件通常使用框架提供实现:
-
DispatcherServlet:前端控制器
-
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
-
HandlerMapping:处理器 映射器
-
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
-
Handler:处理器 ---- 控制器Controller
-
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
-
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
-
HandlAdapter:处理器适配器
-
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
-
下图是许多不同的适配器,最终都可以使用usb接口连接
-
ViewResolver:视图解析器
-
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
-
View:视图
-
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
-
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
-
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。 需要用户开发的组件有handler、view
(4)配置视图解析器
整合Mybatis(SSM)
整合的目标
控制器层(web层)使用SpringMvc,
持久层使用Mybatis
整合的过程
(1)导包
在原有SpringMVC的基础上,添加Mybatis的包
如果有相同的包,使用版本较高的那个
(2)数据库准备
(3)配置文件
Mybatis
sqlMapConfig.xml
mapper.xml和mapper.java接口
Spring:
applicationContext.xml
springmvc
springMvc.xml
扫描器
Web.xml
Spring容器随着项目的启动 而 创建
(4)逆向工程生产POJO、Mapper
(5)开发service
(6)修改控制器
将假数据删除,从service层去拿数据
(7)测试
参数绑定
然后获取前端传递过来的参数,前端传过来的参数,一个一个KeyValue,可能是一个JSON字符串,数组
数组:爱好(黄,毒。。。)、复选框
List
(1)默认支持的参数类型
(2)绑定简单类型
当前请求的参数名称和处理器(控制器)形式 名字一致时,会将请求的参数与形参进行绑定,从Request取参数可以进一步简化
A、支持的数据类型
参数类型 推荐使用包装类型 ,因为基础的数据类型它不支持null
整型:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔类型:Boolean,Boolean
说明:对于布尔类型的参数,请求参数的值:true/false或者1/0
Eg:
URL:<http://localhost:8080/product/toEdit1.action?id=3&status=false>
B、@RequestParam
案例:
public ModelAndView toEdit2(@RequestParam(value = "pid",required = true,defaultValue = "1") Integer id){
value:前端传递过来的参数名称:将参数pid的值解析到id上
required:是否必须传递该参数,如果设置为true,但是该参数有没参数报一下错误
Required Integer parameter 'pid' is not present
defaultValue:如果该参数不传递的时候,使用默认值
注意:required和defaultValue不能同时设置
(3)绑定POJO
如果提交的参数比较多,或者表单提交的时候,内容比较多,可以使用简单类型接收数据,由于参数多,所以麻烦,建议使用POJO接收数据
要求:POJO对象的属性名和表单中input的name的值一致
需求:修改商品信息
解决Post提交乱码问题
以上可以解决post请求乱码问题。
对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
另外一种方法对参数进行重新编码:
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码
(4)绑定包装类型POJO(自行测试)
Clase Order{
Int id;
Double prime;
}
Class User{
Int uid;
String name;
Order order;
}
借助OGNL表达式的思想,
order.id
如果需要给User里面Order 的id赋值,input的name: order.id
(5)自定义参数绑定
需求
由于日期数据有很多种格式,SpringMvc没有办法把字符串转成日期类型,所有需要自定义参数绑定。
前端控制器收到请求之后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行绑定。可以在SpringMVC处理器适配器自定义转换器(converter)进行参数的绑定
一般使用<mvc:annotation-driven>注解驱动加载处理器适配器,可以在这个标签上进行配置