注:这是根据老师上课的内容做的课程项目笔记,项目资源是老师发的,不是本人的项目资源
上篇文章完成了查询所有商品类型的分页栏,这篇文章实现对商品类型的增删改停用启用。
添加商品类型
要求:点击添加按钮之后会显示弹出框,在弹出框中中输入要添加的商品类型名称,如果这个商品类型名称已经存在了就弹出提示框提示商品类型已存在,否则添加成功,id会默认生成,状态值默认是启用状态。
可以封装一个相应结果类,该类用于统一返回结果类型(返回值类型如果可以是对象就最好是对象类型),该类有三个属性:状态码(操作成功与否)、消息、数据。
-
在常量中添加供相应结果集使用的状态码和商品类型的启用停用状态码
-
创建相应结果集
在common模块下创建包utils,创建类ResponseResults,该类中有以下属性,再添加一下属性的get/set方法和构造方法
//状态
private Integer status;
//消息
private String message;
//数据
private Object data;
//操作成功时返回的相应结果集中的状态码是1
public static ResponseResults success(Object object) {
return new ResponseResults(Constant.RESPONSE_STATUS_SUCCESS, "success", object);
}
创建dao层的方法
添加商品类型,如果输入的商品名称存在就添加失败,因此这个操作需要在dao中写两个方法,插入商品类型的方法和根据商品名称查找商品的方法
- 在dao的接口中创建添加商品类型的方法和根据商品类型名称查找商品的方法,传入的参数是商品类型的名称和状态(状态默认是启用状态)
注意:Mybatis默认只能传一个参数,如果要传多个参数就要对参数进行指定,使用@Param指定当前参数对应的是哪个字段
//添加产品类型
public void insertType(@Param("name") String name, @Param("status") Integer status);
//根据商品类型名称查找商品类型
public ProductType selectByName(String ProductTypeName);
- 在mapper中实现该方法
<!--添加产品类型
public void insertType(@Param("name") String name, @Param("status") Integer status);-->
<insert id="insertType">
insert
(name ,status)
values
(#{name},#{status})
</insert>
<!-- 根据商品类型名称查找商品类型
public ProductType selectByName(String ProductTypeName);-->
<select id="selectByName" resultType="com.zte.shop_parent.pojo.ProductType">
select
name,id,status
from
t_product_type
</select>
创建service层代码
在service层创建添加商品类型的方法,如果要添加的商品类型不存在就抛出商品不存在异常。
- 在common模块下创建一个存放异常的包exception,在该包下创建名为ProductNotExistException的异常
注意:创建异常的时候可以继承Exception,然后调用父类的几个构造方法完成创建
- 在service接口中添加新增的方法:
- 创建service接口的实现类中的添加方法:
/*添加商品类型,如果添加的商品类型名称存在就抛出异常,否则添加至数据库中*/
@Override
public void add(String productTypeName) throws ProductTypeNotExistException {
ProductType productType = productTypeDao.selectByName(productTypeName);
if (productType != null) {
throw new ProductTypeNotExistException("商品类型已经存在");
}else {
productTypeDao.insertType(productTypeName, Constant.PRODUCT_STATUS_START);
}
}
创建controller层代码
在web模块中的ProductTypeController的方法中添加添加商品类型的方法,该方法返回的是之前创建的返回结果类。
@RequestMapping("/add")
@ResponseBody
public ResponseResults add(String productName) {
ResponseResults responseResults = new ResponseResults();
try {
productTypeService.add(productName);
responseResults.setStatus(Constant.RESPONSE_STATUS_SUCCESS);
responseResults.setMessage("添加成功");
} catch (ProductTypeNotExistException e) {
responseResults.setStatus(Constant.RESPONSE_STATUS_FALTUER);
responseResults.setMessage("已存在该商品类型名称");
}
return responseResults;
}
注意:
- @ResponseBody:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。 当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。
- 由于return的是一个对象,想要把返回的对象转换为json数组需要导入fastjson jar包,因为父模块中已经导入该jar包了,所以导入jar包不需要指定版本。
添加了jar包之后还要再在spring-mvc配置文件中配置消息转换器,将对象转换为json数组类型
创建web代码
在前端展示的页面中,点击“添加商品类型”按钮之后会弹出一个弹出框,在弹出框中输入要添加的商品类型的名称之后点击“添加”按钮,执行操作。
要为“添加”按钮设置一个点击事件,使点击添加时,获取输入的值,把输入的值传到controller模块中,调用controller层中添加商品类型的方法实现添加操作。
- 为“添加”按钮设置点击事件
- 写一个脚本实现这个函数,这个函数是一个点击之后触发的函数,不需要写在初始化的方法中去,要为其另外写一个方法
post中第一个参数是请求的路径,第二个表示获取控件id为productType中输入的数据,将该数据传递给变量name,后端获取数据找到的就是name,第三个参数就是执行之后的回调函数。
注意: - 之所以可以在该js中使用这样的请求路径是因为这是一个jsp文件,可以识别,如果是单纯的js文件就不能识别了
- 前端传入的数据放在的变量名为name的变量中,后端获取的数据也要是name,不能是其他的名称,否则是找不到的。
此时controller方法中的参数是productName而不死name,这种情况有两种解决办法:
- 把controller中add方法的参数名称改为name
- 在参数中使用注解,将该参数名称与name绑定,将name中的值注入到productName中
遇到错误
错误1:
错误描述:商品类型无法添加,在controller层的add方法中打断点发现传入的参数值为空
错误原因及解决方法:获取的id控件获取错了
错误2:
错误解决之后,在前端页面添加“美妆”类型,在数据库中可以看到刚刚添加的商品类型,且只能添加一次