数据后台管理(二)产品管理
分类:
IT文章
•
2022-10-28 00:13:04
1.查询所有产品信息
从数据库ssm1中product表中查出所有的产品信息,并在页面中展示。
1.1在domain包下新建一个product类用于封装产品信息
由于数据库中的departureTime是Date类型,productStatus只是0或1,为了将这两个数据也展示在页面上在product类中需要新加两个String类型的成员变量departureTimeStr和productStatusStr,将原先的两个变量封装成String类型。
1 package club.nipengfei.domain;
2
3 import club.nipengfei.utils.DateUtils;
4
5 import java.util.Date;
6
7 public class Product {
8 private String id; // 主键
9 private String productNum; // 编号 唯一
10 private String productName; // 名称
11 private String cityName; // 出发城市
12 private Date departureTime; // 出发时间
13 private String departureTimeStr;
14 private double productPrice; // 产品价格
15 private String productDesc; // 产品描述
16 private Integer productStatus; // 状态 0 关闭 1 开启
17 private String productStatusStr;
18
19 public String getId() {
20 return id;
21 }
22
23 public void setId(String id) {
24 this.id = id;
25 }
26
27 public String getProductNum() {
28 return productNum;
29 }
30
31 public void setProductNum(String productNum) {
32 this.productNum = productNum;
33 }
34
35 public String getProductName() {
36 return productName;
37 }
38
39 public void setProductName(String productName) {
40 this.productName = productName;
41 }
42
43 public String getCityName() {
44 return cityName;
45 }
46
47 public void setCityName(String cityName) {
48 this.cityName = cityName;
49 }
50
51 public Date getDepartureTime() {
52 return departureTime;
53 }
54
55 public void setDepartureTime(Date departureTime) {
56 this.departureTime = departureTime;
57 }
58
59 public String getDepartureTimeStr() {
60 if (departureTime != null){
61 departureTimeStr = DateUtils.date2String(departureTime,"yyyy-MM-dd HH:mm:ss");
62 }
63 return departureTimeStr;
64 }
65
66 public void setDepartureTimeStr(String departureTimeStr) {
67 this.departureTimeStr = departureTimeStr;
68 }
69
70 public double getProductPrice() {
71 return productPrice;
72 }
73
74 public void setProductPrice(double productPrice) {
75 this.productPrice = productPrice;
76 }
77
78 public String getProductDesc() {
79 return productDesc;
80 }
81
82 public void setProductDesc(String productDesc) {
83 this.productDesc = productDesc;
84 }
85
86 public Integer getProductStatus() {
87 return productStatus;
88 }
89
90 public void setProductStatus(Integer productStatus) {
91 this.productStatus = productStatus;
92 }
93
94 public String getProductStatusStr() {
95 if (productStatus == 0){
96 productStatusStr="关闭";
97 }else if (productStatus == 1){
98 productStatusStr="开启";
99 }
100 return productStatusStr;
101 }
102
103 public void setProductStatusStr(String productStatusStr) {
104 this.productStatusStr = productStatusStr;
105 }
106 }
View Code
其中有使用到将Date类型的日期转换成String类型的工具类DateUtils
1 package club.nipengfei.utils;
2
3 import java.text.SimpleDateFormat;
4 import java.util.Date;
5
6 public class DateUtils {
7
8 /**
9 * 将date转换成patt的字符串形式
10 * @param date
11 * @param patt
12 * @return
13 */
14 public static String date2String(Date date,String patt){
15 SimpleDateFormat sdf = new SimpleDateFormat(patt);
16 String format = sdf.format(date);
17 return format;
18 }
19 }
View Code
1.2在dao包下新建一个IProductDao接口,写一个findAll方法并通过@Select注解写入查询数据的sql语句
1 package club.nipengfei.dao;
2
3 import club.nipengfei.domain.Product;
4 import org.apache.ibatis.annotations.Select;
5
6 import java.util.List;
7
8 public interface IProductDao {
9 /**
10 * 查询所有产品
11 * @return
12 */
13 @Select("select * from product")
14 List<Product> findAll() throws Exception;
15 }
View Code
1.3在service包下新建一个IProductService接口,并在impl包下新建一个ProductServiceImpl实现IProductService接口
1 package club.nipengfei.service.impl;
2
3 import club.nipengfei.dao.IProductDao;
4 import club.nipengfei.domain.Product;
5 import club.nipengfei.service.IProductService;
6 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.stereotype.Service;
8 import org.springframework.transaction.annotation.Transactional;
9
10 import java.util.List;
11
12 @Service
13 @Transactional
14 public class ProductServiceImpl implements IProductService{
15
16 @Autowired
17 private IProductDao productDao;
18
19 public List<Product> findAll() throws Exception {
20 return productDao.findAll();
21 }
22 }
View Code
1.4在controller包下新建一个ProductController类,写一个findAll方法
由于该方法是从数据库中查询产品信息,返回给前端product-list.jsp页面,因此返回值类型是ModelAndView。将查询的信息product列表添加到ModelAndView类生成的对象中,其中对象的参数attributeName需要与前端页面一致。
1 package club.nipengfei.controller;
2
3 import club.nipengfei.domain.Product;
4 import club.nipengfei.service.impl.ProductServiceImpl;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.RequestMapping;
8 import org.springframework.web.servlet.ModelAndView;
9
10 import java.util.List;
11
12 @Controller
13 @RequestMapping("/product")
14 public class ProductController {
15
16 @Autowired
17 private ProductServiceImpl productService;
18
19 @RequestMapping("/findAll.do")
20 public ModelAndView findAll() throws Exception {
21 ModelAndView mv = new ModelAndView();
22 List<Product> ps = productService.findAll();
23 mv.addObject("productList",ps);
24 mv.setViewName("product-list");
25 return mv;
26 }
27 }
View Code
1.5前端页面显示(部分)
1 <c:forEach items="${productList}" var="product">
2
3 <tr>
4 <td><input name="ids" type="checkbox"></td>
5 <td>${product.id }</td>
6 <td>${product.productNum }</td>
7 <td>${product.productName }</td>
8 <td>${product.cityName }</td>
9 <td>${product.departureTimeStr }</td>
10 <td class="text-center">${product.productPrice }</td>
11 <td>${product.productDesc }</td>
12 <td class="text-center">${product.productStatusStr }</td>
13 <td class="text-center">
14 <button type="button" class="btn bg-olive btn-xs">订单</button>
15 <button type="button" class="btn bg-olive btn-xs">详情</button>
16 <button type="button" class="btn bg-olive btn-xs">编辑</button>
17 </td>
18 </tr>
19 </c:forEach>
View Code
1.6出现的问题:报500错误
当运行该项目时发现报500错误,查询发现该错误是服务器内部错误,于是我在pages包下新建一个hello.jsp页面,将index.jsp页面中的跳转改为pages/hello.jsp发现能够正常访问,后来发现错误原因是在main.jsp页面中引入了aside.jsp,而该页面中有使用spring-security的标签,而我的pom.xml中的坐标是ssm框架整合用到的一些基本坐标没有有关spring-security的坐标,于是我在pom.xml中引入了这部分的坐标发现能够正常访问。

