乐趣区

关于异常处理:第三阶段-Day06-图片回显-异常处理机制

1 商品后盾治理

1.1 动静实现商品分类展示

1.1.1 异步树加载控件阐明

1). 树形控件树形

` 每个节点都具备以下属性:id:节点 ID,对加载近程数据很重要。text:显示节点文本。state:节点状态,'open' 或 'closed',默认:'open'。如果为 'closed' 的时候,将不主动开展该节点。checked:示意该节点是否被选中。attributes: 被增加到节点的自定义属性。children: 一个节点数组申明了若干节点。` 

2). 异步树阐明
树控件读取 URL。子节点的加载依赖于父节点的状态。当开展一个关闭的节点,如果节点没有加载子节点,它将会把节点 id 的值作为 http 申请参数并命名为’id’,通过 URL 发送到服务器下面检索子节点。
如果用户点击父节点须要开展子节点时, 会将父节点的 id 的值当做参数传递.

1.1.2 编辑 ItemCatController(形式一)

 `/**
     * 业务需要: 用户通过 ajax 申请, 动静获取树形构造的数据.
     * url:  http://localhost:8091/item/cat/list
     * 参数: 只查问一级商品分类信息   parentId = 0
     * 返回值后果:  List<EasyUITree>
     *
     *  注意事项:
     *          1. 树形构造初始化时不会传递任何信息. 只有开展子节点时传递 Id
     *          2. 页面传递什么样的数据, 后端必须接管什么样的数据
     *
     *  id: 296
     */
    @RequestMapping("/list")
    public List<EasyUITree> findItemCatList(Long id){Long parentId = (id==null?0L:id);
        return itemCatService.findItemCatList(parentId);
    }` 

1.1.3 编辑 ItemCatController(形式二)

能够利用注解动静获取参数, 并且实现转化.

`//2. 个别写业务须要见名知意
    @RequestMapping("/list")
    public List<EasyUITree> findItemCatList(@RequestParam(value = "id",defaultValue = "0") Long parentId){

        // 形式 1
        //Long parentId = (id==null?0L:id);
        return itemCatService.findItemCatList(parentId);
    }` 

1.2 对于 SpringMVC 参数传递阐明

`/**
     * 页面参数:  http:// 申请门路:/ 办法名称 ?id=1  name="tomcat"
     * 对象:   1.request 对象 页面给服务器参数  2.response 对象 服务器给页面的响应数据.
     *
     * @param id
     * @param name
     * @return
     */
    @RequestMapping("/xxxx")
    public String xxx(Long id, String name, Item item){

        /*
        1. 根本类型属性赋值.
        String id = request.getParameter("id");
        Long idLong = Long.valueOf(id);
        String strArray = request.getParameter("array");
        String[]  strArrays = strArray.split(",");
        String name = request.getParameter("namexxxxx");*/
        //2. 利用 item 对象获取属性
        /*item.getId() ~~~~ 去除 get 的前缀~~~~~~~Id~~ 首字母小写~~~"id"
        String id = request.getParameter("id");
        id---- 封装 set 办法 ---- 执行业务调用 item.setId(id);
        Item.......*/
    }` 


总结:
1. 正确编辑 html 标签 name 属性必须书写正确 个别条件下与 pojo 属性雷同.
2. 参数接管时, 校验属性的类型及属性名称是否正确. POJO 属性必须写包装类型.
3. 有些特定的属性能够利用 SpringMVC 进行动静的转化 数组 /list 汇合 /map 汇合等.

1.3 商品新增

1.3.1 页面剖析

1).url 剖析

2). 参数剖析

3). 页面 JS 剖析

 `/*
           * $.post(url 地址, 参数, 回调函数)
           ajax 参数传递的类型有几种:
                1.json 格局  {"id":"1","name":"tomcat"}
                2. 字符串拼接 "id=1&name='tomcat'"
        */
        $.post("/item/save",$("#itemAddForm").serialize(), function(data){if(data.status == 200){$.messager.alert('提醒','新增商品胜利!');
            }else{$.messager.alert("提醒","新增商品失败!");
            }
        });` 


1.3.2 SysResult VO 对象的创立

`package com.jt.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

//SysResult 次要的目标是为了与页面进行交互.  ajax/json
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class SysResult {

    private Integer status;  //200 胜利   201 失败
    private String  msg;     // 服务器提示信息   胜利  失败
    private Object  data;    // 服务器返回值数据.

    // 能够利用 static 的静态方法 将数据动静返回
    public static SysResult fail(){return new SysResult(201, "业务执行失败", null);
    }

    /**
     *  1. 只须要返回状态码信息   200
     *  2. 须要返状态及业务数据   200/data
     *  3. 返回提示信息 /data 业务数据
     * @return
     */
    public static SysResult success(){return new SysResult(200, "业务执行胜利!", null);
    }
    //String json = "{key:value}"
    public static SysResult success(Object data){return new SysResult(200, "业务执行胜利!", data);
    }

    // 只想返回提示信息
    public static SysResult success(String msg,Object data){return new SysResult(200, msg, data);
    }
}` 


1.3.3 编辑 ItemController

`@RequestMapping("/save")
    public SysResult saveItem(Item item){
        try {itemService.saveItem(item);
            return SysResult.success();}catch (Exception e){e.printStackTrace();
            return SysResult.fail();}
    }` 


1.3.4 编辑 ItemService

`@Override
    public void saveItem(Item item) {
        // 思考: 如果每次编辑数据库 每次都须要操作公共的属性...
        Date date = new Date();
        item.setStatus(1).setCreated(date).setUpdated(date);
        itemMapper.insert(item);
    }` 

1.4 全局异样解决机制

1.4.1 业务需要

如果再代码中频繁的增加 try-cache 那么导致代码的可读性差, 代码的不易保护…
例如:

1.4.2 定义全局异样的解决机制

`package com.jt.aop;

import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLException;

//@ControllerAdvice  // 拦挡 controller 层
//@ResponseBody
@RestControllerAdvice   // 定义全局异样的解决类   AOP= 异样告诉
public class SystemAOP {

    /**
     *  定义全局异样的办法  当遇到了什么异样时, 程序开始执行   参数个别 class 类型
     *  如果一旦产生异样, 则应该输入异样的信息, 之后返回谬误数据即可.
     */
    @ExceptionHandler({RuntimeException.class})
    public Object systemAop(Exception e){e.printStackTrace();
        return SysResult.fail();}
}` 


1.5 属性主动填充性能

1.5.1 MP 主动填充阐明

`//pojo 基类,实现 2 个工作,2 个日期,实现序列化
@Data
@Accessors(chain=true)
public class BasePojo implements Serializable{@TableField(fill = FieldFill.INSERT) // 入库时主动增加
    private Date created;
    @TableField(fill = FieldFill.INSERT_UPDATE) // 入库 / 更新操作主动增加
    private Date updated;

}` 


1.5.2 代码主动填充性能

阐明: 在 jt-common 中增加代码主动填充的代码…

`package com.jt.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component  // 将对象交给 spring 容器治理
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {Date date = new Date(); // 保障工夫统一
        this.setInsertFieldValByName("created", date,metaObject);
        this.setInsertFieldValByName("updated", date,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {this.setUpdateFieldValByName("updated", new Date(), metaObject);

    }
}` 


1.6 商品分类目录的回显 - 更新操作

1.6.1 页面 js 剖析

1.6.2 页面成果展示

退出移动版