概述
没看错,JavaEE系列他又回来了😁(主要是主修课理论太多,在家看不下去,哎)
1.初识SpringMVC
百度百科,Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分。
1.1入门程序
1.1.1导入jar包/配置文件
jar包:
配置文件:
创建SpringMVC的核心配置文件springmvc.xml
SpringMVC本身就是Spring的子项目,对Spring兼容性很好,不需要做很多配置。这里只配置一个Controller扫描就可以了,让Spring对页面控制层Controller进行管理。
1 |
|
在web.xml中配置SpringMVC的前端控制器DispatcherServlet
1 | <!-- 前端控制器 --> |
1.1.2创建ItemController
ItemController是一个普通的java类,不需要实现任何接口。需要在类上添加@Controller注解,把Controller交由Spring。在方法上面添加@RequestMapping注解,里面指定请求的url。其中“.action”可以加也可以不加。
1 |
|
1.2Springmvc架构
1.2.1架构图
1.2.2组件说明
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
ViewResolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开发的组件有handler、view
1.2.3配置三大组件
1 | <!-- 配置三大组件 --> |
逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为ItemList,则最终返回的jsp视图地址:“WEB-INF/jsp/itemList.jsp”
1.3整合Mybatis
整合目标:控制层采用springmvc、持久层使用mybatis实现。
1.3.1导入jar包/配置文件
需要导入的jar包:
配置文件:
sqlMapConfig.xml
1 |
|
applicationContext.xml
1 |
|
db.properties
1 | jdbc.driver=com.mysql.jdbc.Driver |
log4j.properties
1 | # Global logging configuration |
在web.xml导入spring监听器
1 | <context-param> |
1.3.2Dao开发
使用Mybatis逆向工程
创建ItemService接口和ItemServiceImpl实现类
1 |
|
修改刚刚的方法
1 | List<Item> list = itemService.selectItemList(); |
1.4参数绑定
1.4.1默认支持的参数类型
HttpServletRequest | HttpServletResponse | HttpSession
Model:
除了ModelAndView以外,还可以使用Model来向页面传递数据,Model是一个接口,在参数里直接声明model即可。如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。
1 | /** |
ModelMap是Model接口的实现类,也可以通过ModelMap向页面传递数据。使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。
1.4.2绑定简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。这样,从Request取参数的方法就可以进一步简化。
1 | //去修改页面 入参id |
支持的数据类型
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean 说明:对于布尔类型的参数,请求的参数值为true或false,或者1或0
RequestParam
这个适合有受虐倾向的,👴不是,👴知道怎么用也不写,别问为什么,问就是享受我的父爱吧🤗
1.4.3绑定pojo类型
1 | //修改 |
1 | //提高修改页面 入参为Item对象 |
解决post提交乱码问题
具体操作请看另一篇博文)
1.4.4绑定包装pojo
包装对象定义如下:
1 | public class QueryVo { |
页面定义如下图:
1 | // 绑定包装数据类型 |
1.4.5自定义参数绑定
在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式。
由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。一般使用< mvc:annotation-driven/>注解驱动加载处理器适配器,可以在此标签上进行配置。
详细操作还是在刚刚提到的博文)中,这里给出具体分析
1.5springmvc与struts2不同
1、 springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。
2、 springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
3、 Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。
2.SpringMVC进阶
2.1高级参数绑定
2.1.1绑定数组
1 | //删除多个 |
2.1.2绑定List
List中存放对象,并将定义的List放在包装类QueryVo中
改造jsp:
1 | <c:forEach items="${itemList }" var="item" varStatus="s"> |
varStatus属性常用参数总结下:
${status.first} 判断当前项是否为集合中的第一项,返回值为true或false
${status.last} 判断当前项是否为集合中的最
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始。
注意:接收List类型的数据必须是pojo的属性,如果方法的形参为ArrayList类型无法正确接收到数据。
2.2@RequestMapping
2.2.1URL路径映射
value的值是数组,可以将多个url映射到同一个方法:@RequestMapping(value = { “itemList”, “itemListAll” })
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头
2.2.2请求方法限定
- 限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过POST访问则报错:HTTP Status 405 - Request method ‘POST’ not supported
- 限定POST方法
@RequestMapping(method = RequestMethod.POST\)
如果通过GET访问则报错:HTTP Status 405 - Request method ‘GET’ not supported
- GET和POST都可以
@RequestMapping(method = {RequestMethod.GET\,RequestMethod.POST\})
2.3Controller方法返回值
2.3.1ModelAndView
前面基本全是,不详细介绍了
2.3.2void
在Controller方法形参上可以定义request和response,使用request或response指定响应结果:
- 使用request转发页面,如下:
request.getRequestDispatcher(“页面路径”).forward(request, response);
request.getRequestDispatcher(“/WEB-INF/jsp/success.jsp”).forward(request, response);
- 可以通过response页面重定向:
response.sendRedirect(“url”)
response.sendRedirect(“/springmvc-web2/itemEdit.action”);
- 可以通过response指定响应结果,例如响应json数据如下:
response.getWriter().print(“{\”abc\”:123}”);
2.3.3字符串
逻辑视图名
Redirect重定向
1
return "redirect:/itemEdit.action?itemId=" + item.getId();
forward转发
1
return "forward: /itemEdit.action";
2.3异常处理器
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
2.3.1思路图
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理
2.3.2自定义异常类
1 | public class MessageException extends Exception{ |
2.3.3自定义异常处理器
1 | /** |
2.3.4异常处理器配置
1 | <!-- Springmvc的异常处理器 --> |
2.4上传图片
2.4.1配置虚拟目录
复制一张图片到存放图片的文件夹,使用浏览器访问。测试效果,如下图:
2.4.2导入jar包
2.4.3配置上传解析器
1 | <!-- 文件上传,id必须设置为multipartResolver --> |
2.4.4修改jsp页面
2.4.5图片上传
1 |
|
2.5json数据交互
2.5.1导包
2.5.2ajax请求
1 | <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script> |
2.5.3实现交互
1 | //json数据交互 |
@RequestBody作用:
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。
@ResponseBody作用:
@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
2.6RestFul支持
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
比如传统的 http://127.0.0.1/item/queryItem.action?id=1 变成了http://127.0.0.1/item/queryItem/2.action
1 | //RestFul风格开发 |
2.7拦截器
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
2.7.1拦截器定义
1 | public class Interceptor implements HandlerInterceptor{ |
2.7.2拦截器配置
1 | <!-- Springmvc的拦截器 --> |
2.7.3应用(用户登录)
上面定义在preHandle方法中已经对用户登录进行拦截,这里主要写用户登陆Controller
1 | //去登陆的界面 |
结语
“我叫黑虎阿福,你准备受死吧!”鸭子登高 大象踢腿 黑虎掠过秃鹰 怒爪狐飞群 马尾甩苍蝇 镰刀除草 飞鹰扑影 巨斧砍大树 鹞鹰展翅 狮子拜天猎豹飞奔 蜘蛛吃苍蝇 瞪羚飞跃 鹞鹰落地 虎爪吃布丁 树猴踢腿 老鼠走迷宫 老鼠偷奶酪 仓鼠上车轮 鲸鱼摆尾 泼猴发功 蝎子掌 莲花飘 小鱼水中游 鲨鱼吞饵 蛇形步 弗朗明哥舞步 飞鹤捕虾 螳螂拳 飞天锤 猫落地 熊掌出击 猫抖水 猫转身 凤凰奔月 熊捉鲑鱼 犀牛狂奔 愤怒的章鱼 碎瓜拳 黑虎掠过秃鹰 水牛打老鼠 电眼逼人 劈山掌 乌鸦坐飞机 一虎杀两羊 暴龙振翅飞翔 树懒踢腿 睡熊盲醒 恶狼前进 恶鸦起飞 火山喷发 黑虎掏心 猴子上树 龙卷风摧毁停车场
阿福,唯一一个把每个平A说成技能的男人,永远的神!!