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       上传图片

补充:html选择图片后预览,保存并上传

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             测试

 

posted @ 2018-06-17 13:12  假程序猿  阅读(168)  评论(0)    收藏  举报