1.必填项
<td><input class="easyui-textbox" type="text" name="title" data-options="required:true" style="width: 280px;"></input></td>
2.数据有效性校验
<td><input class="easyui-numberbox" type="text" name="priceView" data-options="min:1,max:99999999,precision:2,required:true" />
$.post("/item/save",$("#itemAddForm").serialize(), function(data){
if(data.status == 200){
$.messager.alert('提示','新增商品成功!');
}else{
$.messager.alert("提示","新增商品失败!");
}
});
说明:由于该VO对象是系统的全局的VO对象,所以放到jt-common中更好.
package com.jt.vo;
import ch.qos.logback.core.rolling.helper.IntegerTokenConverter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/*
该VO对象是系统返回值VO对象.主要包含3个属性
1.定义状态码 200表示执行成功 201 执行失败 人为定义的(和浏览器没关系)业务定义.
2.定义返回值信息 服务器可能会给用户一些提示信息. 例如 执行成功,用户名或密码错误等
3.定义返回值对象 服务器在后端处理完成业务之后,将对象返回给前端.
*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class SysResult {
private Integer status; //200成功 201失败
private String msg; //服务器提示信息
private Object data; //服务器返回前端的业务数据.
/**
* 为了简化用户的调用过程.准备了一些工具API,
* 用户的关注点: 1.执行成功 2.执行失败
*/
public static SysResult fail(){
return new SysResult(201,"业务执行失败",null);
}
public static SysResult success(){//只标识成功!不携带数据
return new SysResult(200,"业务执行成功",null);
}
//bug: 将String当做响应数据,回传给客户端.
//注意事项: 写工具API方法时切记方法重载千万不要耦合.
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.url地址: http://localhost:8091/item/save
* 2.请求参数: 整个form表单
* 3.返回值结果: SysResult对象
*
* 复习: 页面中的参数是如何通过SpringMVC为属性赋值???
* 分析: 页面参数提交 一般方式3种 1.form表单提交 2.ajax页面提交 3.a标签 参数提交
* 页面参数提交一般都会遵守协议规范 key=value
* 分析2: SpringMVC的底层实现servlet. 包含了2大请求对象 request对象/response对象
* servlet如何获取数据?????
* 规则: 参数提交的名称与mvc中接受参数的名称必须一致!!!!
*/
@RequestMapping("/save")
public SysResult saveItem(Item item){
//1.利用对象的get方法,获取对象的属性的信息
//item.getId()---->get去除------获取id的属性(大小写忽略);
//之后将获取到的值利用对象的set方法为属性赋值.
//request.getParameter("id")
try {
itemService.saveItem(item);
return SysResult.success();
}catch (Exception e){
e.printStackTrace();
return SysResult.fail();
}
}
/**
* 实现商品信息的入库操作
* 入库之前需要提前将数据补全. 刚新增的商品应该处于上架状态1
* @param item
* 注意事项:完成数据库更新操作时,需要注意数据库事务问题
*/
@Override
@Transactional
public void saveItem(Item item) {
//保证入库的时间一致
item.setStatus(1).setCreated(new Date()).setUpdated(item.getCreated());
itemMapper.insert(item);
}
package com.jt.aop;
import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice //定义异常处理的通知. 只拦截Controller层抛出的异常. 并且返回值JSON串
public class SystemExceptionAOP {
@ExceptionHandler(RuntimeException.class)
public Object fail(Exception e){
//打印异常信息
e.printStackTrace();
return SysResult.fail();
}
}
/**
* 完成商品信息修改
* url:http://localhost:8091/item/update
* 参数: 整个商品表单
* 返回值: SysResult对象
*/
@RequestMapping("/update")
public SysResult updateItem(Item item){
itemService.updateItem(item);
return SysResult.success();
}
@Override
@Transactional
public void updateItem(Item item) {
item.setUpdated(new Date());
//根据对象中不为null的元素充当set条件. 主键充当where条件.
itemMapper.updateById(item);
}
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//设定自动填充的属性和属性值
this.setInsertFieldValByName("created",new Date(),metaObject);
this.setInsertFieldValByName("updated",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setInsertFieldValByName("updated",new Date(),metaObject);
}
}
/**
* 业务需求: 完成商品删除操作
* url请求地址: /item/delete
* 参数: ids= id1,id2 串
* 返回值结果: SysResult对象
* SpringMVC知识点: 可以根据制定的类型动态的实现参数类型的转化.
* 如果字符串使用","号分隔,则可以使用数组的方式接参.
*/
@RequestMapping("/delete")
public SysResult deleteItems(Long[] ids){
itemService.deleteItems(ids);
return SysResult.success();
}
//1.利用MP方式完成.
//2.利用Sql方式动态拼接完成.
//利用批量执行的方式进行操作.
//sql: delete from tb_item where id in (id1,id2,id3...)
@Override
public void deleteItems(Long[] ids) {
//方式1:将数组转化为list集合
//List idList = Arrays.asList(ids);
//itemMapper.deleteBatchIds(idList);
//方式2:利用手写sql完成.
itemMapper.deleteItems(ids);
}
1.编辑Mapper
/**
* 问题:为什么Mybatis需要将参数封装为Map??????
* 答案:Mybatis 规定 一般的参数只能进行单值传参,不能多值传参.
* 但是有时业务需要必须进行多值传递.那么这时需要将多值,封装为单值.
* 为了解决多值传参的问题,则Mybatis提供了@Param注解,其作用将参数封装为Map集合.
*
* @Param("ids") Long[] ids 将参数封装为Map集合. 其中@Params中的ids当做key.参数当做value
*
* @param ids
*/
void deleteItems(Long[] ids);
2.编辑Mapper配置文件
<mapper namespace="com.jt.mapper.ItemMapper">
<!--完成商品的删除
void deleteItems(Long[] ids); 接口方法
sql: delete from tb_item where id in (id1,id2,id3...)
collection:
分类1: List集合 collection="list"
分类2: Array数组 collection="array"
分类3: Map集合 collection="map中的key" 规范
-->
<delete id="deleteItems">
delete from tb_item where id in (
<!--循环遍历数组,之后获取其中的数据,完成删除.-->
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
</mapper>