关于修改商品的疑问
来源:4-12 修改商品的代码实现
MasonM
2019-06-01 13:44:12
<form id="admin-form" name="addForm" action="${pageContext.request.contextPath}/ProductServlet?method=update" method="post" enctype="multipart/form-data">
<input type="hidden" name="pid" value="${product.pid}">
<input type="hidden" name="filename" value="${product.filename}">
<input type="hidden" name="path" value="${product.path}">
<div class="panel-body bg-light">
<div class="section-divider mt20 mb40">
<span> 基本信息 </span>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
名称
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field">
<input name="pname" class="gui-input" placeholder="名称" type="text" value="${product.pname}"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
价格
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field">
<input name="price" class="gui-input" placeholder="价格" type="text" value="${product.price}"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
作者
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field">
<input name="author" class="gui-input" placeholder="作者" type="text" value="${product.author}"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
分类
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field select">
<select id="departmentSn" name="cid" class="gui-input" placeholder="分类...">
<c:forEach var="cl" items="${categoryList}">
<c:choose>
<c:when test="${cl.cid==product.category.cid}">
<option value="${product.category.cid}" selected="selected">${product.category.cname}</option>
</c:when>
<c:otherwise>
<option value="${cl.cid}">${cl.cname}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
<i class="arrow double"></i>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
图片
</label>
</label>
</div>
<div class="col-md-6">
<label for="name" class="field">
<input id="name" name="filename" class="gui-input" placeholder="图片" type="file" value="上传图片"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
描述
</label>
</label>
</div>
<div class="col-md-6">
<label for="address" class="field">
<input id="address" name="description" class="gui-input" placeholder="描述" type="text" value="${product.description}"/>
</label>
</div>
</div>
<div class="panel-footer text-center">
<button type="submit" class="button"> 保存 </button>
<button type="button" class="button" onclick="javascript:window.history.go(-1);"> 返回 </button>
</div>
</div>
</form>我有个地方搞不懂,如果用户修改商品的时候,没有更换图片,那文件上传项是不是就是为空,然后在工具类中

判断为空时,就不进行数据的保存,
然后就会从隐藏字段中获取之前商品已经存在的图片数据

请问我理解的对吗?
2:
我的疑问是,如果用户在修改商品时,更换了图片,上传了新的图片,那会不会跟隐藏字段中的旧数据发生冲突的?
我搞不懂,为什么有隐藏字段的旧数据在,新上传的图片可以把它覆盖掉?
13回答
吃吃吃鱼的猫
2019-06-05
同学你好,隐藏字段放form表单中的最后面,会覆盖之前的数据,同学理解就好,不必纠结这个哦~
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
好帮手慕阿满
2019-06-04
同学你好,试验了一下,这里的隐藏字段应该写在form表单中的前边。另外同学最后的问题是什么意思?不是很理解同学最后想表达什么。建议同学表示的更清楚些。
祝:学习愉快~
MasonM
提问者
2019-06-04
还是不太懂,因为我是这样想的,因为有隐藏字段在,也有文件上传项在,如果在用户编辑商品,更换了图片,然后通过UploadUtils工具类去获取数据,如果照老师说的,一次性读完的话,
在
这
就是,隐藏字段会被fileItem.isFormField()捕获到数据,并存入map集合中,
而在文件上传项目的数据会被else那捕获到,也会存入map集合呀,
为什么说,隐藏字段在最底下的时候,也不影响用户更换图片呢?
因为隐藏字段和文件上传项目的数据都会被UploadUtils工具类捕获到并存入map中的呀?
请老师解答一下,麻烦您了!谢谢!
MasonM
提问者
2019-06-04
老师,但UploadUtils工具类中的fileName只是一个变量,是通过fileItem获取到的文件名呀

好帮手慕阿满
2019-06-04
同学你好,检查了一下同学的代码,发现同学在product_update.jsp页面中,<input type="hidden" name="fileName" value="${product.filename}">的name是filename,全部小写了 ,

而在UploadUtils工具类中,判断文件名时为fileName,如:

这里不能正确的获取文件名,所以数据库中的图片名及path都没改变,建议同学修改一下product_update.jsp页面中的fileName再试试。
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
吃吃吃鱼的猫
2019-06-03
同学你好,老师已经联系你,关注一下私信哦~
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
吃吃吃鱼的猫
2019-06-03
同学你好,
下图标识的输出语句是从哪里输出的呢?

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
MasonM
提问者
2019-06-03


