springmvc高级知识.docx
- 文档编号:26247730
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:36
- 大小:744.83KB
springmvc高级知识.docx
《springmvc高级知识.docx》由会员分享,可在线阅读,更多相关《springmvc高级知识.docx(36页珍藏版)》请在冰豆网上搜索。
springmvc高级知识
springmvc第二天高级知识
复习:
springmvc框架:
DispatcherServlet前端控制器:
接收request,进行response
HandlerMapping处理器映射器:
根据url查找Handler。
(可以通过xml配置方式,注解方式)
HandlerAdapter处理器适配器:
根据特定规则去执行Handler,编写Handler时需要按照HandlerAdapter的要求去编写。
Handler处理器(后端控制器):
需要程序员去编写,常用注解开发方式。
Handler处理器执行后结果是ModelAndView,具体开发时Handler返回方法值类型包括:
ModelAndView、String(逻辑视图名)、void(通过在Handler形参中添加request和response,类似原始servlet开发方式,注意:
可以通过指定response响应的结果类型实现json数据输出)
Viewresolver视图解析器:
根据逻辑视图名生成真正的视图(在springmvc中使用View对象表示)
View视图:
jsp页面,仅是数据展示,没有业务逻辑。
注解开发:
使用注解方式的处理器映射器和适配器:
--注解映射器-->
--注解适配器-->
在实际开发,使用 annotation-driven>代替上边处理器映射器和适配器配置。 @controller注解必须要加,作用标识类是一个Handler处理器。 @requestMapping注解必须要加,作用: 1、对url和Handler的方法进行映射。 2、可以窄化请求映射,设置Handler的根路径,url就是根路径+子路径请求方式 3、可以限制http请求的方法 映射成功后,springmvc框架生成一个Handler对象,对象中只包括一个映射成功的method。 注解开发中参数绑定: 将request请求过来的key/value的数据(理解一个串),通过转换(参数绑定的一部分),将key/value串转成形参,将转换后的结果传给形参(整个参数绑定过程)。 springmvc所支持参数绑定: 1、默认支持很多类型,HttpServletRequest、response、session、 model/modelMap(将模型数据填充到request域) 2、支持简单数据类型,整型、字符串、日期。 。 只要保证request请求的参数名和形参名称一致,自动绑定成功 如果request请求的参数名和形参名称不一致,可以使用@RequestParam(指定request请求的参数名),@RequestParam加在形参的前边。 3、支持pojo类型 只要保证request请求的参数名称和pojo中的属性名一致,自动将request请求的参数设置到pojo的属性中。 注意: 形参中即有pojo类型又有简单类型,参数绑定互不影响。 自定义参数绑定: 日期类型绑定自定义: 定义的Converter<源类型,目标类型>接口实现类,比如: Converter 将请求的日期数据串转成java中的日期类型。 注意: 要转换的目标类型一定和接收的pojo中的属性类型一致。 将定义的Converter实现类注入到处理器适配器中。 annotation-drivenconversion-service="conversionService"> annotation-driven> --conversionService--> class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> --转换器--> springmvc和struts2区别: springmvc面向方法开发的(更接近service接口的开发方式),struts2面向类开发。 springmvc可以单例开发,struts2只能是多例开发。 1课程安排 上午: 在商品查询和商品修改功能案例驱动下进行学习: 包装类型pojo参数绑定(掌握)。 集合类型的参数绑定: 数组、list、map.. 商品修改添加校验,学习springmvc提供校验validation(使用的是hibernate校验框架) 数据回显 统一异常处理(掌握) 下午: 上传图片 json数据交互 RESTful支持 拦截器 2包装类型pojo参数绑定 2.1需求 商品查询controller方法中实现商品查询条件传入。 2.2实现方法 第一种方法: 在形参中添加HttpServletRequestrequest参数,通过request接收查询条件参数。 第二种方法: 在形参中让包装类型的pojo接收查询条件参数。 分析: 页面传参数的特点: 复杂,多样性。 条件包括: 用户账号、商品编号、订单信息。 。 。 如果将用户账号、商品编号、订单信息等放在简单pojo(属性是简单类型)中,pojo类属性比较多,比较乱。 建议使用包装类型的pojo,pojo中属性是pojo。 2.3页面参数和controller方法形参定义 页面参数: 商品名称: 注意: itemsCustom和包装pojo中的属性一致即可。 controller方法形参: publicModelAndViewqueryItems(HttpServletRequestrequest,ItemsQueryVoitemsQueryVo)throwsException 3集合类型绑定 3.1数组绑定 3.1.1需求 商品批量删除,用户在页面选择多个商品,批量删除。 3.1.2表现层实现 关键: 将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商品id。 controller方法定义: 页面定义: 3.2list绑定 3.2.1需求 通常在需要批量提交数据时,将提交的数据绑定到list 成绩录入(录入多门课成绩,批量提交), 本例子需求: 批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。 3.2.2表现层实现 controller方法定义: 1、进入批量商品修改页面(页面样式参考商品列表实现) 2、批量修改商品提交 使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list 页面定义: 3.3map绑定 也通过在包装pojo中定义map类型属性。 在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。 包装类中定义Map对象如下: PublicclassQueryVo{ privateMap //get/set方法.. } 页面定义如下: 姓名: 年龄: ...... Contrller方法定义如下: publicStringuseraddsubmit(Modelmodel,QueryVoqueryVo)throwsException{ System.out.println(queryVo.getStudentinfo()); } 4springmvc校验 4.1校验理解 项目中,通常使用较多是前端的校验,比如页面中js校验。 对于安全要求较高点建议在服务端进行校验。 服务端校验: 控制层conroller: 校验页面请求的参数的合法性。 在服务端控制层conroller校验,不区分客户端类型(浏览器、手机客户端、远程调用) 业务层service(使用较多): 主要校验关键业务参数,仅限于service接口中使用的参数。 持久层dao: 一般是不校验的。 4.2springmvc校验需求 springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。 校验思路: 页面提交请求的参数,请求到controller方法中,使用validation进行校验。 如果校验出错,将错误信息展示到页面。 具体需求: 商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。 4.3环境准备 hibernate的校验框架validation所需要jar包: 4.4配置校验器 4.5校验器注入到处理器适配器中 4.6在pojo中添加校验规则 在ItemsCustom.java中添加校验规则: 4.7CustomValidationMessages.properties 在CustomValidationMessages.properties配置校验错误信息: 4.8捕获校验错误信息 //在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResultbindingResult接收校验出错信息 //注意: @Validated和BindingResultbindingResult是配对出现,并且形参顺序是固定的(一前一后)。 4.9在页面显示校验错误信息 在controller中将错误信息传到页面即可。 页面显示错误信息: 4.10分组校验 4.10.1需求 在pojo中定义校验规则,而pojo是被多个controller所共用,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。 解决方法: 定义多个校验分组(其实是一个java接口),分组中定义有哪些规则 每个controller方法使用不同的校验分组 4.10.2校验分组 4.10.3在校验规则中添加分组 4.10.4在controller方法使用指定分组的校验 5数据回显 5.1什么数据回显 提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面。 5.2pojo数据回显方法 1、springmvc默认对pojo数据进行回显。 pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写) 使用@ModelAttribute指定pojo回显到页面在request中的key 2、@ModelAttribute还可以将方法的返回值传到页面 在商品查询列表页面,通过商品类型查询商品信息。 在controller中定义商品类型查询方法,最终将商品类型传到页面。 页面上可以得到itemTypes数据。 3、使用最简单方法使用model,可以不用@ModelAttribute 5.3简单类型数据回显 使用最简单方法使用model。 model.addAttribute("id",id); 6异常处理 6.1异常处理思路 系统中异常包括两类: 预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。 系统的dao、service、controller出现都通过throwsException向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图: springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。 6.2自定义异常类 对不同的异常类型定义异常类,继承Exception。 6.3全局异常处理器 思路: 系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。 全局异常处理器处理思路: 解析出异常类型 如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示 如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型(信息为“未知错误”) springmvc提供一个HandlerExceptionResolver接口 @Override publicModelAndViewresolveException(HttpServletRequestrequest, HttpServletResponseresponse,Objecthandler,Exceptionex){ //handler就是处理器适配器要执行Handler对象(只有method) //解析出异常类型 //如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示 //Stringmessage=null; //if(exinstanceofCustomException){ //message=((CustomException)ex).getMessage(); //}else{ ////如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型(信息为“未知错误”) //message="未知错误"; //} //上边代码变为 CustomExceptioncustomException=null; if(exinstanceofCustomException){ customException=(CustomException)ex; }else{ customException=newCustomException("未知错误"); } //错误信息 Stringmessage=customException.getMessage(); ModelAndViewmodelAndView=newModelAndView(); //将错误信息传到页面 modelAndView.addObject("message",message); //指向错误页面 modelAndView.setViewName("error"); returnmodelAndView; } 6.4错误页面 6.5在springmvc.xml配置全局异常处理器 6.6异常测试 在controller、service、dao中任意一处需要手动抛出异常。 如果是程序中手动抛出的异常,在错误页面中显示自定义的异常信息,如果不是手动抛出异常说明是一个运行时异常,在错误页面只显示“未知错误”。 在商品修改的controller方法中抛出异常. 在service接口中抛出异常: 如果与业务功能相关的异常,建议在service中抛出异常。 与业务功能没有关系的异常,建议在controller中抛出。 上边的功能,建议在service中抛出异常。 7上传图片 7.1需求 在修改商品页面,添加上传商品图片功能。 7.2springmvc中对多部件类型解析 在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。 在springmvc.xml中配置multipart类型解析器。 7.3加入上传图片的jar 上边的解析内部使用下边的jar进行图片上传。 7.4创建图片虚拟目录存储图片 通过图形界面配置: 也可以直接修改tomcat的配置: 在conf/server.xml文件,添加虚拟目录: 注意: 在图片虚拟目录中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。 7.5上传图片代码 7.5.1页面 7.5.2controller方法 修改: 商品修改controller方法: 8json数据交互 8.1为什么要进行json数据交互 json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。 比如: webservice接口,传输json数据. 8.2springmvc进行json交互 1、请求json、输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。 2、请求key/value、输出json。 此方法比较常用。 8.3环境准备 8.3.1加载json转的jar包 springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用下边的包进行json转),如下: 8.3.2配置json转换器 在注解适配器中加入messageConverters --注解适配器--> 注意: 如果使用 annotation-driven/>则不用定义上边的内容。 8.4json交互测试 8.4.1输入json串,输出是json串 8.4.1.1jsp页面 使用jquery的ajax提交json串,对输出的json结果进行解析。 8.4.1.2controller 8.4.1.3测试结果 8.4.2输入key/value,输出是json串 8.4.2.1jsp页面 使用jquery的ajax提交key/value串,对输出的json结果进行解析。 8.4.2.2controller 8.4.2.3测试 9RESTful支持 9.1什么是RESTful RESTful架构,就是目前最流行的一种互联网软件架构。 它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。 RESTful(即RepresentationalStateTransfer的缩写)其实是一个开发理念,是对http的很好的诠释。 1、对url进行规范,写RESTful格式的url 非REST的url: http: //...../queryItems.action? id=001&type=T01 REST的url风格: http: //..../items/001 特点: url简洁,将参数通过url传到服务端 2、http的方法规范 不管是删除、添加、更新。 。 使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加。 。 。 后台controller方法: 判断http方法,如果是delete执行删除,如果是post执行添加。 3、对http的contentType规范 请求时指定contentType,要json数据,设置成json格式的type。 。 9.2REST的例子 9.2.1需求 查询商品信息,返回json数据。 9.2.2controller 定义方法,进行url映射使用REST风格的url,将查询商品信息的id传入controller. 输出json使用@ResponseBody将java对象输出json。 @RequestMapping(value="/itemsView/{id}"): {×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。 @PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。 如果RequestMapping中表示为"/itemsView/{id}",id和形参名称一致,@PathVariable不用指定名称。 9.2.3REST方法的前端控制器配置 在web.xml配置: 9.3对静态资源的解析 配置前端控制器的url-parttern中指定/,对静态资源的解析出现问题: 在springmvc.xml中添加静态资源解析方法。 10拦截器 10.1拦截定义 定义拦截器,实现HandlerInterceptor接口。 接口中提供三个方法。 publicclassHandlerInterceptor1implementsHandlerInterceptor{ //进入Handler方法之前执行 //用于身份认证、身份授权 //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行 @Override publicbooleanpreHandle(HttpServletRequestrequest, HttpServletResponseresponse,Objecthandler)throwsException{ //returnfalse表示拦截学生信息:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- springmvc 高级 知识
![提示](https://static.bdocx.com/images/bang_tan.gif)