JavaWeb学习笔记五:商品增删改查操作:解决jsp页面从域对象获取值问题,解决修改中的页面回显问题

文章目录

      • 1. JavaWeb学习笔记五:商品增删改查操作
        • 1.1. 查询商品
        • 1.2. 添加商品
        • 1.3. 删除商品
        • 1.4. 修改商品属性
        • 修改总结

1. JavaWeb学习笔记五:商品增删改查操作

1.1. 查询商品

  • 查询商品是最简单的操作,因为没有对数据进行修改,因此也不需要进行事务操作。
  • web层主要接收命令请求,调用service业务逻辑层,将后台获得的数据存储到request域中,然后转发到相应的jsp页面。
List<Product> productList=null;
AdminProductService service=new AdminProductService();
try {
		productList=service.findAllproduct();
	} catch (SQLException e) {
		e.printStackTrace();
	}
	//将productList放到request域中
request.setAttribute("productList", productList);
	//转发到jsp页面,之所以不用写web工程的名称,是因为内部的转变就不用写了。	request.getRequestDispatcher("/admin/product/list.jsp").forward(request,response);
  • service层是业务层,由于没有什么业务直接调用dao层就行了。
public List<Product> findAllproduct() throws SQLException {
		AdminProductDao dao=new AdminProductDao();
		return dao.findAllproduct();
	}
  • dao层是持久层,用来操作数据库,封装返回的数据。
public List<Product> findAllproduct() throws SQLException {
		QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
		String sql="select * from product";
		List<Product> productList =runner.query(sql, new BeanListHandler<Product>(Product.class));
		return productList;
	}
  • 前端通过JSTL和EL表达式获取request的信息。**注意:**获取图片的地址一定要绝对路径,还是动态的获取。

	
		${vs.count}
		
        

1.2. 添加商品

  • 由于用户填写的内容是通过ISO8859-1传递过来的,因此需要转码。
request.setCharacterEncoding("UTF-8");
  • 添加商品,首先要获取用户填写的数据,这里用Map的方法