输出这个
CategoryService的findAll方法执行了
CategoryDao的findAll方法执行了...
filename=wen.jpg
{path=/upload/34c97b19171b4318bdf699e7817fe207.jpg, filename=wen.jpg, pname=测试, price=100.0, author=qq, cid=1}
测试:/upload/eb2f54d7fa2f4c89903baad84d9e36cf.jpg wumingnvlang.jpg
ProductServlet的findAll方法
ProductService的findAll方法
ProductDao的findAll方法
商品Product{pid=75, pname='测试', author='qq', price=100.0, description='qqq', filename='wumingnvlang.jpg', path='/upload/eb2f54d7fa2f4c89903baad84d9e36cf.jpg', category=Category{cid=1, cname='人物画', cdesc='描述人物的画'}} 商品分类名称:人物画
吃吃吃鱼的猫
2019-06-03
同学你好,同学在Servlet层的update方法的第一行,取出path的值输出。
然后再进行测试。
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
MasonM
提问者
2019-06-03
这是页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<!-- Mirrored from admindesigns.com/demos/absolute/1.1/admin_forms-validation.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 06 Aug 2015 02:56:15 GMT -->
<head>
<!-- Meta, title, CSS, favicons, etc. -->
<meta charset="utf-8">
<title>油画商城--修改商品</title>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/assets/skin/default_skin/css/theme.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/assets/admin-tools/admin-forms/css/admin-forms.css">
<link rel="shortcut icon" href="${pageContext.request.contextPath }/assets/img/favicon.ico">
</head>
<body class="admin-validation-page" data-spy="scroll" data-target="#nav-spy" data-offset="200">
<div id="main">
<%@ include file="header.jsp" %>
<%@ include file="left.jsp" %>
<section id="content_wrapper">
<section id="content" class="table-layout animated fadeIn">
<div class="tray tray-center">
<div class="content-header">
<h2> 编辑商品信息 </h2>
<p class="lead"></p>
</div>
<div class="admin-form theme-primary mw1000 center-block" style="padding-bottom: 175px;">
<div class="panel heading-border">
<form id="admin-form" name="addForm" action="${pageContext.request.contextPath}/ProductServlet?method=update" method="post" enctype="multipart/form-data">
<div class="panel-body bg-light">
<div class="section-divider mt20 mb40">
<span> 基本信息 </span>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
名称
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field">
<input name="pname" class="gui-input" placeholder="名称" type="text" value="${product.pname}"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
价格
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field">
<input name="price" class="gui-input" placeholder="价格" type="text" value="${product.price}"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
作者
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field">
<input name="author" class="gui-input" placeholder="作者" type="text" value="${product.author}"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
分类
</label>
</label>
</div>
<div class="col-md-6">
<label for="sn" class="field select">
<select id="departmentSn" name="cid" class="gui-input" placeholder="分类...">
<c:forEach var="cl" items="${categoryList}">
<c:choose>
<c:when test="${cl.cid==product.category.cid}">
<option value="${product.category.cid}" selected="selected">${product.category.cname}</option>
</c:when>
<c:otherwise>
<option value="${cl.cid}">${cl.cname}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
<i class="arrow double"></i>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
图片
</label>
</label>
</div>
<div class="col-md-6">
<label for="name" class="field">
<input id="name" name="filename" class="gui-input" placeholder="图片" type="file" value="上传图片"/>
</label>
</div>
</div>
<div class="section row">
<div class="col-md-2"></div>
<div class="col-md-1">
<label for="sn" class="field prepend-icon">
<label for="sn" class="field-icon">
描述
</label>
</label>
</div>
<div class="col-md-6">
<label for="address" class="field">
<input id="address" name="description" class="gui-input" placeholder="描述" type="text" value="${product.description}"/>
</label>
</div>
</div>
<div class="panel-footer text-center">
<button type="submit" class="button"> 保存 </button>
<button type="button" class="button" onclick="javascript:window.history.go(-1);"> 返回 </button>
</div>
</div>
<input type="hidden" name="pid" value="${product.pid}">
<input type="hidden" name="filename" value="${product.filename}">
<input type="hidden" name="path" value="${product.path}">
</form>
</div>
</div>
</div>
</section>
</section>
我把隐藏字段放最底下了
MasonM
提问者
2019-06-03
首先,我添加一个新的商品

然后我更新他的图片

然后我再查询数据库

发现图片并没有发生更换呀
好帮手慕阿莹
2019-06-01
1、是的同学理解的是对的,文件上传像为空时,还是原来的数据,不进行更新。
2、不会冲突的,它会把它覆盖掉,以为修改时,是把修改页面提交过了来的数据重新放到一个新的对象里去了,然后把这个新的对象拿去修改到数据库中,不会冲突,而是覆盖掉了:


3、他们是按照表单提交的属性来读取数据的,并不是把之前的map中的数据覆盖掉了。也并没有说在读取到隐藏字段的时候,才会把filenamePath 之类的存入。它就是按照顺序读取的。都会一起读完的。map中的存的就会是:
例如:key:id value:1
key:name value:“abc”
。。。。。
然后都把它们取出来,放到新的product中去。
然后把这个新的product传给sql进行更新数据。所以这个隐藏字符放在哪里都是无所谓的。都可以通过map.get(key) 拿出来的。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
MasonM
提问者
2019-06-01
关于疑问2,我的猜想是,因为隐藏字段在表单的上部分,而文件上传项是在下面,如果提交表单时候,是优先处理上面的表单项数据,比如
1:普通表单项1
2:普通表单项2
3:文件表单项
4:普通表单项3
在UploadFile工具类中,是按照表单项的顺序来读取数据的,请问对吗?
回到问题2
然后由于隐藏字段在文件上传项的上面


所以,如果用户上传的新的图片,在工具类读取到隐藏字段时候,会把filename,path,之类的先存入map集合中,然后当工具类读取到有新的文件上传,并且文件不为空,就开始读取数据,并把之前map集合中关于filename,path的数据覆盖掉了.
请问我的猜想正确吗?
UploadFile工具类读取数据是不是根据表单项的顺序来读取的呢?
如果我把隐藏字段放在最底下,会不会就一直无法更换新的图片呢?
相似问题