2.保存产品信息
将前端页面product-add.jsp页面填写的产品信息保存到数据库中,并将保存好后的产品信息展示
2.1在IProduceDao接口中写一个save方法,并通过@Insert注解写入插入数据的sql语句
由于是一个保存数据的方法,因此需要给save方法传入一个product参数
1 package club.nipengfei.dao;
2
3 import club.nipengfei.domain.Product;
4 import org.apache.ibatis.annotations.Insert;
5 import org.apache.ibatis.annotations.Select;
6
7 import java.util.List;
8
9 public interface IProductDao {
10 /**
11 * 查询所有产品
12 * @return
13 */
14 @Select("select * from product")
15 List<Product> findAll() throws Exception;
16
17 @Insert("insert into product (productNum,productName,cityName,departureTime,productPrice,productDesc,productStatus) values(#{productNum},#{productName},#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})")
18 void save(Product product)throws Exception;
19 }
View Code
2.2在ProductServiceImpl类中写一个save方法
1 package club.nipengfei.service.impl;
2
3 import club.nipengfei.dao.IProductDao;
4 import club.nipengfei.domain.Product;
5 import club.nipengfei.service.IProductService;
6 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.stereotype.Service;
8 import org.springframework.transaction.annotation.Transactional;
9
10 import java.util.List;
11
12 @Service
13 @Transactional
14 public class ProductServiceImpl implements IProductService{
15
16 @Autowired
17 private IProductDao productDao;
18
19 public List<Product> findAll() throws Exception {
20 return productDao.findAll();
21 }
22
23 public void save(Product product) throws Exception {
24 productDao.save(product);
25 }
26 }
View Code
2.3在ProductController类中写一个save方法
由于当我们点击保存按钮提交表单信息后,需要重新从数据库中查询产品信息展示在product-list.jsp页面中,因此该方法的返回值类型是String,值为"redirect:findAll.do"
1 package club.nipengfei.controller;
2
3 import club.nipengfei.domain.Product;
4 import club.nipengfei.service.impl.ProductServiceImpl;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.RequestMapping;
8 import org.springframework.web.servlet.ModelAndView;
9
10 import java.util.List;
11
12 @Controller
13 @RequestMapping("/product")
14 public class ProductController {
15
16 @Autowired
17 private ProductServiceImpl productService;
18
19 @RequestMapping("/findAll.do")
20 public ModelAndView findAll() throws Exception {
21 ModelAndView mv = new ModelAndView();
22 List<Product> ps = productService.findAll();
23 mv.addObject("productList",ps);
24 mv.setViewName("product-list");
25 return mv;
26 }
27
28 @RequestMapping("/save.do")
29 public String save(Product product) throws Exception {
30 productService.save(product);
31 return "redirect:findAll.do";
32 }
33 }
View Code
2.4出现的问题:报400错误
当运行该项目时没有报错,但是当填好表单信息提交时出现http400的错误,该错误的出现表示请求无效,传递给后台的数据有问题。

查看IDEA控制台的错误信息:


说明在封装product时出现错误,表单提交的是String类型的日期数据,但是product中departureTime是Date类型,需要将String类型的转换成Date类型。
可以直接在product类中的departureTime属性加上注解@DateTimeFormat(pattern="yyyy-MM-dd HH:mm"),给注解使接收到的pattern类型的字符串转换成Date类型。参考:https://blog.****.net/java_zhangshuai/article/details/95951400