Chapter23Chapter2_第1页
Chapter23Chapter2_第2页
Chapter23Chapter2_第3页
Chapter23Chapter2_第4页
Chapter23Chapter2_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chapter2-3 SpringMVC整合MyBatis*课程回顾*1 SpringMVC框架介绍及原理2 SpringMVC入门程序3 配置与注解开发配置介绍 *教学导航*1 SpringMVC、Spring、MyBatis整合2 传参与取值1、 Spring、MyBatis和SpringMVC整合前面的章节我们整合了Spring和MyBatis这两个框架,现在再来讲SpringMVC和MyBatis整合开发的方法,这样的话,Spring、MyBatis和SpringMVC三大框架的整合开发我们就学会了。目标:控制层采用SpringMVC、持久层使用MyBatis实现。 # 思路整理 #SSM的系统架构:可以看出,spring类似于一个大管家,将 MyBatis 和 SpringMVC 揉合在一起。Spring在进行管理时,是很有条理的,每个层都由Spring管理,然后不同的层可以调用其它层,Handler调用 service,service调用mapper等。根据这个架构,我们来总结一下整合的思路,根据这个调用关系,我们可以从下往上一步步整合。1、表现层,也就是 Controller,由 SpringMVC 来控制,而SpringMVC 是Spring 的一个模块,故不需要整合。2、业务层,也就是 service,通常由 Spring 来管理 service 接口,我们会使用 xml 配置的方式来将 service 接口配置到 spring 配置文件中,也可以用注解方式配置包扫描器,扫描带service注解的类。而且事务控制一般也是在 service 层进行配置。3、持久层,也就是 dao 层,而且包括实体类,由 MyBatis 来管理,通过 spring 来管理 mapper 接口,使用mapper的扫描器自动扫描mapper接口在spring中进行注册。2、 Spring MVC入门程序需求:使用SpringMVC这个框架实现商品查询列表,从mysql数据库表中查询商品信息。(1) 创建javaWeb工程项目SpringMvcTwo,并创建好基础package或文件夹导入依赖jar包可以参考MyBatis第六章31个包,如果要用ehcache缓存要加ehcache-core-2.6.8.jar与 mybatis-ehcache-1.0.3(2) DAO整合:也就是整合 MyBatis 和 Spring1、在 config目录下新建perties 文件中,保存数据库连接的基本信息,在config目录下新建perties日志文件可复用原来的典型配置文件#数据库连接池数据源dataSource=mons.dbcp.BasicDataSourcejdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:/localhost:3306/mybatis_test?characterEncoding=utf-8jdbc.username=rootjdbc.password=Web.xml添加log4j配置log4jConfigLocationclasspath:config/perties2、 mybatis全局配置文件 SqlMapConfig.xml !- -3、 配置 Spring 配置文件spring-Context.xml我们需要配置数据源、SqlSessionFactory以及mapper扫描器,由于这是对 核心的整合,后面还有对于业务层,表现层等的整合,为了使条目更加清新,我们新建 config/spring 文件夹,相应名字的spring配置文件放入其中。4、 利用逆向工程生成相应的 po 类以及 mapper (单表增、删、改、查)文件或自己手写,将其复制到我们当前项目中针对综合查询mapper,一般情况会有综合关联查询,可以自定义mapperItemMapper接口/* * 模糊查询:根据 item 表的itemName字段 */public List findItemsByName(String itemName);ItemMapper.xml select * from item where name like %$value% (3) 整合service这层就是用 Spring 来管理 service 接口,我们使用 xml 配置的方式来将 service 接口配置到 spring 配置文件中。而且事务控制也在 service 层进行配置。1. 定义 service 接口 及实现类/* * 模糊查询:根据 item 表的itemName字段 */public List queryItemsByName(String itemName);2. ItemServiceImpl.javapublic class ItemServiceImpl implements ItemService /Resource(name=itemMapper)Autowiredprivate ItemMapper itemMapper;/通过Resource向spring容器注入UserMapperOverridepublic List queryItemsByName(String itemName) List items = itemMapper.findItemsByName(itemName);return items;3. 在spring容器中配置 Service 接口,这里我们使用 xml 的方式在config/spring 目录下,新建 spring-service.xml 增加下面的配置4. 在spring容器中配置 事务处理使用(spring声明式事务)在config/spring 目录下,新建 spring-transaction.xml(4) 整合springmvc1. 配置处理器映射器、处理器适配器、视图解析器 springmvc.xml 2. 配置前端控制器 在 web.xml 文件中添加如下代码:也可参见上一章,把那主页也jsp复制过来springmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:config/spring/springmvc.xmlspringmvc*.action3. 编写 Handler,也就是(控制器) Controller ItemController.javaControllerpublic class ItemController Autowiredprivate ItemService itemService; / .action可以省略 (请求的url地址) RequestMapping(/itemList.action) public ModelAndView itemList() / 调用service 查询商品列表 List itemList = itemService.queryItemsByName(); ModelAndView modelAndView = new ModelAndView(); /类似于 request.setAttribute() modelAndView.addObject(itemList, itemList); / 设置展示数据的视图,即jsp modelAndView.setViewName(/goods/itemList.jsp); / 返回结果 return modelAndView; 4. 加载 Spring 容器: web.xml我们在 classpath/spring 目录下新建了 spring-dao.xml,spring-service.xml,spring-transaction.xml 这些文件,里面有我们配置的 mapper,controller,service,接下来将这些加载到 spring 容器中在 web.xml 文件中添加如下代码: contextConfigLocation classpath:config/spring/spring-*.xmlorg.springframework.web.context.ContextLoaderListener由于配置文件比较多,我们使用通配符加载的方式。注意:这段代码最好要加在前端控制器的前面。(5) 视图编写:在WebContent下建立目录goods添加jsp页面itemList.jsp(6) tomcat部署运行显示主页,请求地址为:http:/localhost:8080/SpringMvcTwo/itemList.action进行测试观察结果3、 传参与取值#示例分析讲解:商品修改#需求:打开商品编辑页面,展示商品信息。选中商品信息,需要根据商品id查询商品信息,然后展示到页面。在商品修改页面,修改商品信息,修改后,点击提交。(1) 继续使用工程项目SpringMvcTwo,添加修改页面itemEdit.jsp(发的资料上有)修改商品信息 修改商品信息:商品名称商品价格商品简介$item.detail 注意:在商品列表展示页面itemList.jsp中,注意编辑检查修改超链接(2) Mapper开发ItemMapper.java增加方法/* * 根据id查询商品信息 */public Item findItemById(int id);/* * 根据id修改商品信息 */public void updateItemById(Item item);ItemMapper.xml增加方法select * from item where id = #idupdate item set name=#name,price=#price,detail=#detailwhere id=#id(3) Servicen层开发ItemService.java增加方法/* * 根据id查询商品信息 */public Item findItemById(int id);/* * 根据id修改商品信息 */public void updateItemById(Item item);ItemServiceImpl.java增加方法Overridepublic Item findItemById(int id)Item item = itemMapper.findItemById(id);return item;Overridepublic void updateItemById(Item item)itemMapper.updateItemById(item);(4) (控制器) Controller开发1、根据商品id查询商品数据,需要从请求的参数中把请求的id取出来。id应该包含在Request对象中。可以从Request对象中取id。因此我们在ItemController类中添加方法:ItemController.javaRequestMapping(/itemEdit) public ModelAndView editItem(HttpServletRequest request) / 从request中取出参数 String strId = request.getParameter(id); int id = new Integer(strId); / 调用服务 Item items = itemService.findItemById(id); / 把结果传递给页面 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject(item, items); / 设置逻辑视图 ?地址去哪呢? /modelAndView.setViewName(editItem); modelAndView.setViewName(/goods/itemEdit.jsp); return modelAndView; 如果想获得Request对象只需要在Controller类方法的形参中添加一个参数即可。SpringMVC框架会自动把Request对象传递给方法。这就是SpringMVC框架默认支持的参数类型。参考后面(SpringMVC框架默认支持的参数类型)http:/localhost:8080/SpringMvcTwo/items/itemList.action进行测试观察结果2、在Controller类中使用pojo数据类型进行参数绑定,即应在ItemController类中添加如下方法: RequestMapping(/updateitem) public String updateItem(Item item) itemService.updateItemById(item); / 返回成功页面 return /goods/success.jsp; “RequestMapping(/updateitem)”怎么少了一部分?还有其它用法吗?参考下面(RequestMapping)# RequestMapping #RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。大致可以写为RequestMapping(/item)或者RequestMapping(value=/item)RequestMapping注解有六个属性,下面我们把她分成三类进行说明。1、value, method;value:指定请求的实际地址,指定的地址可以是URI Template 模式;method:指定请求的method类型, GET、POST、PUT、DELETE等;所有的请求默认都会是 HTTP GET 类型的。出于安全性考虑,对http的链接进行方法限制。为了能降一个请求映射到一个特定的 HTTP 方法,你需要在 RequestMapping 中使用 method 来声明 HTTP 请求所使用的方法类型:2、consumes,produces;consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;3、params,headers;params:指定request中必须包含某些参数值是,才让该方法处理。headers:指定request中必须包含指定的header值,才能让该方法处理请求。# controller类方法的返回值 #(1) 返回ModelAndView需要方法结束时,定义ModelAndView,将model和view分别进行设置。(2) 返回string如果controller方法返回string,1) 表示返回逻辑视图名。真正视图(jsp路径)=前缀+逻辑视图名+后缀2) redirect重定向商品修改提交后,重定向到商品查询列表。redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)3) forward页面转发通过forward进行页面转发,浏览器地址栏url不变,request可以共享。(3) 返回void在controller方法形参上可以定义request和response,使用request或response指定响应结果:1) 使用request转向页面,如下:request.getRequestDispatcher(页面路径).forward(request, response);2) 也可以通过response页面重定向:response.sendRedirect(url)3) 也可以通过response指定响应结果,例如响应json数据如下:response.setCharacterEncoding(utf-8);response.setContentType(application/json;charset=utf-8);response.getWriter().write(json串);# 参数绑定 #(1) 参数绑定的过程从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收!(2) 默认支持的类型直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下下边类型直接进行绑定。 1、HttpServletRequest通过request对象获取请求信息2、HttpServletResponse通过response处理响应信息3、HttpSession通过session对象得到session中存放的对象4、Model/ModelMapmodel是一个接口,modelMap是一个接口实现 。作用:将model数据填充到request域。例如要根据商品id查询商品数据,需要从请求的参数中把请求的id取出来。id应该包含在Request对象中。可以从Request对象中取id。因此我们应在ItemController类中添加如下方法: public ModelAndView editItem(HttpServletRequest request) / 从request中取出参数 String strId = request.getParameter(id); 。省略后面(3) 简单的类型当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。从Request取参数的方法可以进一步简化。这样一来,editItem方法可以改造成:public String editItem(Integer id, Model model) / 调用服务Items items = itemService.getItemById(id);/ 把数据传递给页面,需要用到Model接口 model.addAttribute(item, items); 。省略后面SpringMVC框架支持的数据类型有:整形:Integer、int字符串:String单精度:Float、float双精度:Double、double布尔型:Boolean、booleanpublic String editItem(Model model,Integer id,Boolean status) throws Exception .至于请求的url,可是http:/localhost:8080/xxx.action?id=2&status=false。注意:参数类型推荐使用包装数据类型,因为基础数据类型不可以为null。RequestParam注解常用于处理简单类型的绑定。value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入。required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错defaultValue:默认值,表示如果请求中没有同名参数时的默认值。public String editItem(RequestParam(value=id,defaultValue=1,required=true) Integer ids, Model model) / 调用服务 Items items = itemService.getItemById(ids); / 把数据传递给页面,需要用到Model接口 model.addAttribute(item, items); 注意:如果不使用RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。如果使用RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。(4) Pojo接收表单数据如果提交的参数很多,或者提交的表单中的内容很多的时候可以使用pojo接收数据。要求pojo对象中的属性名和表单中input的name属性一致。就像下图所示: (5) 自定义参数绑定对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定,否则报错。将请求日期数据字符串转成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。需要向处理器适配器中注入自定义的参数绑定组件。1、定义由String类型到 Date 类型的转换器public class DateConverter implements Converter Override public Date convert(String source) try /源 字符串类型转换成指定格式 的日期类型 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); Date date = simpleDateFormat.parse(source); return date; catch (ParseException e) e.printStackTrace(); return null;/如果绑定失败 返回null 2、在 springmvc.xml 文件中配置转换器定义还有一种完全配置的方式,已经不常用了 # SpringMVC与Struts2对比 #1) SpringMVC的入口是一个servlet即前端控制器,而Struts2入口是一个filter过虑器。2) SpringMVC是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),Struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。3) Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据,SpringMVC通过参数解析器将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。jsp视图解析器默认使用也推荐使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论