SpringMVC学习总结-3

SpringMVC学习总结-3          

-------------------------------------

1. 复杂类型 参数绑定
· 包装类 
页面控件name=属性.属性 传参
为什么要用包装类?灵活,不要动原PO类,因为他是mybatis逆向生成的,你再手动添加属性的话下次逆向生成会全覆盖。而且包装类超级灵活,不用继承,而是通过组件的方式把可能需要的po类都封装起来,只传想要的属性就OK。
· 数组
情景: checkbox 多选框批量删除。
直接在controller形参中用数组接收,然后每一个多选框的name都一样即表示数组。
· list集合绑定 List<pojo>
情景:批量修改商品
list集合属性名[下标].元素属性名
itemsList[${status.index}].name
包装类的属性名+JSTL提供的foreach下标标记+集合元素的属性名


2. 数据校验
前端校验: js校验
服务端校验:
控制层controller:校验 页面请求参数的合法性,不区分客户类型(浏览器,手机客户端,远程调用)
业务层service:(实际开发应用较多) 主要校验关键业务参数,仅限于service接口中使用的参数。
持久层dao/mapper: 一般不校验

springMVC校验

springMVC使用hibernate的校验框架validation(和hibernate没有关系,只是用了它提供的一个校验框架).
校验思路:
页面提交请求参数到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。
具体需求:
商品修改,添加校验(商品名称长度,生产日期非空校验),如果校验出错,在商品修改页面显示错误信息。

①hibernate校验框架所需jar包:
hibernate-validate-xxx.jar
validation-api-xxx.jar
jboss-logging-xxx.jar

②springmvc-config.xml中配置校验器。
③ 使用注解注入POJO类
@Size(min=1,max=30,message="{xx.xx.length.error}")
@NotNull(message="{xx.xx.isNull}")
④ 在需要校验的pojo(形参)前边添加Validated,在需要交验的pojo(形参)后边添加BindingResult bindingResult接收校验出错信息
注意,@Validated 和BindingResult是配对出现!
⑤ 获取校验错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
for(ObjectError objectError:allErrors) {
//打印错误信息
System.out.println(objectError.getDefaultMessage());
}
//将错误信息传到页面
model.addAttribute("allErrors",allErrors);
return "出错重新到原页面";
}
⑥ 页面显示错误信息
<c:if test="${allErrors!=null}">
<c:forEach items="${allErrors}" var="error">
${error.defaultMessage}
</c:forEach>
</c:if>

· 分组校验
在Pojo中定义校验规则,而pojo是被多个controller所公用,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。

解决方法:
定义多个校验分组(其实是一个java接口),分组中定义有哪些规则
每个controller方法使用不同的校验分组。

定义校验分组接口 validGroup1
在pojo属性的校验规则中添加分组:
@Size(min=1,max=30,message="{xx.xx.length.error}",groups={ValidGroup1.class})
在controller方法使用指定分组的校验
@Validated(value={ValidGroup1.class})

 

3. 数据回显
其实就是controller 中得到的数据 传到页面。
· 使用model :model.addAttribute(key,value);
· 使用request
· 使用注解
@ModelAttribute(key)指定pojo回显到页面request中的key.
补充:
@ModelAttribute 还可以将方法的返回值传到页面
@ModelAtrribute(key)
public Map<String,String> xxxXxx(){
return map;
}
虽然这个方法通过url没有办法请求,但是我们在页面上就可以获取到。
页面通过<select>标签获取
<select name="")
<c:forEach items="${key}" var="item">
...
</c:forEach>
</select>

4. springMVC异常处理-全局异常处理器开发
系统中异常包括两类:预期异常和运行时异常RuntimeException,
前者通过捕获异常解决,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

dao发生异常抛给service,service抛给controller,controller抛给DispatcherServlet,最后由 前端控制器 交由异常处理器进行异常处理。
springMVC提供全局异常处理器进行统一的异常处理
思路:
如果该异常时系统自定义异常,直接取出异常信息,在错误页面展示
如果该异常不是系统自定义异常,构造一个自定义的异常类型(信息为“未知错误”)
public class CustomExceptionResolve implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) {
CustomException customException = null;
if(ex instanceof CustomException) {
customException = (CustomException)ex;
}else{
customException = new CustomException("未知错误");
}
String message = customException.getMessage();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message",message);
modelAndView.setViewName("error");
return modelAndView;
}
}
error.jsp : ${message}

最后在springmvc.xml配置全局异常处理
<bean class="xx.xx.exception.CustomExceptionResolver"></bean>

如果与业务功能相关的异常,建议在service中抛出异常
与业务功能没有关系的异常,建议在controller中抛出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值