springmvc概述(5)(异常,上传图片,传入传出json)
1 异常处理
ps:通过实现框架的异常解析接口,将程序出现的异常处理交给异常处理器具体处理。
(可以通过自定义一个统一的异常类,也可以分别自定义多个异常类,在异常处理器中具体处理)
实现原理:前端调度器,会将所有程序调度的异常捕获,然后交给异常处理器具体处理。
1.1 异常处理思路
系统中异常包括两类:
预期异常和运行时异常RuntimeException,
前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
1.2 自定义异常类
对不同的异常类型定义异常类,继承Exception。

1.3 全局异常处理器
思路:
系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。
全局异常处理器处理思路:
解析出异常类型
如果该 异常类型是自定义的(预期)异常,直接取出异常信息,在错误页面展示
如果该 异常类型不是自定义(运行时)的异常,构造一个自定义的异常类型(信息为“未知错误”)
springmvc提供一个HandlerExceptionResolver接口:

@Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //handler就是处理器适配器要执行Handler对象(只有method)
// 1,解析出异常类型(简单形式) // 如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示 // String message = null; // if(ex instanceof CustomException){ // message = ((CustomException)ex).getMessage(); // }else{ //// 如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”) // message="未知错误"; // }
//2,上边代码变为(这种方式更好) 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; }
1.4 错误页面

1.5 在springmvc.xml配置全局异常处理器

1.6 异常测试
可以在controller、service、dao中任意一处需要手动抛出异常。如果是程序中手动抛出的异常,在错误页面中显示自定义的异常信息,
如果不是手动抛出异常说明是一个运行时异常,在错误页面只显示“未知错误”。(ps:因为运行异常不知道相关业务信息错误)
在商品修改的controller方法中抛出异常 :
@RequestMapping(value = "/editItems", method = { RequestMethod.POST, RequestMethod.GET }) // @RequestParam里边指定request传入参数名称和形参进行绑定。 // 通过required属性指定参数是否必须要传入 // 通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。 public String editItems(Model model, @RequestParam(value = "id", required = true) Integer items_id) throws Exception { // 调用service根据商品id查询商品信息 ItemsCustom itemsCustom = itemsService.findItemsById(items_id); //判断商品是否为空,根据id没有查询到商品,抛出异常,提示用户商品信息不存 在 // if(itemsCustom == null){ // throw new CustomException("修改的商品信息不存在!"); // } // 通过形参中的model将model数据传到页面 // 相当于modelAndView.addObject方法 model.addAttribute("items", itemsCustom); return "items/editItems"; }
ps:因为可以将异常统一交给异常处理器处理,那么我们可以在任何地方抛出异常
在service业务中抛出异常:

具体在哪一层抛出异常比较好:
如果与业务功能相关的异常,建议在service中抛出异常。
与业务功能没有关系的异常,建议在controller中抛出。(比如参数验证的异常)
上边测试的情况,建议在service中抛出异常。
2 上传图片
2.1 需求
在修改商品页面,添加上传商品图片功能。
2.2 springmvc中对多部件类型解析
如果上传图片,在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。
在springmvc.xml中配置multipart类型解析器。

2.3 加入上传图片的jar
上边的解析内部使用下边的jar进行图片上传。

2.4 创建图片虚拟 目录 存储图片
通过图形界面配置:

也可以直接修改tomcat的配置:
在conf/server.xml文件,添加虚拟 目录 :

注意:在图片虚拟目录 中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。
2.5 上传图片代码
2.5.1 页面

2.5.2 controller方法
修改:商品修改controller方法:

3 json数据交互
3.1 为什么要进行json数据交互
json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。
比如:webservice接口,传输json数据.
3.2 springmvc进行json交互

1、请求json、输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。 2、请求key/value、输出json。此方法比较常用。
3.3 环境准备
3.3.1 加载json转的jar包
springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用下边的包进行json转),如下:

3.3.2 配置json转换器
在注解适配器中加入messageConverters
<!--注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> </list> </property> </bean>
注意:如果使用<mvc:annotation-driven /> 则不用定义上边的内容。
3.4 json交互测试
3.4.1 输入json串,输出是json串
3.4.1.1 jsp页面
使用jquery的ajax提交json串,对输出的json结果进行解析。
3.4.1.2 controller
3.4.1.3 测试结果

3.4.2 输入key/value,输出是json串
3.4.2.1 jsp页面
使用jquery的ajax提交key/value串,对输出的json结果进行解析。
3.4.2.2 controller
3.4.2.3 测试


浙公网安备 33010602011771号