//1.获取前端填写的数据
Map<String,String[]> properties=request.getParameterMap();
  • 然后封装数据到bean中,这里使用了工具类BeanUtils,可以说这个是一键封装,非常好。
		Product product=new Product();
		try {
			BeanUtils.populate(product,properties);
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
  • 封装完数据后,仍然有一些数据没有进行封装,因为添加数据时不能都添加,这时需要手动添加
//此位置Product已经封装完毕----将表单的数据封装完毕
		//手动设置表单中没有数据
		//1).private String pid;
		product.setPid(UUID.randomUUID().toString());
		//2).private String pimage
		product.setPimage("products/1/c_003.jpg");
		//3).private String pdate;这个是格式化时间
		SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
		String pdate=format.format(new Date());
		product.setPdate(pdate);
		//4).private int pflag;
		product.setPflag(0);
  • 注意:setPid()的方式,是通过UUID的方式设置的。
  • 封装完成后要将数据传递给Service层
AdminProductService service=new AdminProductService();
		try {
			service.addProduct(product);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
  • 将相应的结果,重定向到其他页面,注意重定向的写法
//跳转到列表页面
response.sendRedirect(request.getContextPath()+"/adminProdutList");
  • 然后就是service调用dao了。
public void addProduct(Product product) throws SQLException {
		QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
		String sql="insert into product values(?,?,?,?,?,?,?,?,?,?)";
		runner.update(sql,product.getPid(),product.getPname(),product.getMarket_price(),
				product.getShop_price(),product.getPimage(),product.getPdate(),product.getIs_hot(),
				product.getPdesc(),product.getPflag(),product.getCid());
	}

1.3. 删除商品

  • 首先要思考业务流程,点击删除按钮,就会执行删除操作,因此需要对jsp页面进行处理。例如当前有一条数据需要删除。当点击删除后,就执行删除,并且不会重新刷新页面,还要有提示要删除的信息。这就需要一些js代码了

在这里插入图片描述


  • **注意:**获取pro.pid时,是在循环里面获取的,一定要加上单引号,这是必须的否则会报错,被当做参数传递给js.这就变成了get提交。
function delProduction(pid){
	var isDel=confirm("您确认要删除吗?");
	if(isDel){											        location.href="${pageContext.request.contextPath}/adminDelProduct?pid="+pid;
				}
			}
  • 剩下的就是处理web层、service层、dao层了。
//web层
//获取要删除的pid
String pid=request.getParameter("pid");
AdminProductService service=new AdminProductService();
try {
	service.delProductByPid(pid);
	} catch (SQLException e) {
	e.printStackTrace();
}
//重定向到adminProductList而不是jsp因为如果重定向到jsp那么request域中没有值,那么
//就会为空,而adminProductList中有对request域进行赋值的。
response.sendRedirect(request.getContextPath()+"/adminProductList");
//dao层
QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
String sql="delete from product where pid=?";
runner.update(sql,pid);

1.4. 修改商品属性

  • 这个按说是最难的。当点击修改按钮时,要跳转到修改页面,在此修改页面上所有的内容都是可以修改的,那么这就要在修改页面上自动填写要修改物品的各个属性了,这是个难点,修改后再存储到数据库中。

JavaWeb学习笔记五:商品增删改查操作:解决jsp页面从域对象获取值问题,解决修改中的页面回显问题_第1张图片

  • 从图中可以看出首先要获取要修改商品的pid,然后根据pid再从数据库中找该物品的所有属性,然后封装到Product对象中即Bean对象。然后将Bean对象封装到request域中,再回显到修改的jsp页面,就可以修改了。下面是获取pid:

  • web层先查找该商品对象,将获取的对象封存到Bean对象,然后再存储到request域对象中供前端页面从request域对象中获取。
		//从request中获取pid
		String pid=request.getParameter("pid");
		//查寻该pid
		AdminProductService service=new AdminProductService();
		Product product=null;
		try {
			product=service.findProductByPid(pid);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		List<Category> categoryList=null;
		try {
			categoryList=service.findAllCategory();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		request.setAttribute("categoryList", categoryList);
		//获取了Product后要将其放入request域中
		request.setAttribute("product", product);
		//转发到其他页面?为什么要转发,而不用重定向,因为重定向不会将request内的参数传递给另一个页面。
		request.getRequestDispatcher("/admin/product/edit.jsp").forward(request, response);
  • 存储到request域对象后难点是如何在前端修改页面中回显。通过EL表达式和JSTL循环的方式

  • 给value赋值,用EL表达式获取request域中的对象属性
  • 对于分类属性获取需要用到JST中的forEach和js函数获取,因为在回显到修改页面时,要自动填写完毕所属属性。

	

<script type="text/javascript">
	$(function(){
		$("#cid option[value='${product.cid}']").prop("selected",true);
		//是否热门
		$("#is_hot option[value='${product.is_hot}']").prop("selected",true);
			});
</script>
  • 回显完成后,就剩下修改值,然后保存到数据库了,这样就和添加差不多了,因此修改的问题主要就是解决回显的问题。
request.setCharacterEncoding("UTF-8");

		//1、获取数据
		Map<String, String[]> properties = request.getParameterMap();
		//2、封装数据
		Product product = new Product();
		try {
			BeanUtils.populate(product, properties);
		} catch (IllegalAccessException | InvocationTargetException e) {
			e.printStackTrace();
		}

		//此位置Product已经封装完毕----将表单的数据封装完毕
		//手动设置表单中没有数据
		//2)、private String pimage;
		product.setPimage("products/1/c_0033.jpg");
		//3)、private String pdate;//上架日期
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String pdate = format.format(new Date());
		product.setPdate(pdate);
		//4)、private int pflag;//商品是否下载 0代表未下架
		product.setPflag(0);

		//3、传递数据给service层
		AdminProductService service = new AdminProductService();
		try {
			service.updateProduct(product);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		//跳转到列表页面
		response.sendRedirect(request.getContextPath()+"/adminProductList");
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "update product set   pname=?,market_price=?,shop_price=?,pimage=?,pdate=?,is_hot=?,pdesc=?,pflag=?,cid=? where pid=?";
runner.update(sql,product.getPname(),product.getMarket_price(),				product.getShop_price(),product.getPimage(),product.getPdate(),product.getIs_hot(),				product.getPdesc(),product.getPflag(),product.getCid(),product.getPid());

修改总结

  1. 解决回显的问题,也就是说点击修改时进入修改页面,该商品当前的属性都要显示在当前页面上。

    首先: 在页面上获取该商品的pid。

    第二步: 通过pid获取该商品的所有属性

    第三步: 将获得的属性封装到request的域对象,用来给修改页面的回显。

    第四步: 修改页面,确定后保存到数据库。完成修改。

  2. 第三步最困难,因为第三步进行回显需要回显一般的值,还要回显具有选择性的值,这个比较麻烦。

你可能感兴趣的:(javaWeb笔记)