添加商品部分原理和添加商品类别是一样的,不过要比商品类别复杂,因为商品的属性有很多,对应的数据库中的字段也就多了,添加商品还有个选项是上传图片,这一小块内容会在下一篇博客中单独说明,因为这涉及到一个知识点,就是Struts2实现文件上传功能。其他废话不多说了,现在开始完善添加商品部分的代码:
1. 添加商品
1.1 添加商品的UI实现
首先完成query.jsp中添加商品部分的代码:
接下来我们看save.jsp中的具体实现:
- <%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
- <!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN”>
- <html>
- <head>
- <%@ include file=”/public/head.jspf” %>
- <style type=”text/css”>
- form div {
- margin:10px;
- }
- </style>
- <script type=”text/javascript”>
- (<span class="keyword">function</span><span>(){ </span></span></li><li class="alt"><span> <span class="comment">//自定义验证方法向validatebox.defaults.rules中注册新函数</span><span> </span></span></li><li class=""><span> .extend(.fn.validatebox.defaults.rules,{ </span></li><li class="alt"><span> <span class="comment">//函数的名称:{函数的实现体(又是一个json对象,里面包括函数的实现,和错误消息的设置)} </span><span> </span></span></li><li class=""><span> format:{ </span></li><li class="alt"><span> <span class="comment">//函数实现,如果返回为false,则验证失败</span><span> </span></span></li><li class=""><span> validator: <span class="keyword">function</span><span>(value,param){ </span></span></li><li class="alt"><span> <span class="comment">//获取当前文件的后缀名</span><span> </span></span></li><li class=""><span> <span class="keyword">var</span><span> ext = value.substring(value.lastIndexOf(</span><span class="string">'.'</span><span>) + 1); </span></span></li><li class="alt"><span> <span class="comment">//获取支持的文件后缀名,然后比较即可</span><span> </span></span></li><li class=""><span> <span class="keyword">var</span><span> arr = param[0].split(</span><span class="string">","</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">for</span><span>(</span><span class="keyword">var</span><span> i = 0; i < arr.length; i++) { </span></span></li><li class=""><span> <span class="keyword">if</span><span>(ext == arr[i]) </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class=""><span> }, </span></li><li class="alt"><span> <span class="comment">//错误消息</span><span> </span></span></li><li class=""><span> message: <span class="string">'文件后缀必须为:{0}'</span><span> </span></span></li><li class="alt"><span> } </span></li><li class=""><span> }); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//对商品类别的下拉列表框进行远程加载</span><span> </span></span></li><li class="alt"><span> (<span class="string">"#cc"</span><span>).combobox({ </span></span></li><li class=""><span> <span class="comment">//将请求发送给categoryAction中的query方法处理,这里需要将处理好的数据返回到这边来显示了 ,所以后台需要将数据打包成json格式发过来</span><span> </span></span></li><li class="alt"><span> url:<span class="string">'category_query.action'</span><span>, </span></span></li><li class=""><span> valueField:<span class="string">'id'</span><span>, </span></span></li><li class="alt"><span> textField:<span class="string">'type'</span><span>, </span><span class="comment">//我们下拉列表中显示的是所有的商品类别</span><span> </span></span></li><li class=""><span> panelHeight:<span class="string">'auto'</span><span>, </span><span class="comment">//自适应高度</span><span> </span></span></li><li class="alt"><span> panelWidth:120,<span class="comment">//下拉列表是两个组件组成的</span><span> </span></span></li><li class=""><span> width:120, <span class="comment">//要同时设置两个宽度才行</span><span> </span></span></li><li class="alt"><span> editable:<span class="keyword">false</span><span>, </span><span class="comment">//下拉框不允许编辑</span><span> </span></span></li><li class=""><span> <span class="comment">//combobox继承combo继承validatebox,所以可以直接在这里设置验证</span><span> </span></span></li><li class="alt"><span> required:<span class="keyword">true</span><span>, </span></span></li><li class=""><span> missingMessage:<span class="string">'请选择所属类别'</span><span> </span></span></li><li class="alt"><span> }); </span></li><li class=""><span> </span></li><li class="alt"><span> (<span class="string">"input[name=name]"</span><span>).validatebox({ </span></span></li><li class=""><span> required:<span class="keyword">true</span><span>, </span></span></li><li class="alt"><span> missingMessage:<span class="string">'请输入商品名称'</span><span> </span></span></li><li class=""><span> }); </span></li><li class="alt"><span> </span></li><li class=""><span> (<span class="string">"input[name=price]"</span><span>).numberbox({ </span></span></li><li class="alt"><span> required:<span class="keyword">true</span><span>, </span></span></li><li class=""><span> missingMessage:<span class="string">'请输入商品价格'</span><span>, </span></span></li><li class="alt"><span> min:0, </span></li><li class=""><span> precision:2, <span class="comment">//保留两位小数</span><span> </span></span></li><li class="alt"><span> prefix:<span class="string">''</span><span> </span></span></li><li class=""><span> }); </span></li><li class="alt"><span> (<span class="string">"input[name='fileImage.upload']"</span><span>).validatebox({ </span></span></li><li class=""><span> required:<span class="keyword">true</span><span>, </span></span></li><li class="alt"><span> missingMessage:<span class="string">'请上传商品图片'</span><span>, </span></span></li><li class=""><span> <span class="comment">//设置自定义方法</span><span> </span></span></li><li class="alt"><span> validType:<span class="string">"format['gif,jpg,jpeg,png']"</span><span class="comment">//中括号里面是参数</span><span> </span></span></li><li class=""><span> }); </span></li><li class="alt"><span> </span></li><li class=""><span> (<span class="string">"textarea[name=remark]"</span><span>).validatebox({ </span></span></li><li class="alt"><span> required:<span class="keyword">true</span><span>, </span></span></li><li class=""><span> missingMessage:<span class="string">'请输入商品的简单描述'</span><span> </span></span></li><li class="alt"><span> }); </span></li><li class=""><span> </span></li><li class="alt"><span> (<span class="string">"textarea[name=xremark]"</span><span>).validatebox({ </span></span></li><li class=""><span> required:<span class="keyword">true</span><span>, </span></span></li><li class="alt"><span> missingMessage:<span class="string">'请输入商品的简单描述'</span><span> </span></span></li><li class=""><span> }); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//窗体弹出默认时禁用验证</span><span> </span></span></li><li class="alt"><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">"disableValidation"</span><span>); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//注册button的事件</span><span> </span></span></li><li class=""><span> (<span class="string">"#submit"</span><span>).click(</span><span class="keyword">function</span><span>(){ </span></span></li><li class="alt"><span> <span class="comment">//开启验证</span><span> </span></span></li><li class=""><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">"enableValidation"</span><span>); </span></span></li><li class="alt"><span> <span class="comment">//如果验证成功,则提交数据</span><span> </span></span></li><li class=""><span> <span class="keyword">if</span><span>((</span><span class="string">"#ff"</span><span>).form(</span><span class="string">"validate"</span><span>)) { </span></span></li><li class="alt"><span> <span class="comment">//调用submit方法提交数据</span><span> </span></span></li><li class=""><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">'submit'</span><span>, { </span></span></li><li class="alt"><span> url: <span class="string">'product_save.action'</span><span>, </span></span></li><li class=""><span> success: <span class="keyword">function</span><span>(){ </span></span></li><li class="alt"><span> <span class="comment">//如果成功了,关闭当前窗口</span><span> </span></span></li><li class=""><span> parent.$(<span class="string">"#win"</span><span>).window(</span><span class="string">"close"</span><span>); </span></span></li><li class="alt"><span> parent.$(<span class="string">"iframe[title='商品管理']"</span><span>).get(0).contentWindow.$(</span><span class="string">"#dg"</span><span>).datagrid(</span><span class="string">"reload"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> }); </span></li><li class=""><span> } </span></li><li class="alt"><span> }); </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//注册button的事件</span><span> </span></span></li><li class=""><span> (<span class="string">"#reset"</span><span>).click(</span><span class="keyword">function</span><span>(){ </span></span></li><li class="alt"><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">"disableValidation"</span><span>);</span><span class="comment">//重置不需要表单验证</span><span> </span></span></li><li class=""><span> <span class="comment">//重置当前表单数据</span><span> </span></span></li><li class="alt"><span> (”#ff”).form(“reset”);
- });
- });
- </script>
- </head>
- <body>
- <form title=”添加商品” id=“ff” method=“post” enctype=“multipart/form-data”>
- <div>
- <label>商品名称:</label> <input type=”text” name=“name” />
- </div>
- <div>
- <label>商品价格:</label> <input type=”text” name=“price” />
- </div>
- <div>
- <label>图片上传:</label> <input type=”file” name=“fileImage.upload” />
- </div>
- <div>
- <label>所属类别:</label>
- <input id=”cc” name=“category.id”/>
- </div>
- <div>
- <label>加入推荐:</label> 推荐:<input type=”radio” name=“commend”
- checked=”checked” value=“true” /> 不推荐:<input type=“radio”
- name=”commend” value=“false” />
- </div>
- <div>
- <label>是否有效:</label>
- 上架:<input type=”radio” name=“open” checked=“checked”value=“true” />
- 下架:<input type=”radio” name=“open” value=“false” />
- </div>
- <div>
- <label>简单描述:</label>
- <textarea name=”remark” cols=“40” rows=“4”></textarea>
- </div>
- <div>
- <label>详细描述:</label>
- <textarea name=”xremark” cols=“40” rows=“8”></textarea>
- </div>
- <div>
- <a id=”submit” href=“#” class=“easyui-linkbutton”>添 加</a>
- <a id=”reset” href=“#” class=“easyui-linkbutton”>重 置</a>
- </div>
- </form>
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ include file="/public/head.jspf" %>
<style type="text/css">
form div {
margin:10px;
}
</style>
<script type="text/javascript">
$(function(){
//自定义验证方法向validatebox.defaults.rules中注册新函数
$.extend($.fn.validatebox.defaults.rules,{
//函数的名称:{函数的实现体(又是一个json对象,里面包括函数的实现,和错误消息的设置)}
format:{
//函数实现,如果返回为false,则验证失败
validator: function(value,param){
//获取当前文件的后缀名
var ext = value.substring(value.lastIndexOf('.') + 1);
//获取支持的文件后缀名,然后比较即可
var arr = param[0].split(",");
for(var i = 0; i < arr.length; i++) {
if(ext == arr[i])
return true;
}
return false;
},
//错误消息
message: '文件后缀必须为:{0}'
}
});
//对商品类别的下拉列表框进行远程加载
$("#cc").combobox({
//将请求发送给categoryAction中的query方法处理,这里需要将处理好的数据返回到这边来显示了 ,所以后台需要将数据打包成json格式发过来
url:'category_query.action',
valueField:'id',
textField:'type', //我们下拉列表中显示的是所有的商品类别
panelHeight:'auto', //自适应高度
panelWidth:120,//下拉列表是两个组件组成的
width:120, //要同时设置两个宽度才行
editable:false, //下拉框不允许编辑
//combobox继承combo继承validatebox,所以可以直接在这里设置验证
required:true,
missingMessage:'请选择所属类别'
});
$("input[name=name]").validatebox({
required:true,
missingMessage:'请输入商品名称'
});
$("input[name=price]").numberbox({
required:true,
missingMessage:'请输入商品价格',
min:0,
precision:2, //保留两位小数
prefix:'$'
});
$("input[name='fileImage.upload']").validatebox({
required:true,
missingMessage:'请上传商品图片',
//设置自定义方法
validType:"format['gif,jpg,jpeg,png']"//中括号里面是参数
});
$("textarea[name=remark]").validatebox({
required:true,
missingMessage:'请输入商品的简单描述'
});
$("textarea[name=xremark]").validatebox({
required:true,
missingMessage:'请输入商品的简单描述'
});
//窗体弹出默认时禁用验证
$("#ff").form("disableValidation");
//注册button的事件
$("#submit").click(function(){
//开启验证
$("#ff").form("enableValidation");
//如果验证成功,则提交数据
if($("#ff").form("validate")) {
//调用submit方法提交数据
$("#ff").form('submit', {
url: 'product_save.action',
success: function(){
//如果成功了,关闭当前窗口
parent.$("#win").window("close");
parent.$("iframe[title='商品管理']").get(0).contentWindow.$("#dg").datagrid("reload");
}
});
}
});
//注册button的事件
$("#reset").click(function(){
$("#ff").form("disableValidation");//重置不需要表单验证
//重置当前表单数据
$("#ff").form("reset");
});
});
</script>
</head>
<body>
<form title="添加商品" id="ff" method="post" enctype="multipart/form-data">
<div>
<label>商品名称:</label> <input type="text" name="name" />
</div>
<div>
<label>商品价格:</label> <input type="text" name="price" />
</div>
<div>
<label>图片上传:</label> <input type="file" name="fileImage.upload" />
</div>
<div>
<label>所属类别:</label>
<input id="cc" name="category.id"/>
</div>
<div>
<label>加入推荐:</label> 推荐:<input type="radio" name="commend"
checked="checked" value="true" /> 不推荐:<input type="radio"
name="commend" value="false" />
</div>
<div>
<label>是否有效:</label>
上架:<input type="radio" name="open" checked="checked"value="true" />
下架:<input type="radio" name="open" value="false" />
</div>
<div>
<label>简单描述:</label>
<textarea name="remark" cols="40" rows="4"></textarea>
</div>
<div>
<label>详细描述:</label>
<textarea name="xremark" cols="40" rows="8"></textarea>
</div>
<div>
<a id="submit" href="#" class="easyui-linkbutton">添 加</a>
<a id="reset" href="#" class="easyui-linkbutton">重 置</a>
</div>
</form>
</body>
</html>
我们主要来看一下上面js代码中中自定义方法部分,主要是定义对上传的图片的验证,具体分析如下:
然后在图片验证这块就可以使用自定义的方法了:
1.2 添加商品的后台实现
- @Controller(“productAction”)
- @Scope(“prototype”)
- public class ProductAction extends BaseAction<Product> {
- //省略其他代码……
- public void save() throws Exception {
- //处理上传的图片,下一篇博客专门分析struts2文件上传
- model.setDate(new Date()); //设置一下当前时间,因为前台没有把时间字段传进来,这里自己设置一下即可
- System.out.println(model);
- //商品信息入库
- productService.save(model);
- }
- }
@Controller("productAction")
@Scope("prototype")
public class ProductAction extends BaseAction<Product> {
//省略其他代码……
public void save() throws Exception {
//处理上传的图片,下一篇博客专门分析struts2文件上传
model.setDate(new Date()); //设置一下当前时间,因为前台没有把时间字段传进来,这里自己设置一下即可
System.out.println(model);
//商品信息入库
productService.save(model);
}
}
2. 更新商品
2.1 更新商品的UI实现
首先看下query.jsp中更新商品部分的代码:
接下来看看update.jsp的内容:
- <%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
- <!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN”>
- <html>
- <head>
- <%@ include file=”/public/head.jspf” %>
- <style type=”text/css”>
- form div {
- margin:5px;
- }
- </style>
- <script type=”text/javascript”>
- (<span class="keyword">function</span><span>(){ </span></span></li><li class="alt"><span> <span class="comment">//iframe中的datagrid对象</span><span> </span></span></li><li class=""><span> <span class="keyword">var</span><span> dg = parent.(</span><span class="string">"iframe[title='商品管理']"</span><span>).get(0).contentWindow.(</span><span class="string">"#dg"</span><span>); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//对商品类的下拉列表框进行远程加载</span><span> </span></span></li><li class="alt"><span> (<span class="string">"#cc"</span><span>).combobox({ </span></span></li><li class=""><span> <span class="comment">//将请求发送给categoryAction中的query方法处理,这里需要将处理好的数据返回到这边来显示了 ,所以后台需要将数据打包成json格式发过来</span><span> </span></span></li><li class="alt"><span> url:<span class="string">'category_query.action'</span><span>, </span></span></li><li class=""><span> valueField:<span class="string">'id'</span><span>, </span></span></li><li class="alt"><span> textField:<span class="string">'type'</span><span>, </span><span class="comment">//我们下拉列表中显示的是商品的类别名</span><span> </span></span></li><li class=""><span> panelHeight:<span class="string">'auto'</span><span>, </span><span class="comment">//自适应高度</span><span> </span></span></li><li class="alt"><span> panelWidth:120,<span class="comment">//下拉列表是两个组件组成的</span><span> </span></span></li><li class=""><span> width:120, <span class="comment">//要同时设置两个宽度才行</span><span> </span></span></li><li class="alt"><span> editable:<span class="keyword">false</span><span>, </span><span class="comment">//下拉框不允许编辑</span><span> </span></span></li><li class=""><span> <span class="comment">//combobox继承combo继承validatebox,所以可以直接在这里设置验证</span><span> </span></span></li><li class="alt"><span> required:<span class="keyword">true</span><span>, </span></span></li><li class=""><span> missingMessage:<span class="string">'请选择所属类别'</span><span> </span></span></li><li class="alt"><span> }); </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">// 完成数据的回显,更新时,用户肯定先选择了要更新的那一行,首先我们得拿到那一行</span><span> </span></span></li><li class=""><span> <span class="keyword">var</span><span> rows = dg.datagrid(</span><span class="string">"getSelections"</span><span>); </span></span></li><li class="alt"><span> <span class="comment">//将拿到的那一行对应的数据字段加载到表单里,实现回显</span><span> </span></span></li><li class=""><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">'load'</span><span>,{ </span></span></li><li class="alt"><span> id:rows[0].id, </span></li><li class=""><span> name:rows[0].name, </span></li><li class="alt"><span> price:rows[0].price, </span></li><li class=""><span> remark:rows[0].remark, </span></li><li class="alt"><span> xremark:rows[0].xremark, </span></li><li class=""><span> commend:rows[0].commend, </span></li><li class="alt"><span> open:rows[0].open, </span></li><li class=""><span> <span class="string">'category.id'</span><span>:rows[0].category.id </span><span class="comment">//EasyUI不支持account.id这种点操作,所以要加个引号</span><span> </span></span></li><li class="alt"><span> }); </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//回显完了数据后,设置一下验证功能</span><span> </span></span></li><li class=""><span> (<span class="string">"input[name=name]"</span><span>).validatebox({ </span></span></li><li class="alt"><span> required:<span class="keyword">true</span><span>, </span></span></li><li class=""><span> missingMessage:<span class="string">'请输入类别名称'</span><span> </span></span></li><li class="alt"><span> }); </span></li><li class=""><span> (<span class="string">"input[name=price]"</span><span>).numberbox({ </span></span></li><li class="alt"><span> required:<span class="keyword">true</span><span>, </span></span></li><li class=""><span> missingMessage:<span class="string">'请输入商品价格'</span><span>, </span></span></li><li class="alt"><span> min:0, </span></li><li class=""><span> precision:2, <span class="comment">//保留两位小数</span><span> </span></span></li><li class="alt"><span> prefix:<span class="string">'$'</span><span> </span></span></li><li class=""><span> }); </span></li><li class="alt"><span> (<span class="string">"input[name='fileImage.upload']"</span><span>).validatebox({ </span></span></li><li class=""><span> required:<span class="keyword">true</span><span>, </span></span></li><li class="alt"><span> missingMessage:<span class="string">'请上传商品图片'</span><span>, </span></span></li><li class=""><span> <span class="comment">//设置自定义方法</span><span> </span></span></li><li class="alt"><span> validType:<span class="string">"format['gif,jpg,jpeg,png']"</span><span class="comment">//中括号里面是参数</span><span> </span></span></li><li class=""><span> }); </span></li><li class="alt"><span> </span></li><li class=""><span> (<span class="string">"textarea[name=remark]"</span><span>).validatebox({ </span></span></li><li class="alt"><span> required:<span class="keyword">true</span><span>, </span></span></li><li class=""><span> missingMessage:<span class="string">'请输入商品的简单描述'</span><span> </span></span></li><li class="alt"><span> }); </span></li><li class=""><span> </span></li><li class="alt"><span> (<span class="string">"textarea[name=xremark]"</span><span>).validatebox({ </span></span></li><li class=""><span> required:<span class="keyword">true</span><span>, </span></span></li><li class="alt"><span> missingMessage:<span class="string">'请输入商品的简单描述'</span><span> </span></span></li><li class=""><span> }); </span></li><li class="alt"><span> <span class="comment">//窗体弹出默认时禁用验证</span><span> </span></span></li><li class=""><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">"disableValidation"</span><span>); </span></span></li><li class="alt"><span> <span class="comment">//注册button的事件</span><span> </span></span></li><li class=""><span> (<span class="string">"#btn"</span><span>).click(</span><span class="keyword">function</span><span>(){ </span></span></li><li class="alt"><span> <span class="comment">//开启验证</span><span> </span></span></li><li class=""><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">"enableValidation"</span><span>); </span></span></li><li class="alt"><span> <span class="comment">//如果验证成功,则提交数据</span><span> </span></span></li><li class=""><span> <span class="keyword">if</span><span>((</span><span class="string">"#ff"</span><span>).form(</span><span class="string">"validate"</span><span>)) { </span></span></li><li class="alt"><span> <span class="comment">//调用submit方法提交数据</span><span> </span></span></li><li class=""><span> (<span class="string">"#ff"</span><span>).form(</span><span class="string">'submit'</span><span>, { </span></span></li><li class="alt"><span> url: <span class="string">'product_update.action'</span><span>, </span><span class="comment">//提交时将请求传给productAction的update方法执行</span><span> </span></span></li><li class=""><span> success: <span class="keyword">function</span><span>(){ </span></span></li><li class="alt"><span> <span class="comment">//如果成功了,关闭当前窗口,并刷新页面</span><span> </span></span></li><li class=""><span> parent.(”#win”).window(“close”);
- dg.datagrid(”reload”);
- }
- });
- }
- });
- });
- </script>
- </head>
- <body>
- <form title=”更新商品” id=“ff” method=“post” enctype=“multipart/form-data”>
- <div>
- <label for=“name”>商品名称:</label> <input type=“text” name=“name” />
- </div>
- <div>
- <label for=“price”>商品价格:</label> <input type=“text” name=“price” />
- </div>
- <div>
- <label>更新图片:</label> <input type=”file” name=“fileImage.upload” />
- </div>
- <div>
- <label for=“account”>所属商品类:</label>
- <!– 远程加载管理员数据 –>
- <input id=”cc” name=“category.id” />
- </div>
- <div>
- <label for=“remark”>简单描述:</label>
- <textarea name=”remark” cols=“40” rows=“4”></textarea>
- </div>
- <div>
- <label for=“xremark”>详细描述:</label>
- <textarea name=”xremark” cols=“40” rows=“8”></textarea>
- </div>
- <div>
- <label for=“commend”>推荐商品:</label>
- 是:<input type=”radio” name=“commend” value=“true” />
- 否:<input type=”radio” name=“commend” value=“false” />
- </div>
- <div>
- <label for=“open”>有效商品:</label>
- 上架:<input type=”radio” name=“open” value=“true” />
- 下架:<input type=”radio” name=“open” value=“false” />
- </div>
- <div>
- <a id=”btn” href=“#” class=“easyui-linkbutton” data-options=“iconCls:’icon-edit’”>更新</a>
- <input type=”hidden” name=“id” />
- </div> `
- </form>
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ include file="/public/head.jspf" %>
<style type="text/css">
form div {
margin:5px;
}
</style>
<script type="text/javascript">
$(function(){
//iframe中的datagrid对象
var dg = parent.$("iframe[title='商品管理']").get(0).contentWindow.$("#dg");
//对商品类的下拉列表框进行远程加载
$("#cc").combobox({
//将请求发送给categoryAction中的query方法处理,这里需要将处理好的数据返回到这边来显示了 ,所以后台需要将数据打包成json格式发过来
url:'category_query.action',
valueField:'id',
textField:'type', //我们下拉列表中显示的是商品的类别名
panelHeight:'auto', //自适应高度
panelWidth:120,//下拉列表是两个组件组成的
width:120, //要同时设置两个宽度才行
editable:false, //下拉框不允许编辑
//combobox继承combo继承validatebox,所以可以直接在这里设置验证
required:true,
missingMessage:'请选择所属类别'
});
// 完成数据的回显,更新时,用户肯定先选择了要更新的那一行,首先我们得拿到那一行
var rows = dg.datagrid("getSelections");
//将拿到的那一行对应的数据字段加载到表单里,实现回显
$("#ff").form('load',{
id:rows[0].id,
name:rows[0].name,
price:rows[0].price,
remark:rows[0].remark,
xremark:rows[0].xremark,
commend:rows[0].commend,
open:rows[0].open,
'category.id':rows[0].category.id //EasyUI不支持account.id这种点操作,所以要加个引号
});
//回显完了数据后,设置一下验证功能
$("input[name=name]").validatebox({
required:true,
missingMessage:'请输入类别名称'
});
$("input[name=price]").numberbox({
required:true,
missingMessage:'请输入商品价格',
min:0,
precision:2, //保留两位小数
prefix:'$'
});
$("input[name='fileImage.upload']").validatebox({
required:true,
missingMessage:'请上传商品图片',
//设置自定义方法
validType:"format['gif,jpg,jpeg,png']"//中括号里面是参数
});
$("textarea[name=remark]").validatebox({
required:true,
missingMessage:'请输入商品的简单描述'
});
$("textarea[name=xremark]").validatebox({
required:true,
missingMessage:'请输入商品的简单描述'
});
//窗体弹出默认时禁用验证
$("#ff").form("disableValidation");
//注册button的事件
$("#btn").click(function(){
//开启验证
$("#ff").form("enableValidation");
//如果验证成功,则提交数据
if($("#ff").form("validate")) {
//调用submit方法提交数据
$("#ff").form('submit', {
url: 'product_update.action', //提交时将请求传给productAction的update方法执行
success: function(){
//如果成功了,关闭当前窗口,并刷新页面
parent.$("#win").window("close");
dg.datagrid("reload");
}
});
}
});
});
</script>
</head>
<body>
<form title="更新商品" id="ff" method="post" enctype="multipart/form-data">
<div>
<label for="name">商品名称:</label> <input type="text" name="name" />
</div>
<div>
<label for="price">商品价格:</label> <input type="text" name="price" />
</div>
<div>
<label>更新图片:</label> <input type="file" name="fileImage.upload" />
</div>
<div>
<label for="account">所属商品类:</label>
<!-- 远程加载管理员数据 -->
<input id="cc" name="category.id" />
</div>
<div>
<label for="remark">简单描述:</label>
<textarea name="remark" cols="40" rows="4"></textarea>
</div>
<div>
<label for="xremark">详细描述:</label>
<textarea name="xremark" cols="40" rows="8"></textarea>
</div>
<div>
<label for="commend">推荐商品:</label>
是:<input type="radio" name="commend" value="true" />
否:<input type="radio" name="commend" value="false" />
</div>
<div>
<label for="open">有效商品:</label>
上架:<input type="radio" name="open" value="true" />
下架:<input type="radio" name="open" value="false" />
</div>
<div>
<a id="btn" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-edit'">更新</a>
<input type="hidden" name="id" />
</div> `
</form>
</body>
</html>
更新部分与商品类别的更新基本相同,不再赘述,下面是后台更新部分的实现:
2.2 更新商品的后台实现
- @Controller(“productAction”)
- @Scope(“prototype”)
- public class ProductAction extends BaseAction<Product> {
- //省略其他代码……
- public void update() throws Exception {
- //处理上传的图片,下一篇博客专门分析struts2文件上传
- model.setDate(new Date()); //设置一下当前时间,因为前台没有把时间字段传进来,这里自己设置一下即可
- System.out.println(model);
- //更新商品
- productService.update(model);
- }
- }
@Controller("productAction")
@Scope("prototype")
public class ProductAction extends BaseAction<Product> {
//省略其他代码……
public void update() throws Exception {
//处理上传的图片,下一篇博客专门分析struts2文件上传
model.setDate(new Date()); //设置一下当前时间,因为前台没有把时间字段传进来,这里自己设置一下即可
System.out.println(model);
//更新商品
productService.update(model);
}
}
跟更新商品类别相比,唯一多了个图片上传的操作,要在后台处理上传的图片,我们在下一篇博客详细分析struts2的文件上传功能。
相关阅读:http://blog.csdn.net/column/details/str2hiberspring.html
整个项目的源码下载地址:http://blog.csdn.NET/eson_15/article/details/51479994
_____________________________________________________________________________________________________________________________________________________
—–乐于分享,共同进步!
<div id="digg" articleid="51366370">
<dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">
<dt>顶</dt>
<dd>7</dd>
</dl>
<dl id="btnBury" class="digg digg_enable" onclick="btnburya();">
<dt>踩</dt>
<dd>1</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" onclick="GetCategoryArticles('6228419','eson_15','foot','51366370');">● 项目实战<em>(29)</em></span>
</label>
<label class="">
<span style="cursor:pointer" onclick="GetCategoryArticles('6214186','eson_15','foot','51366370');">------【SSH网上商城】<em>(29)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51506334" id="foot_aritcle_51506334undefined5696410142027379" target="_blank" title="【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表">【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表</a><span>2016-05-26</span><label><i>阅读</i><b>6059</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51484247" id="foot_aritcle_51484247undefined9535441854619926" target="_blank" title="【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布">【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布</a><span>2016-05-23</span><label><i>阅读</i><b>13823</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475431" id="foot_aritcle_51475431undefined11133507589044656" target="_blank" title="【SSH网上商城项目实战26】完成订单支付后的短信发送功能">【SSH网上商城项目实战26】完成订单支付后的短信发送功能</a><span>2016-05-22</span><label><i>阅读</i><b>4704</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51465067" id="foot_aritcle_51465067undefined32564086040938145" target="_blank" title="【SSH网上商城项目实战24】Struts2中如何处理多个Model请求">【SSH网上商城项目实战24】Struts2中如何处理多个Model请求</a><span>2016-05-21</span><label><i>阅读</i><b>4245</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51452243" id="foot_aritcle_51452243undefined8652910455631238" target="_blank" title="【SSH网上商城项目实战22】获取银行图标以及支付页面的显示">【SSH网上商城项目实战22】获取银行图标以及支付页面的显示</a><span>2016-05-19</span><label><i>阅读</i><b>3742</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51441431" id="foot_aritcle_51441431undefined3975782275360109" target="_blank" title="【SSH网上商城项目实战20】在线支付平台的介绍">【SSH网上商城项目实战20】在线支付平台的介绍</a><span>2016-05-18</span><label><i>阅读</i><b>4107</b></label></li> </ul>
<ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51487323" id="foot_aritcle_51487323undefined35636284046460953" target="_blank" title="【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价">【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价</a><span>2016-05-24</span><label><i>阅读</i><b>5337</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51479994" id="foot_aritcle_51479994undefined6260722827037248" target="_blank" title="【SSH网上商城项目实战30】项目总结(附源码下载地址)">【SSH网上商城项目实战30】项目总结(附源码下载地址)</a><span>2016-05-27</span><label><i>阅读</i><b>21890</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475046" id="foot_aritcle_51475046undefined9521657871053699" target="_blank" title="【SSH网上商城项目实战25】使用java email给用户发送邮件">【SSH网上商城项目实战25】使用java email给用户发送邮件</a><span>2016-05-22</span><label><i>阅读</i><b>4007</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51464415" id="foot_aritcle_51464415undefined5592212783060215" target="_blank" title="【SSH网上商城项目实战23】完成在线支付功能">【SSH网上商城项目实战23】完成在线支付功能</a><span>2016-05-20</span><label><i>阅读</i><b>8822</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51447492" id="foot_aritcle_51447492undefined09522221277912446" target="_blank" title="【SSH网上商城项目实战21】从Demo中看易宝支付的流程">【SSH网上商城项目实战21】从Demo中看易宝支付的流程</a><span>2016-05-18</span><label><i>阅读</i><b>9653</b></label></li> </ul>
<a href="http://blog.csdn.net/eson_15/article/category/6228419" class="MoreArticle">更多文章</a></div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('6228419', 'eson_15','foot','51366370');
});
</script>