Web-第二十三天 Web商城实战三【悟空教程】

Web-第二十三天 Web商城实战三【悟空教程】

网上商城实战三

今日内容介绍

  • 订单管理/我的订单
  • 订单管理/订单详情
  • 订单管理/在线支付
  • 权限过滤器
  • 后台页面搭建
  • 后台分类管理
  • 后台商品管理
  • 项目部署

今日内容学习目标

  • JavaWeb知识巩固
  • 搭建商城后台页面
  • 实现后台分类管理

第1章 订单管理

1.1 我的订单

1.1.1 分析

1.1.2 代码实现

  • 步骤1:修改header.jsp页面,查看“我的订单”

<a href="${pageContext.request.contextPath}/OrderServlet?method=findByUid">我的订单</a>

  • 步骤2:修改OrderServlet,添加findByUid()方法

//我的订单

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";

}

  • 步骤3:修改OrderService,添加findByUid()方法

//接口

//通过用户查询订单

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;

}

  • 步骤4:修改OrderDao,提供findTotalRecordByUid() 和 findAllByUid() 两个方法

//接口

/**

* 通过用户查询订单总记录数

* @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;

  • 步骤5:jsp页面显示表单数据

<%--遍历订单 --%>

<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>

1.2 订单详情

1.2.1 分析

1.2.2 代码实现

  • 步骤1:显示“我的订单”时,显示订单状态state对应的文字提示

订单编号:${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>

  • 步骤2:修改OrderServlet,添加findByOid方法,点击“付款”,根据订单id查询看订单详情。

//通过订单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";

}

  • 步骤3:修改OrderService,添加findByOid()方法

//接口

//通过oid查询订单详情

Order findByOid(String oid);

//实现类

public Order findByOid(String oid) {

return orderDao.findByOid(oid);

}

  • 步骤4:修改OrderDao,添加findByOid()方法

//接口

/**

* 通过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;

}

  • 步骤5:修改/jsp/order_info.jsp页面,显示详情,准备付款。

订单编号:${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>

1.3 在线支付(了解)

1.3.1 分析

1.3.2 代码实现

  • 步骤1:修改/jsp/order_info.jsp ,完成支付。表单摘要如下:

<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>

  • 步骤2:修改OrderServlet,添加payOrder方法

// 订单付款

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;

}

  • 步骤3:修改service

//接口

//更新

void update(Order order)throws SQLException;

//实现类

public void update(Order order) throws SQLException{

orderDao.update(order);

}

  • 步骤4:修改dao

//接口

/**

* 更新订单

* @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);

}

  • 步骤5:回调程序,修改OrderServlet,添加callback()方法

//付款成功,回调方法,修改订单状态

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";

}

第2章 权限过滤器

2.1 需求

我们已经完成用户管理、商品管理、分类管理、订单管理等功能模块,订单模块和购物车模块必须确保用户登录后才能访问,我们会在servlet中编写相同的校验代码,我们可以通过权限过滤器统一处理。

2.2 代码实现

  • 步骤1:实现类

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() {

}

}

  • 步骤2:web.xml配置,只对订单操作、购物车操作进行登录权限校验

<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>

第3章 后台页面搭建

3.1 需求

今天我们要用EASYUI技术来实现WEB系统的后台界面,如下图:

3.2 相关知识点

3.3 案例分析

*_利用layout组件为后台页面进行整体布局布局形式为”西南北中”形式

*_利用according组件为后台页面西部区域进行布局,并且设置对应的点击链接

*_利用tabs组件为后台页面的中间区域实现布局

*_实现页面的JQ代码

3.4 代码实现

3.4.1 步骤1

<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>

3.4.2 步骤2

在西部区域加入以下内容

<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;}

3.4.3 步骤3

<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>

3.4.4 步骤4

实现以下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;

}

第4章 后台分类管理

4.1 需求分析

用DataGrid组件实现对分类的管理

4.2 相关知识点

4.2.1 组件DataGrid的使用

4.2.1.1 JQ方式创建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'}

]]

});

4.2.1.2 DataGrid组件的属性

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('帮助按钮')}}]});

4.3 案例分析

1_在页面/admin/category/category.jsp中采用JQ的方式创建DataGrid

2_在页面上实现Dialog对话框

3_完成页面的JQ代码

4.4 代码实现

4.4.1 步骤1

创建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);

4.4.2 步骤2

创建对话框组件

<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>

4.4.3 步骤3

4.4.3.1 点击DataGrid组件上的编辑按钮

页面端代码:

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;

4.4.3.2 点击DataGrid组件上的添加按钮

页面端代码

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;

4.4.3.3 点击DataGrid组件上的删除按钮

页面端代码

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;

4.4.3.4 点击保存按钮

页面端代码

$.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"

});

4.4.3.5 点击对话框上的取消按钮是

$("#dd").dialog("close");

第5章 后台商品管理

5.1 需求

利用DataGrid组件,Form组件以及分页组件实现对后台商品的管理

5.2 相关知识点

5.2.1 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)

}

});

5.3 查询商品信息

5.3.1 准备工作

修改后台主页中的链接

<a href="${pageContext.request.contextPath}/admin03/product/product_list.jsp">

商品查看</a>

5.3.2 分析

1_当用户点击商品查看链接时,向服务端发起请求,请求product_list.jsp页面.服务端返回

product_list.jsp页面,浏览器识别页面中的datagrid组件和分页组件

2_当页面加载完毕之后,浏览器再次向服务端发起一个ajax请求,获取首页的全部商品

信息以及全部商品的数量,并将返回的数据绑定在datagrid组件和分页组件上

3_为分页组件绑定onSelect事件,当用户点击不同页面时,向服务端再次发起请求

5.3.3 实现

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;

5.4 上传商品

5.4.1 分析:

5.4.1.1 流程分析

5.4.1.2 步骤分析

1_页面端实现上传商品对话框

2_当在对话框中填写完商品数据之后,点击确定,利用Form组件向服务端发起Ajax请求

3_服务端接受商品数据,将图片存入到服务端的某个路径下,同时将数据存入到数据库中,向客户端

返回上传成功提示信息

4_浏览器接收到上传成功消息,关闭对话框,重新加载DataGrid组件中的内容

5.4.2 代码实现

步骤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");

});

第6章 部署

6.1 需要

将项目部署到linux系统下

6.2 步骤

6.2.1 war包

  • 使用eclipse将web项目打成war包

6.2.2 准备工作

  • 安装jdk,已经配置

vim /etc/profile

  • 安装tomcat

vim /etc/sysconfig/iptables

  • 安装mysql

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; #刷新权限

  • 安装redis

6.2.3 初始化数据库数据

6.2.4 上传war到tomcat下

6.2.5 访问

6.2.6 注意:乱码问题

  • 如果是window 的cmd命令创建初始化数据库,需要

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

写在学习golang一个月后

连接池。由于PHP没有连接池,当高并发时就会有大量的数据库连接直接冲击到MySQL上,最终导致数据库挂掉。虽然Swoole有连接池,但是Swoole只是PHP的...

2372
来自专栏Google Dart

Dart 服务端开发 文件上传 原

1062
来自专栏移动端开发

iOS 测试三方 KIF 的那些事

一: KIF 三方库的配置       今天的广州天气还不错,原本想试试UI测试的,前几天也了解到很多公司都在用 KIF 这这三方框架!!今天也就试着做做,可就...

2316
来自专栏恰同学骚年

.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为客户端的统一入口)先向Identit...

1782
来自专栏GopherCoder

『No18: Go 实现世界杯后台管理系统』

趁着周末更新一期,上一期讲到 如何快速熟悉一个项目, 文章的最后讲到,最好的方法是借用相同的技术栈重新实现一个项目。

1671
来自专栏安恒网络空间安全讲武堂

[HCTF] share write up

从http://share.2018.hctf.io/robots.txt中获取到题目部分源码

952
来自专栏积累沉淀

CXF 框架拦截器

CXF的拦截器 •为什么设计拦截器? 1.为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. •拦截器分类: 1...

1966
来自专栏刘君君

使用Spring Event解耦业务开发

Spring 事件是观察者模式的一种体现,对象间的一对多关系,被观察者发出信号时候会通知监听该事件的观察者;而发布-订阅模型往往需要一个调度中心,如消息队列等

1882
来自专栏葡萄城控件技术团队

Url Rewrite 再说Url 重写

前几天看到园子里一篇关于 Url 重写的文章《获取ISAPI_Rewrite重写后的URL》 , URL-Rewrite 这项技术早已不是一项新技术了,这个话题...

5598
来自专栏比原链

Derek解读Bytom源码-P2P网络 地址簿

Gitee地址:https://gitee.com/BytomBlockchain/bytom

831

扫码关注云+社区

领取腾讯云代金券