一、 springMVC开发框架原理图
其中的组件:
1,前端控制器DispatcherServlet(不需要程序员开发)
作用是接收请求,响应结果,相当于转发器
2,处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找handler
3,处理器适配器HandleAdapter
作用:按照特定规则去执行Handler
注意:编写Handler时要按照HandlerAdapter的要求去做 ,这样适配器才可以去正确执行Handler
4,视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析真正的视图(view)
5、视图View(需要程序员开发jsp)
View是一个接口,实现类型支持不同的view类型(jsp,freemarker,pdf,excel等)
6、处理器Handler(重点:需要程序员开发)
二、springmvc开发的环境搭建和入门程序
1,配置前端控制器(是一个servlet,在web.xml中配置映射)
2、配置处理器映射器,处理器适配器,视图解析器,处理器Handler,都是在springmvc的配置文件springmvc.xml中配置。
2.1、处理器适配器
根据源码分析,框架是根据实现了HandlerAdapter接口都是认为是适配器,handler实现了controller接口
controller接口 返回值为ModelAndView,根据此接口来编写handler
2.2、handler(也叫controller)编写,需要实现controller接口
上图中ModelAndView的addObject()方法(存储数据到域中,以便视图中jsp调用数据)和指定视图方法setViewName()
2.3、配置视图jsp(jstl表达式)省略
2.4、配置处理器映射器和处理器Handler一块配置
2.5、视图解析器
3、非注解开发处理器映射器,处理器适配器(了解)
4、使用注解开发处理器映射器,处理器适配器(重点掌握)
在springmvc.xml中配置如下图:
特别是使用注解驱动自动加载更多的配置(比如json转换解析器等),就不用配置上面的二个映射器和适配器.
4.1、注解开发Handler
上图中使用注解@Controller和@RequestMapping
(1)这样就不需要继承controller接口
(2)不需要在springmvc.xml中为handler配置name属性的url
(3)可以自己定义方法名,而且可以定义多个方法,方便拓展
4.2、在Handler在spring容器中注册
4.3、部署调试
http://localhost:8080/springMVC/queryItems.action
测试通过
5、视图解析器的前缀和后缀
5.1、配置前后缀后controller可以简写为
三、springmvc和mybatis整合(重点)
springMVC+mybatis三层架构图
面试题:三层架构中spring的作用
1、整合的思路(先持久层在业务层最后前端表现层)
2、需求
springmvc+mybatis来实现商品列表查询的需求
3、搭建环境
4、整合Dao
mybatis和spring进行整合。
4.1、 首先编写mybatis的全局配置文件sqlMapConfig.xml
4.2、配置spring的配置文件applicationContext-dao.xml
配置信息如下:
(1)数据源(数据库连接池c3p0)
(2) sqlSessionFactory工厂,为创建sqlSession会话
(3)mapper映射文件,采用自动扫描(xml和java文件名一只且必须在同一目录中)
4.3、编写mapper文件,逆向工程生成pojo类和mapper(单表增删改查)
4.4、手动定义商品查询mapper,ItemsMapperCustom.xml配置
4.5、itemsMapperCustom.java编写
5、整合service
5.1、spring管理service接口
和dao层的接口定义一模一样
5.2、定义service接口的实现,去调用dao层数据
5.3、在spring容器中配置service
创建applicationContext-service.xml文件配置service接口
创建applicationContext-transaction.xml,使用声明式方法事务控制
6、配置表现层的springmvc
6.1、首先配置springmvc.xml配置文件
6.2、配置前端控制器
6.3、编写Handler(实际开发叫controller)
6.4、编写jsp页面(使用jstl表达式)(省略)
6.5、把这些配置加入到spring的ioc容器中
加载mapper,service,controllor到spring容器中
建议使用通配符加载上边的配置文件
在web.xml中添加一个监听器,触发加载spring容器
![这里写图片描述] (https://img-blog.csdn.net/20160510153300659)
6.6、程序调试
在jsp页面上出了问题,就是不能识别el表达式的属性名,耽误了大半时间,后来才想到了没有放在form表单中,而且调试中还出现了缺失2个包aopalliance-1.0.jar和aspectjweaver.jar
7、商品信息修改功能开发
7.1 需求:
1、首先获取商品列表信息页面
2、点击修改,根据id修改商品信息页面,数据要显示在修改页面上
3、修改完成后,数据提交到数据库中,并重定向到商品列表信息页面
7.2 开发步骤和思路
7.2.1 开发mapper(不用开发了,使用逆向工程生成的代码)
(1)根据id查询商品信息
(2)根据id更新商品信息
7.2.2开发service(关键是业务逻辑开发)
也是根据id查询和更新商品信息
7.2.3开发controller
(1)商品信息修改页面展示
(2)商品更新后提交页面
上图中的代码不是终极代码,只是为了测试成功,把id值写死了,也没有进行参数绑定和返回值类型都是ModelAndView。
8、一些知识点的讲解
8.1 注解@ResourceMapping的作用
(1)url映射:定义controller方法对应的url,进行处理映射
(2)窄化请求映射
定义在类的上面进行窄化请求映射,对url进行分类管理
(3)限制http请求方式
出于安全考虑,对http的链接进行方法限制
如果限制请求为post方法,进行get请求就会报错
9、controller返回值类型
9.1返回ModelAndView
上面的实例都是这样返回类型,定义ModelAndView,将model和view分别设置
9.2返回string类型
(1)返回视图逻辑名,真正的视图是前缀+视图逻辑名+后缀
(2)redirect重定向
商品修改提交后,重定向到商品查询列表
redirect重定向的特点:和servlet的重定向和转发时一样的。
1、浏览器中的地址会发生改变
2、修改提交的request数据无法传递到重定向页面(重定向后进行新的request创建,所以request无法共享)
(3)页面转发forword
页面转发的特点:
1、浏览器地址不改变
2、可以把修改后的request数据传递到转发的页面(request共享)
9.3返回void类型
10、参数绑定(重点)
10.1参数绑定的过程
springmvc接收用户请求的key/value数据,是通过参数绑定,把key/value的数据绑定到controller方法的形参的方式接收的。 而不是通过定义成员变量来接收
10.2、默认支持的形参类型
直接在contorller方法形参上定义下边类型的对象,就可以使用这些对象,在参数绑定过程中,如果遇到下边类型直接进行绑定
(1)httpServletRequest
(2)httpServletResponse
(3)httpSession
(4)Model或者ModelMap
Model是一个接口,ModelMap是一个接口实现。
作用:将Model数据填充到request域中。
10.3、简单类型(8种基本类型都可以)
通过@RequestParam对简单类型的参数进行绑定
如果不使用此注解,要求request传入的参数名和controller方法的形参要一致才可以。
10.4、绑定pojo 把pojo作为形参传递,特殊情况下,需要自定义参数绑定
1、自定义参数绑定实现日期类型的绑定
对于contorller形参中pojo对象,要转换的日期类型和pojo中日期属性的类型保持一致
2、需要向处理器适配器中注入自定义的参数绑定组件
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.jary.ssm.controller.converter.CustomDateConverter">bean>
list>
property>
bean>
在建立一个包com.jary.ssm.controller.converter下定义CustomDateConverter
/*
* 日期类型转换器
*
*/
public class CustomDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
//将日期串转换成日期类型(格式:yyyy-MM-dd HH:mm:ss)
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//转成成功就返回
return simpleDateFormat.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果参数绑定失败就返回空
return null;
}
11、springmvc和struts2的区别:
1,springmvc是基于方法开发的,struts2是基于类开发的
2、springmvc可以支持单例开发(通过形参的方式接收数据,每个方法的形参都有自己的独立的内存空间,多线程安全的),建议使用单例开发,方法结束,形参数据销毁。struts2只能多例开发(通过成员变量来接收数据的传递,成员变量是共享的,多线程不安全的)。
3、经过实际测试,struts2速度慢,在于它使用了struts标签,建议使用jstl
12、springmvc的高级部分
12.1springmvc参数绑定包装类型pojo参数绑定
需求:根据id批量删除商品信息,定义一个数组来接收多个id
jsp中的name一定要和contorller中传入的数组参数名相同
12.2、springmvc参数绑定list集合类型和map集合类型
需求:批量删除商品信息
包装类pojo中定义如下:
jsp中name的值是list集合下ItemsCustom继承类Items下的属性名
写法:如下图中name=”itemsList[${status.index}].name”
13、springmvc与json交互(重点)
13.1、现在json越来用的越多,这里使用springmvc把用户提交的key/value数据,输出成json数据,此方法用的比较多;也有使用js把用户提交的json数据提交到springmvc,然后再返回json数据,比较麻烦(js来转换成json串)。
13.2、springmvc和json交互 环境的搭建
由于springmvc我使用的4.1.6版本,与之前的3版本所需要的json包不同了。
之前springmvc 3版本需要jackson-core-asl-1.9.11.jar和jackson-mapper-asl-1.9.11.jar这二个包
springmvc4版本需要三个不同的json包:
jackson.annotation..jar(代表不同的version)
jackson.core.*.jar
jackson-databind-2.6.4
13.3、配置json转换器,在处理器适配器中加入messageconverters
但是我们使用了注解驱动扫描方式后,就不需要配置转换器了。
13.4 、json的交互测试
13.4.1、输入json串,输出json串
(1)jsp页面( 利用jquery的ajax提交json串,对输出的json结果进行解析),这里有一个chrome不能响应onclick事件,在方法前加上javascript:requestJson()后可以执行了。下图中的书写有误注意
(2) controller(使用springmvc的controller输出json串)
13.4.2、请求输入的是key/value数据,输出json串
(1) jsp页面书写基本相同
(2)controller(还是输出json串)
14、restful格式的url支持(重点)
restful是一个开发理念,其实是对http的诠释
14.1 对url进行规范,写restful格式url
非restful的url:http://……/queryItems.action?id=01&type=T01
RESTful的url风格:http://……/items/01
restful的特点:url简洁,将参数通过url传到服务端
对http的contentType规范
请求时指定contentType,要输出json数据,就设置json格式的type
14.2、需求
根据id查询商品的信息,返回json数据
14.3、controller方法定义
定义方法,进行url映射使用restful风格url,将查询商品信息的id传入controller,输出json使用@ResponseBody注解返回json数据
14.4、还需要在前端控制器web.xml的配置文件中配置restful的映射(之前配置的是*.action,所有不支持restful,restful支持的映射是/,但是二者可以共存,在之前的基础上添加restful映射)
14.5、对于静态文件的访问
上面restful风格url在前端控制器配置文件web.xml中配置后,访问静态文件就会找不到的404,配置前我试了试还是可以访问的。
这样我们对静态文件的访问,springmvc为我们提供了解决方案
在springmvc的配置文件springmvc.xml中添加静态资源解析
15、拦截器
15.1定义拦截器,实现HandlerIntercepter接口
有三个方法: