Web-第二十三天 Web商城实战三【悟空教程】
今日内容介绍
今日内容学习目标
<a href="${pageContext.request.contextPath}/OrderServlet?method=findByUid">我的订单</a>
//我的订单
public String findByUid(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1.1 获得当前页
int pageNumber = 1;
try {
pageNumber = Integer.getInteger(request.getParameter("pageNumber"));
} catch (Exception e) {
}
int pageSize = 3 ; //暂时固定值
//1.2 获得当前用户
User loginUser = (User) request.getSession().getAttribute("loginUser");
//2 通过业务层查询
OrderService orderService = new OrderServiceImpl();
PageBean<Order> pageBean = orderService.findByUid(loginUser , pageNumber,pageSize);
//3 显示数据
request.setAttribute("pageBean", pageBean);
return "/jsp/order_list.jsp";
}
//接口
//通过用户查询订单
PageBean<Order> findByUid(User loginUser, int pageNumber, int pageSize)throws Exception;
//实现类
@Override
public PageBean<Order> findByUid(User user, int pageNumber, int pageSize)throws Exception{
//1 查询总记录数
int totalRecord = orderDao.findTotalRecordByUid(user);
//2 封装数据
PageBean<Order> pageBean = new PageBean<>(pageNumber, pageSize, totalRecord);
//3 分页数据
List<Order> data = orderDao.findAllByUid(user , pageBean.getStartIndex() , pageBean.getPageSize());
pageBean.setData(data);
return pageBean;
}
//接口
/**
* 通过用户查询订单总记录数
* @param user 指定用户
* @return
*/
int findTotalRecordByUid(User user)throws SQLException;
/**
* 查询用户订单分页数据
* @param user 指定用户
* @param startIndex 开始索引
* @param pageSize 每页显示个数
* @return
*/
List<Order> findAllByUid(User user, int startIndex, int pageSize)throws Exception;
//实现类
@Override
public int findTotalRecordByUid(User user) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select count(*) from orders where uid = ?";
Long count = (Long) queryRunner.query(sql, new ScalarHandler(), user.getUid());
return count.intValue();
}
@Override
public List<Order> findAllByUid(User user, int startIndex, int pageSize) throws Exception {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from orders where uid = ? order by ordertime desc limit ?,?";
List<Order> list = queryRunner.query(sql, new BeanListHandler<Order>(Order.class), user.getUid(), startIndex,
pageSize);
// 遍历获得每个订单:
for (Order order : list) {
// 进行查询每个订单的订单项:
sql = "SELECT * FROM orderitem o,product p WHERE oid = ? AND o.pid=p.pid";
// Array ArrayList Map MapList Bean BeanList ColumnName Scalar Keyed
List<Map<String, Object>> oList = queryRunner.query(sql, new MapListHandler(), order.getOid());
for (Map<String, Object> map : oList) {
// 将属于订单项的封装到OrderItem中.
OrderItem orderItem = new OrderItem();
BeanUtils.populate(orderItem, map);
// 将属于商品的数据封装到Product中.
Product product = new Product();
BeanUtils.populate(product, map);
orderItem.setProduct(product);
orderItem.setOrder(order);
order.getList().add(orderItem);
}
order.setUser(user);
}
return list;
<%--遍历订单 --%>
<c:forEach items="${pageBean.data}" var="order">
<tbody>
<tr>
<th colspan="5">订单编号:${order.oid} </th>
</tr>
<tr>
<th>图片</th>
<th>商品</th>
<th>价格</th>
<th>数量</th>
<th>小计</th>
</tr>
<c:forEach items="${order.list}" var="orderItem">
<tr>
<td width="60" width="40%">
<input type="hidden" name="id" value="22">
<img src="${pageContext.request.contextPath}/${orderItem.product.pimage}" width="70" height="60">
</td>
<td width="30%">
<a target="_blank">${orderItem.product.pname}</a>
</td>
<td width="20%">
¥${orderItem.product.shop_price}
</td>
<td width="10%">
${orderItem.subtotal}
</td>
<td width="15%">
<span>¥${orderItem.subtotal}</span>
</td>
</tr>
</c:forEach>
</tbody>
</c:forEach>
订单编号:${order.oid} , ${order.state},
<c:if test="${ order.state == 1 }">
<a href="${pageContext.request.contextPath}/OrderServlet?method=findByOid&oid=${order.oid }">付款</a>
</c:if>
<c:if test="${ order.state == 2 }">
等待发货
</c:if>
<c:if test="${ order.state == 3 }">
确认收货
</c:if>
<c:if test="${ order.state == 4 }">
订单结束
</c:if>
<font color="#b00">总金额:${order.total}</font>
//通过订单id查询详情
public String findByOid(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1获得当前页
String oid = request.getParameter("oid");
//2 通过业务层查询
OrderService orderService = new OrderServiceImpl();
Order order = orderService.findByOid(oid);
//3 显示数据
request.setAttribute("order", order);
return "/jsp/order_info.jsp";
}
//接口
//通过oid查询订单详情
Order findByOid(String oid);
//实现类
public Order findByOid(String oid) {
return orderDao.findByOid(oid);
}
//接口
/**
* 通过oid查询详情
* @param oid
* @return
*/
Order findByOid(String oid) throws Exception;
//实现类
@Override
public Order findByOid(String oid) throws Exception {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from orders where oid = ?";
Order order = queryRunner.query(sql, new BeanHandler<Order>(Order.class), oid);
// 封装Order中list集合的数据
sql = "select * from orderitem o,product p where o.pid = p.pid and o.oid = ?";
List<Map<String, Object>> oList = queryRunner.query(sql, new MapListHandler(), oid);
for (Map<String, Object> map : oList) {
OrderItem orderItem = new OrderItem();
BeanUtils.populate(orderItem, map);
Product product = new Product();
BeanUtils.populate(product, map);
orderItem.setProduct(product);
orderItem.setOrder(order);
order.getList().add(orderItem);
}
return order;
}
订单编号:${order.oid}
<tr>
<th>图片</th>
<th>商品</th>
<th>价格</th>
<th>数量</th>
<th>小计</th>
</tr>
<c:forEach items="${order.list}" var="orderItem">
<tr>
<td width="60" width="40%">
<input type="hidden" name="id" value="22">
<img src="${pageContext.request.contextPath}/${orderItem.product.pimage}" width="70" height="60">
</td>
<td width="30%">
<a target="_blank">${orderItem.product.pname}.</a>
</td>
<td width="20%">
¥${orderItem.product.shop_price}
</td>
<td width="10%">
${orderItem.count}
</td>
<td width="15%">
<span>¥${orderItem.subtotal}</span>
</td>
</tr>
</c:forEach>
商品金额: <strong style="color:#ff6600;">¥${order.total}.00元</strong>
<form id="orderForm" action="${pageContext.request.contextPath}/OrderServlet" >
<%--隐藏字段 --%>
<input type="hidden" name="method" value="payOrder"/>
<input type="hidden" name="oid" value="${order.oid}"/>
<input name="address" placeholder="请输入收货地址">
<input name="name" placeholder="请输收货人">
<input name="telephone" placeholder="请输入联系方式">
<input type="radio" name="pd_FrpId" value="ICBC-NET-B2C" checked="checked" />工商银行
<a href="javascript:document.getElementById('orderForm').submit();">
</form>
// 订单付款
public String payOrder(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1 获得请求参数
String oid = request.getParameter("oid");
String name = request.getParameter("name");
String address = request.getParameter("address");
String telephone = request.getParameter("telephone");
String pd_FrpId = request.getParameter("pd_FrpId");
//2 调用业务层,查询订单,并修改订单状态
OrderService orderService = new OrderServiceImpl();
Order order = orderService.findByOid(oid);
order.setAddress(address);
order.setName(name);
order.setTelephone(telephone);
orderService.update(order);
//3 重定向到第三方平台
String p0_Cmd = "Buy";
String p1_MerId = "10001126856";
String p2_Order = oid;
String p3_Amt = "0.01";
String p4_Cur = "CNY";
String p5_Pid = "";
String p6_Pcat = "";
String p7_Pdesc = "";
String p8_Url = "http://localhost:8080/"+request.getContextPath()+"/OrderServlet?method=callBack";
String p9_SAF = "";
String pa_MP = "";
String pr_NeedResponse = "1";
String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt, p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP, pd_FrpId, pr_NeedResponse, keyValue);
StringBuffer sb = new StringBuffer("https://www.yeepay.com/app-merchant-proxy/node?");
sb.append("p0_Cmd=").append(p0_Cmd).append("&");
sb.append("p1_MerId=").append(p1_MerId).append("&");
sb.append("p2_Order=").append(p2_Order).append("&");
sb.append("p3_Amt=").append(p3_Amt).append("&");
sb.append("p4_Cur=").append(p4_Cur).append("&");
sb.append("p5_Pid=").append(p5_Pid).append("&");
sb.append("p6_Pcat=").append(p6_Pcat).append("&");
sb.append("p7_Pdesc=").append(p7_Pdesc).append("&");
sb.append("p8_Url=").append(p8_Url).append("&");
sb.append("p9_SAF=").append(p9_SAF).append("&");
sb.append("pa_MP=").append(pa_MP).append("&");
sb.append("pd_FrpId=").append(pd_FrpId).append("&");
sb.append("pr_NeedResponse=").append(pr_NeedResponse).append("&");
sb.append("hmac=").append(hmac);
// 使用重定向:
response.sendRedirect(sb.toString());
return null;
}
//接口
//更新
void update(Order order)throws SQLException;
//实现类
public void update(Order order) throws SQLException{
orderDao.update(order);
}
//接口
/**
* 更新订单
* @param order
*/
void update(Order order)throws SQLException;
//实现类
public void update(Order order) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "update orders set total=?,state=?,address=?,name=?,telephone=? where oid = ?";
Object[] params = { order.getTotal(), order.getState(),
order.getAddress(), order.getName(),
order.getTelephone(), order.getOid() };
queryRunner.update(sql, params);
}
//付款成功,回调方法,修改订单状态
public String callBack(HttpServletRequest request, HttpServletResponse response)
throws Exception {
String r6_Order = request.getParameter("r6_Order");
String r3_Amt = request.getParameter("r3_Amt");
OrderService orderService = new OrderServiceImpl();
Order order = orderService.findByOid(r6_Order);
order.setState(2);
orderService.update(order);
request.setAttribute("msg", "请!您已经付款成!订单号为:"+r6_Order+" 支付的金额为:"+r3_Amt);
return "/jsp/msg.jsp";
}
我们已经完成用户管理、商品管理、分类管理、订单管理等功能模块,订单模块和购物车模块必须确保用户登录后才能访问,我们会在servlet中编写相同的校验代码,我们可以通过权限过滤器统一处理。
public class PrivilegeFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
User loginUser = (User) req.getSession().getAttribute("loginUser");
if(loginUser == null){
req.setAttribute("msg", "您还没有登录!没有权限访问!");
req.getRequestDispatcher("/jsp/msg.jsp").forward(req, response);
return;
}
chain.doFilter(req, response);
}
@Override
public void destroy() {
}
}
<filter>
<filter-name>PrivilegeFilter</filter-name>
<filter-class>cn.com.javahelp.store.web.filter.PrivilegeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrivilegeFilter</filter-name>
<url-pattern>/jsp/order_info.jsp</url-pattern>
<url-pattern>/jsp/order_list.jsp</url-pattern>
<url-pattern>/OrderServlet</url-pattern>
<url-pattern>/jsp/CartServlet</url-pattern>
</filter-mapping>
今天我们要用EASYUI技术来实现WEB系统的后台界面,如下图:
*_利用layout组件为后台页面进行整体布局布局形式为”西南北中”形式
*_利用according组件为后台页面西部区域进行布局,并且设置对应的点击链接
*_利用tabs组件为后台页面的中间区域实现布局
*_实现页面的JQ代码
<body>
<!-- 北部start... -->
<div region="north"
split="true"
border="false"
style="overflow: hidden;
height:30px;
background:url(/images/layout-browser-hd-bg.gif)
#7f99be repeat-x center 50%;
line-height:20px;
color:#fff;
font-family:Verdana, 微软雅黑,黑体">
<span style="float:right;padding-right:20px;">欢迎管理员ad001
<a href="#" style="color:white;text-decoration: none" id="loginOut">
安全退出
</a>
</span>
<span style="padding-left:10px; font-size: 15px;">悟空教程商城 后台</span>
</div>
<!-- 北部end... -->
<!-- 南部start.. -->
<div region="south" split="true" style="height: 30px; background: #D2E0F2; ">
<div style="text-align:center;color:#15428B; margin:0px;
padding:0px;line-height:23px; font-weight:bold;">
传智播客版权所有
</div>
</div>
<!-- 南部end.. -->
<!-- 西部start...-->
<div data-options="region:'west',title:'',split:true,border:false"
style="width:180px;">
</div>
<!-- 西部end... -->
<!-- 中间start... -->
<div data-options="region:'center',title:'',border:false"
style="padding:5px;background:#eee;">
</div>
<!-- 中间end... -->
</body>
在西部区域加入以下内容
<div id="aa"
style="width:300px;height:200px;" data-options="fit:true,border:false">
<div title="分类管理" data-options="" style="padding:10px;">
<a href="http://www.baidu.com">访问百度</a>
</div>
<div title="商品管理" data-options="selected:true">
<a href="http://www.jd.com">访问京东</a>
<a href="http://www.taobao.com">访问淘宝</a>
</div>
<div title="订单管理">
<a href="http://www.csdn.com">访问CSDN</a><br/>
</div>
为了使according组件中链接的样式好看,加入以下样式
.aa{ width:80%; background-color:#E0ECFF;
display:block;margin:10px auto;font-size: 15px;}
<div id="tt" style="width:500px;height:250px;"
data-options="fit:true">
<div title="首页"
data-options="iconCls:'icon-reload',border:false,closable:true"
style="padding:20px;">
欢迎来到首页
</div>
</div>
实现以下JQ语句
$(function(){
$("a[class=aa]").click(function(){
//alert("DDDD");
var url=this.href;
var title=this.innerHTML;
//alert(url+"<===>"+title);
addTab(url,title);
return false;
});
$(".aa").mouseover(function(){
$(this).css("background","");
$(this).css("background","#31507B").css("color","#FFF");
});
$(".aa").mouseout(function(){
$(this).css("background","");
$(this).css("background","#E0ECFF").css("color","#000");
});
});
function addTab(url,title){
if(!$("#tt").tabs("exists",title)){
$("#tt").tabs("add",{
title:title,
content:createStr(url),
closable:true
});
}else{
$("#tt").tabs("select",title);
}
}
function createStr(url){
Var str="<iframesrc='"+url+"' style='width:100%;height:100%'
frameborder='0'/>";
return str;
}
用DataGrid组件实现对分类的管理
<table id="dg"></table>
$('#dg').datagrid({
url:'datagrid_data.json',
columns:[[
{field:'code',title:'Code',width:100},
{field:'name',title:'Name',width:100},
{field:'price',title:'Price',width:100,align:'right'}
]]
});
url | 一个URL从远程站点请求数据 |
---|---|
fitColumns | 真正的自动展开/收缩列的大小,以适应网格的宽度,防止水平滚动。 |
singleSelect | 如果为true,则只允许选择一行 |
rownumbers | 如果为true,则显示一个行号列 |
columns | DataGrid列配置对象 |
toolbar | 顶部工具栏的DataGrid面板 一个数组,每个工具属性都和linkbutton一样 $('#dg').datagrid({toolbar: [{iconCls: 'icon-edit',handler: function(){alert('编辑按钮')}},'-',{iconCls: 'icon-help',handler: function(){alert('帮助按钮')}}]}); |
1_在页面/admin/category/category.jsp中采用JQ的方式创建DataGrid
2_在页面上实现Dialog对话框
3_完成页面的JQ代码
创建DataGrid组件
页面端代码:
<div style="width:60%;margin:50px auto;">
<table id="dg"></table>
</div>
$(function(){
$('#dg').datagrid({
url:'/store_v3/CategoryServlet?method=findAllCats',
fitColumns:true,
singleSelect:true,
rownumbers:true,
columns:[[
{field:'cid',title:'分类id',width:100},
{field:'cname',title:'分类名称',width:100}
]],
toolbar: [
{
iconCls: 'icon-edit',
text:'编辑',
handler: function(){
alert(“您正在编辑”);
}
},'-',{
iconCls: 'icon-add',
text:'添加分类',
handler: function(){
alert(“您正在添加”);
}
},'-',{
iconCls: 'icon-remove',
text:'删除分类',
handler: function(){
alert(“您正在删除”);
}
}]
});
});
服务端代码
CategoryService CategoryService=new CategoryServiceImp();
List<Category> list=CategoryService.findAllCats();
String jsonStr=JSONArray.fromObject(list).toString();
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(jsonStr);
创建对话框组件
<div id="dd"
class="easyui-dialog"
title="修改分类"
style="width:300px; height:160px;padding:5px;background: #fafafa;"
data-options="closed:true,iconCls:'icon-edit'">
<div fit="true">
<div region="center"
border="false"
style="padding:10px;background:#fff;border:1px solid #ccc;">
<table cellpadding='3'>
<tr id="row">
<td>分类id</td>
<td><input id="cid" type="text" name="cid"/></td>
</tr>
<tr>
<td>分类名称</td>
<td><input id="cname" type="text" name="cname"/></td>
</tr>
</table>
</div>
<div region="south"
border="false"
style="text-align:right;height:30px;line-height:30px;">
<a id="btnEp"
icon="icon-ok" href="javascript:void(0)">确定</a>
<a id="btnCancel"
icon="icon-cancel" href="javascript:void(0)">取消</a>
</div>
</div>
</div>
页面端代码:
var obj=$("#dg").datagrid("getSelected");
console.log(obj);
if(null!=obj){
globalUrl="/store_v3/AdminCategoryServlet?method=editCat";
$("#cid").val(obj.cid);
$("#cname").val(obj.cname);
$("#cid").attr("readonly",true);
$("#dd").dialog("open");
}else{
$.messager.alert("警告","请选中修改分类","warning");
}
服务端代码
Category cat=MyBeanUtils.populate(Category.class, req.getParameterMap());
CategoryService CategoryService=new CategoryServiceImp();
CategoryService.updateCategory(cat);
String jsonStr="{\"flag\":true}";
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(jsonStr);
return null;
页面端代码
globalUrl="/store_v3/AdminCategoryServlet?method=addCat";
$("#row").css("display","none");
$("#cname").val("");
$("#dd").dialog("open");
服务端代码
String cname=req.getParameter("cname");
Category cat=new Category();
cat.setCid(UUIDUtils.getId());
cat.setCname(cname);
CategoryService CategoryService=new CategoryServiceImp();
CategoryService.addCat(cat);
String jsonStr="{\"flag\":true}";
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(jsonStr);
return null;
页面端代码
var obj=$("#dg").datagrid("getSelected");
if(null!=obj){
$.messager.confirm("删除确认","你真忍心删除吗?",function(dt){
if(dt==true){
$.post("/store_v3/AdminCategoryServlet",
{"method":'delCat',"cid":obj.cid},
function(dt2){
$("#dd").dialog("close");
$("#dg").datagrid("reload");
});
}
});
}else{
$.messager.alert("警告","请选中被删除的分类","warning");
}
服务端代码
Category cat=MyBeanUtils.populate(Category.class, req.getParameterMap());
CategoryService CategoryService=new CategoryServiceImp();
CategoryService.delCategory(cat);
String jsonStr="{\"flag\":true}";
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(jsonStr);
return null;
页面端代码
$.ajax({
url:globalUrl,
beforeSend:function(){
if($("#cname").val()==""){
$.messager.alert("提示","请输入分类名称","warning");
return false;
}
},
data:{"cid":$("#cid").val(),"cname":$("#cname").val()},
success:function(dt){
if(dt.flag==true){
$("#dd").dialog("close");
$("#dg").datagrid("reload");
}
},
type:'post',
dataType:"json"
});
$("#dd").dialog("close");
利用DataGrid组件,Form组件以及分页组件实现对后台商品的管理
Form组件的使用方式
<form id="ff" method="post">
<div>
<label for="name">Name:</label>
<input type="text"
name="name" data-options="required:true"/>
</div>
<div>
<label for="email">Email:</label>
<input type="text"
name="email" data-options="validType:'email'"/>
</div>
</form>
利用Form组件可以很方便的实现表单的Ajax提交动作
$('#ff').form('submit', {
url:...,
onSubmit: function(){
// do some check
// return false to prevent submit;
},
success:function(data){
alert(data)
}
});
修改后台主页中的链接
<a href="${pageContext.request.contextPath}/admin03/product/product_list.jsp">
商品查看</a>
1_当用户点击商品查看链接时,向服务端发起请求,请求product_list.jsp页面.服务端返回
product_list.jsp页面,浏览器识别页面中的datagrid组件和分页组件
2_当页面加载完毕之后,浏览器再次向服务端发起一个ajax请求,获取首页的全部商品
信息以及全部商品的数量,并将返回的数据绑定在datagrid组件和分页组件上
3_为分页组件绑定onSelect事件,当用户点击不同页面时,向服务端再次发起请求
1_实现页面中datagrid组件和分页组件的创建
<div id="tb">
<a href="#"
class="easyui-linkbutton"
data-options="iconCls:'icon-add',plain:true" style="font-size: 12px;background: rgb(224, 224, 224)"> 添加</a>|
<a href="#"
data-options="iconCls:'icon-remove',plain:true" style="font-size: 12px;background: rgb(224, 224, 224)"> 删除</a>
</div>
<div style="width:1000px;margin:30px auto;">
<table id="dg" class="easyui-datagrid">
<thead>
<tr>
<th data-options="field:'pid',width:100">编号</th>
<th data-options="field:'pimage',
width:100,
formatter:
function(v){
return '<img src=${pageContext.request.contextPath}/'+v+' height=50px />'}">
商品</th>
<th data-options="field:'pname',width:200">名称</th>
<th data-options="field:'shop_price',width:100,align:'right'">价格</th>
<th data-options="field:'pflag',width:100">下架</th>
</tr>
</thead>
</table>
<!-- 分页栏 -->
<div id="pp" data-options=""
style="background:#efefef;border:1px solid #ccc;"></div>
</div>
2_页面加载完毕之后向服务端发送AJAX请求,获取响应数据,填充DataGrid组件和分页组件
$("#dg").datagrid({
url:"${pageContext.request.contextPath}/AdminProductServlet?method=findAllProductsWithAjax&num=1",
fitColumns:true,
singleSelect:true,
toolbar:'#tb',
fitColumns:true,
singleSelect:true,
loadFilter : function(data) {
var data_ = {
"rows" : data.list,
"total" : data.total
};
$("#pp").pagination({
total:data.total,
pageSize:8,
pageList:[8]
});
return data_;
}
});
$("#pp").pagination({
onSelectPage: function(pageNumber, pageSize){
$("#dg").datagrid( { url :"${pageContext.request.contextPath}/AdminProductServlet?method=findAllProductsWithAjax&num="+pageNumber,
closable : true,
checkOnSelect : true,
striped : true,
rownumbers : true,
fitColumns : true,
loadFilter : function(data) {
var data_ = {
"rows" : data.list,
"total" :data.total
}
$("#pp").pagination( {
total : data.total
});
return data_;
}
});
}
});
3_实现服务端代码
int curNum=Integer.parseInt(req.getParameter("num"));
ProductService ProductService = new ProductServiceImp();
PageModel pm=ProductService.findProductsWithPage(curNum);
List<Product> list=pm.getList();
for(Product p:list){
p.setPdate(null);
}
Map<String,Object> map=new HashMap<String,Object>();
map.put("list", list);
map.put("total", pm.getTotalRecords());
String jsonStr=JSONObject.fromObject(map).toString();
System.out.println(jsonStr);
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().println(jsonStr);
return nul;
1_页面端实现上传商品对话框
2_当在对话框中填写完商品数据之后,点击确定,利用Form组件向服务端发起Ajax请求
3_服务端接受商品数据,将图片存入到服务端的某个路径下,同时将数据存入到数据库中,向客户端
返回上传成功提示信息
4_浏览器接收到上传成功消息,关闭对话框,重新加载DataGrid组件中的内容
步骤1_实现上传商品对话框
<div id="dd"
class="easyui-dialog"
title="添加商品"
style="width:315px;height:200px;padding:5px;background: #fafafa;"
data-options="closed:true,iconCls:'icon-add'">
<div fit="true">
<div region="center"
border="false"
style="padding:10px;background:#fff;border:1px solid #ccc;">
<form method="post" enctype="multipart/form-data" id="fm">
<table cellpadding='3' border="0">
<tr>
<td>商品</td>
<td><input type="file" name="pimage"/></td>
</tr>
<tr>
<td>名称</td>
<td><input id="pname" type="text" name="pname"/></td>
</tr>
<tr>
<td>价格</td>
<td><input type="text" name="shop_price"/></td>
</tr>
</table>
</form>
</div>
<div region="south" border="false"
style="text-align:right;height:30px;line-height:30px;">
<a id="btnEp" icon="icon-ok"
href="javascript:void(0)">确定</a>
<a id="btnCancel" icon="icon-cancel"
href="javascript:void(0)">取消</a>
</div>
</div>
</div>
步骤2_点击DataGrid组件中的添加商品功能
globalUrl="/store_v3/AddProductServlet";
$("#dd").dialog("open");
PS:globalUrl为JS中定义好的一个全局变量,存储不同的路径
步骤3:点击保存功能
$("#btnEp").click(function(){
$('#fm').form('submit', {
url:"${pageContext.request.contextPath}/AddProductServlet",
onSubmit: function(){
},
success:function(data){
var dt=eval("("+data+")");
if(dt.flag){
$.messager.alert("成功提示",dt.msg,"info");
$("#dd").dialog("close");
$("#dg").datagrid("reload");
}
}
});
});
步骤4:完成服务端商品上传代码
DiskFileItemFactory fac=new DiskFileItemFactory();
ServletFileUpload fileUpload=new ServletFileUpload(fac);
//携带数据
Product product=new Product();
Map<String,String> map=new HashMap<String,String>();
try {
List<FileItem> list=fileUpload.parseRequest(request);
for(FileItem item:list){
if(item.isFormField()){
map.put(item.getFieldName(), item.getString());
}else{
//获取到服务端图片要上传的真实路径 D:\tomcat\tomcat\wtpwebapps\store_v3\products\3
String path=this.getServletContext().getRealPath("/products/3");
System.out.println("path....."+path);
//获取文件名称 111.bmp
String fileName=item.getName();
//获取文件最终名称 2343242342432424.bmp
String fName=UploadUtils.getUUIDName(fileName);
// /4/a/f/c/2/7/7/0
String path02=UploadUtils.getDir(fName);
// D:\tomcat\tomcat\wtpwebapps\store_v3\products\3/4/a/f/c/2/7/7/0
File f=new File(path+path02);
//创建文件夹
if(!f.exists()){
f.mkdirs();
}
//创建文件
//D:\tomcat\tomcat\wtpwebapps\store_v3\products\3/4/a/f/c/2/7/7/0
//2343242342432424.bmp
File ff=new File(f,fName);
if(!ff.exists()){
ff.createNewFile();
}
FileOutputStream ops=new FileOutputStream(ff);
InputStream is=item.getInputStream();
IOUtils.copy(is, ops);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(ops);
// products/3/4/a/f/c/2/7/7/0
product.setPimage("products/3"+path02+"/"+fName);
}
}
BeanUtils.populate(product, map);
product.setPid(UUIDUtils.getId());
product.setPdate(new Date());
product.setPflag(0);
System.out.println(product);
ProductService ProductService=new ProductServiceImp();
ProductService.addProduct(product);
Map<String,String> mp=new HashMap<String,String>();
mp.put("msg", "文件上传成功");
mp.put("flag", "true");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(JSONObject.fromObject(mp).toString());
} catch (Exception e) {
e.printStackTrace();
}
点击取消按钮时
$("#btnCancel").click(function(){
$("#dd").dialog("close");
});
将项目部署到linux系统下
vim /etc/profile
vim /etc/sysconfig/iptables
yum install MySQL-*.rpm
创建远程访问用户
use mysql;
select user,host,password from user;
create user 'root'@'%' identified by '1234'; #创建用户,并设置密码
grant all on *.* to 'root'@'%' with grant option; #给指定的用户授权
flush privileges; #刷新权限