任务1:添加商品类别
- 修改catelog/list.jsp上的添加超链接的路径
<a class="button border-main icon-plus-square-o"
href="${pageContext.request.contextPath}/catelog.action?method=toAdd">添加商品类别</a>
2.在CatelogServlet中加入一个toAdd方法,跳转到添加页面
// 准备添加
public void toAdd(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 转发到catelog/add.jsp
request.getRequestDispatcher("WEB-INF/jsp/catelog/add.jsp").forward(
request, response);
}
3.修改添加页面上表单的请求路径,以及元素的name
<form method="post" class="form-x"
action="${pageContext.request.contextPath}/catelog.action?method=add">
<div class="form-group">
<div class="label">
<label>类别名称:</label>
</div>
<div class="field">
<input type="text" class="input w80" name="catelog_name"
data-validate="required:请填写类别名称" />
<div class="tips"></div>
</div>
</div>
<div class="form-group">
<div class="label">
<label>类别描述:</label>
</div>
<div class="field">
<input type="text" class="input w80" name="catelog_miaoshu"
data-validate="required:请填写类别名称" />
<div class="tips"></div>
</div>
4.在CatelogDao中加入添加商品类别方法,实现类代码
@Override
public int insert(Catelog catelog) {
// TODO Auto-generated method stub
String sql = "insert into t_catelog(catelog_name,catelog_miaoshu) values(?,?)";
int i = JdbcUtil.executeUpdate(sql, catelog.getCatelog_name(),
catelog.getCatelog_miaoshu());
return i;
}
5.在CatelogService中加入添加商品类别方法
@Override
public boolean addCatelog(Catelog catelog) {
// TODO Auto-generated method stub
int i = dao.insert(catelog);
return i>0;
}
6.在CatelogServlet中添加add方法处理添加商品类别请求
//处理添加商品请求
public void add(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取表单传来的参数
String catelog_name=request.getParameter("catelog_name");
String catelog_miaoshu=request.getParameter("catelog_miaoshu");
//封装成商品类别对象
Catelog catelog=new Catelog();
catelog.setCatelog_name(catelog_name);
catelog.setCatelog_miaoshu(catelog_miaoshu);
//调用service中的方法,完成添加功能
CatelogService service=new CatelogServiceImpl();
boolean flag = service.addCatelog(catelog);
//跳转到列表页面
if(flag){
response.sendRedirect("catelog.action?method=queryAll");
}
任务2:分页查询商品
- 修改main/index.jsp上商品管理的超链接路径
<a href="${pageContext.request.contextPath}/goods.action?method=queryByPage"
target="right"><span class="icon-caret-right"></span>商品管理</a>
- 2.创建GoodsDao,在里面加入分页查询的两个方法
@Override
public List<Goods> queryData(PageBean<Goods> pb, String keyword) {
// TODO Auto-generated method stub
String sql = "select goods_id,goods_name,goods_pic,goods_miaoshu,"
+ " catelog_name,market_price,mall_price,stock_num,enter_date from t_goods t1 join t_catelog t2 on t1.catelog_id=t2.catelog_id";
if (!keyword.equals("")) {
sql += " where goods_name like '%" + keyword + "%'";
}
sql += " order by goods_id limit ?,?"; // 手动处理结果集
Connection conn = JdbcUtil.getConnection();
PreparedStatement stmt = null;
ResultSet rs = null;
// 返回值
List<Goods> list = new ArrayList<Goods>();
try {
stmt = conn.prepareStatement(sql);
stmt.setInt(1, (pb.getCurrentPage() - 1) * pb.getPageSize());
stmt.setInt(2, pb.getPageSize());
rs = stmt.executeQuery();
while (rs.next()) {
// 创建Goods对象
Goods goods = new Goods();
goods.setGoods_id(rs.getInt(1));
goods.setGoods_name(rs.getString(2));
goods.setGoods_pic(rs.getString(3));
goods.setGoods_miaoshu(rs.getString(4));
// 创建Catelog对象
Catelog catelog = new Catelog();
catelog.setCatelog_name(rs.getString("catelog_name"));
// 建立商品和Catelog对象之间关系
goods.setCatelog(catelog);
goods.setMarket_price(rs.getInt("market_price"));
goods.setMall_price(rs.getInt("mall_price"));
goods.setStock_num(rs.getInt("stock_num"));
goods.setEnter_date(rs.getDate("enter_date"));
// 添加到集合中
list.add(goods);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbcUtil.closeAll(rs, stmt, conn);
}
return list;
}
@Override
public int queryCount(String keyword) {
// TODO Auto-generated method stub
String sql="select count(*) from t_goods t1 join t_catelog t2 on t1.catelog_id=t2.catelog_id";
if (!keyword.equals("")) {
sql += " where goods_name like '%" + keyword + "%'";
}
int total = this.getTotal(sql);
return total;
}
3.创建GoodService,加入模糊查询结合分页查询的方法getPageBean
@Override
public void getPageBean(PageBean<Goods> pb, String keyword) {
// TODO Auto-generated method stub
List<Goods> list = goodsDao.queryData(pb, keyword);
int totalCount = goodsDao.queryCount(keyword);
pb.setData(list);
pb.setTotalCount(totalCount);
}
4.在GoodsServlet中加入处理分页查询商品的方法
// 商品分页查询
public void queryByPage(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取请求的页号,即要查询第几页数据,假设请求参数名currentPage
String pageStr = request.getParameter("currentPage");
// 保存请求的页号
int currentPage = 1;
if (pageStr != null) {
currentPage = Integer.parseInt(pageStr);
}
// 每页条数
int pageSize = 5;
// 获取名称关键字
String keyword = request.getParameter("keyword");
if (keyword == null) {
keyword = "";
}
// 封装一个pageBean对象,它只有2个数据currentPage和pageSize
PageBean<Goods> pb = new PageBean<>();
pb.setCurrentPage(currentPage);
pb.setPageSize(pageSize);
// 调用Service的方法,传入PageBean对象
GoodsService service = new GoodsServiceImpl();
service.getPageBean(pb, keyword);
// 把pageBean存到request域中
request.setAttribute("pb", pb);
// 把关键字存到request域中
request.setAttribute("keyword", keyword);
// 转发到商品列表页面
request.getRequestDispatcher("WEB-INF/jsp/goods/list.jsp").forward(
request, response);
}
5.修改goods/list.jsp,将商品名关键字及搜索超链接包裹在一个表单中
<form action="${pageContext.request.contextPath}/goods.action?method=queryByPage" id="searchForm"
method="post">
<!-- 隐藏域保存页号 -->
<input type="hidden" name="currentPage" id="currentPage" value="1">
请输入商品名称关键字:<input type="text" name="keyword" id="keyword"
class="input"
style="width:200px; line-height:17px;display:inline-block" value="${keyword }" /> <a
href="javascript:void(0)" class="button border-main icon-search"
onclick="changePageNum(1)"> 搜索</a>
</form>
定义函数changePageNum()
//点击“分页”超链接后,跳转到指定的页面
function changePageNum(pageNum) {
//给保存页号的隐藏域赋值
$("#currentPage").val(pageNum);
//提交表单
$("#searchForm").submit();
}
任务3:添加商品
- 修改商品列表上”添加商品”超链接的路径
<a class="button border-main icon-plus-square-o"
href="${pageContext.request.contextPath}/goods.action?method=toAdd">
添加商品</a>
2.在GoodsServlet中添加方法toAdd,转发到商品添加页面
//准备添加
public void toAdd(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取所有的商品分类
CatelogService service=new CatelogServiceImpl();
List<Catelog> allCatelogs = service.getAllCatelogs();
//存到request域中
request.setAttribute("catelogs", allCatelogs);
// 转发到商品添加页面
request.getRequestDispatcher("WEB-INF/jsp/goods/add.jsp").forward(
request, response);
}
3.修改goods/add.jsp页面,把表单补全
<form method="post" class="form-x"
enctype="multipart/form-data" action="${pageContext.request.contextPath}/goods.action?method=add">
<div class="form-group">
<div class="label">
<label>商品名称:</label>
</div>
<div class="field">
<input type="text" class="input w80" name="goods_name"
data-validate="required:请填写商品名称" />
<div class="tips"></div>
</div>
</div>...
重点部分:表单里的下拉框中要回显所有商品分类
<select name="catelog_id">
<c:forEach var="ct" items="${catelogs }">
<option value="${ct.catelog_id }">${ct.catelog_name }</option>
</c:forEach>
</select>
补充:文件上传技术
- 文件上传表单必须加上 enctype="multipart/form-data",如果没有该属性则无法提交文件的二进制数据
<form action="sf.action" enctype="multipart/form-data" method="post">
选择文件:<input type="file" name="myimg" ><br>
<input type="submit" value="上传" >
</form>
2.创建UploadServlet处理文件上传请求,需要添加支持文件上传的注解
//@MultipartConfig:servlet3.0支持文件上传的注解
@MultipartConfig
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 文件上传:将本地的文件保存在服务器上面去,本质是IO流操作
// 1.获取服务器端保存上传文件的upload目录的绝对路径
String savePath = this.getServletContext().getRealPath("/upload");
System.out.println(savePath);
// 2.获取表单中传过来的文件域参数,
// getPart("表单元素的name"):获取文件域元素
// getParameter("元素的name"):获取普通元素的值
// getParts():获取所有元素(普通元素+文件域)
Part myimg = request.getPart("myimg");
System.out.println(myimg);
/*
* Collection<Part> parts = request.getParts(); for (Part part : parts)
* {
*
* System.out.println("表单元素的名称:"+part.getName()); }
*/
// 3.从Part对象中去解析文件名
// 文件上传的表单提交后,会将表单参数封装在Request Payload中,每个元素都有一个头Content-Disposition
// 使用part的getHeader("Content-Disposition")获取它的值,格式:
// form-data; name="myimg"; filename="1457614349430.jpg"
String header = myimg.getHeader("Content-Disposition");
//获取文件原始名称
String oldName = this.getOldName(header);
//4.调用Part对象的write方法将文件写入到服务器的savePath目录下,参数是文件的绝对路径
myimg.write(savePath+"/"+oldName);
System.out.println("上传成功");
}
// 从Content-Disposition头的值中提取出文件的原始名称
public String getOldName(String header) {
String[] strs = header.split(";");
String filename = strs[2];
filename = filename.substring(filename.indexOf("\"") + 1,
filename.length() - 1);
return filename;
}
}
接着完成添加商品的后台Servlet-->Dao处理
4 )在GoodsDao中加入insert方法
@Override
public int insert(Goods goods) {
String sql = "insert into t_goods(goods_name,goods_miaoshu,goods_pic,market_price,mall_price,catelog_id,stock_num,goods_address,enter_date) values(?,?,?,?,?,?,?,?,?)";
Object[] params = { goods.getGoods_name(), goods.getGoods_miaoshu(),
goods.getGoods_pic(), goods.getMarket_price(),
goods.getMall_price(), goods.getCatelog().getCatelog_id(),
goods.getStock_num(), goods.getGoods_address(),
goods.getEnter_date() };
int i=JdbcUtil.executeUpdate(sql, params);
return i;
}
- 5.在GoodsService中加入添加商品方法
@Override
public boolean addGoods(Goods goods) {
// TODO Auto-generated method stub
int i = goodsDao.insert(goods);
return i>0;
}
6.在GoodsServlet中加入处理添加商品的请求方法add,代码略
// 添加商品
public void add(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获取表单中的参数
// 1.1.获取普通表单参数(除文件域以外的)
String goods_name = request.getParameter("goods_name");
String goods_miaoshu = request.getParameter("goods_miaoshu");
int market_price = Integer.parseInt(request
.getParameter("market_price"));
int mall_price = Integer.parseInt(request.getParameter("mall_price"));
int catelog_id = Integer.parseInt(request.getParameter("catelog_id"));
int stock_num = Integer.parseInt(request.getParameter("stock_num"));
String goods_address = request.getParameter("goods_address");
String enter_dateStr = request.getParameter("enter_date");
// 把上面的日期字符串转换为Date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
Date enter_date = null;
try {
enter_date = sdf.parse(enter_dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 1.2.获取文件域,做上传处理
Part part = request.getPart("goods_pic");
String header = part.getHeader("Content-Disposition");
// 获取文件原始名称
String oldName = this.getOldName(header);
// 基于原始名称来得到新文件名,第1种:用当前时间戳来生成文件名(yyyyMMddHHmmssSSS)
// 第2种用U:UID来生成文件名
// 根据原始文件名得到新文件名
String newName = this.getNewName(oldName);
// 获取服务器端保存上传文件的upload目录的绝对路径
String savePath = this.getServletContext().getRealPath("/upload");
// 调用Part对象的write方法将文件写入到服务器的savePath目录下,参数是文件的绝对路径
part.write(savePath + "/" + newName);
// 2.封装一个商品对象
Goods goods = new Goods();
goods.setGoods_name(goods_name);
goods.setGoods_miaoshu(goods_miaoshu);
goods.setMall_price(mall_price);
goods.setMarket_price(market_price);
Catelog catelog = new Catelog();
catelog.setCatelog_id(catelog_id);
goods.setCatelog(catelog);
goods.setStock_num(stock_num);
goods.setGoods_address(goods_address);
goods.setEnter_date(enter_date);
// 封装图片路径
goods.setGoods_pic("upload/" + newName);
// 3.调用Service的方法,传入商品对象
GoodsService service = new GoodsServiceImpl();
boolean flag = service.addGoods(goods);
// 4.跳转到商品列表页面
if (flag) {
response.sendRedirect("goods.action?method=queryByPage");
}
}
// 从Content-Disposition头的值中提取出文件的原始名称
public String getOldName(String header) {
String[] strs = header.split(";");
String filename = strs[2];
filename = filename.substring(filename.indexOf("\"") + 1,
filename.length() - 1);
return filename;
}
// 根据原始文件名得到新文件名
public String getNewName(String oldName) {
// 获取文件扩展名
String ext = oldName.substring(oldName.lastIndexOf("."));
// 获取当前时间戳字符串,最后的SSS代表毫秒数
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String filename = sdf.format(new Date());
filename = filename + ext;
return filename;
}
// 准备修改
public void toUpdate(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取商品编号
int goodsId = Integer.parseInt(request.getParameter("goodsId"));
// 获取商品的信息,返回一个商品对象
GoodsService goodsService = new GoodsServiceImpl();
Goods goods = goodsService.getGoodsById(goodsId);
// 获取所有的商品分类
CatelogService service = new CatelogServiceImpl();
List<Catelog> allCatelogs = service.getAllCatelogs();
// 将商品对象,商品分类集合都存到request域中
request.setAttribute("gd", goods);
request.setAttribute("catelogs", allCatelogs);
// 跳转到update.jsp页面去回显数据
request.getRequestDispatcher("WEB-INF/jsp/goods/update.jsp").forward(
request, response);
}
任务4:修改商品
- 将列表页面上”修改”超链接改过来
<a class="button border-main" href="${pageContext.request.contextPath}/goods.action?method=toUpdate&goodsId=${gd.goods_id }"><span
class="icon-edit"></span> 修改</a>
2.在GoodsDao中加入查询商品对象的方法queryById()
//查询商品对象
Goods queryById(int goods_id);
3.在GoodsService中加入获取商品对象的方法
@Override
public Goods getGoodsById(int goods_id) {
// TODO Auto-generated method stub
Goods goods = goodsDao.queryById(goods_id);
return goods;
}
- 4.在GoodsServlet中加入准备修改的方法toUpdate
// 准备修改
public void toUpdate(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取商品编号
int goodsId=Integer.parseInt(request.getParameter("goodsId"));
//获取商品的信息,返回一个商品对象
GoodsService goodsService=new GoodsServiceImpl();
Goods goods = goodsService.getGoodsById(goodsId);
// 获取所有的商品分类
CatelogService service = new CatelogServiceImpl();
List<Catelog> allCatelogs = service.getAllCatelogs();
//将商品对象,商品分类集合都存到request域中
request.setAttribute("gd", goods);
request.setAttribute("catelogs", allCatelogs);
//跳转到update.jsp页面去回显数据
request.getRequestDispatcher("WEB-INF/jsp/goods/update.jsp").forward(
request, response);
}
- 5.在update.jsp页面上回显商品数据
<body>
<div class="panel admin-panel margin-top">
<div class="panel-head" id="add">
<strong><span class="icon-pencil-square-o"></span>修改新闻类型</strong>
</div>
<div class="body-content">
<form method="post" class="form-x"
action="${pageContext.request.contextPath}/goods.action?method=update">
<div class="form-group">
<div class="label">
<label>商品编号:</label>
</div>
<div class="field">
<input type="text" class="input w80" value="${gd.goods_id }"
name="goodsId" readonly="readonly" />
<div class="tips"></div>
</div>
</div>
<div class="form-group">
<div class="label">
<label>商品名称:</label>
</div>
<div class="field">
<input type="text" class="input w80" value="${gd.goods_name }"
name="goodsName" />
<div class="tips"></div>
</div>
</div>
<div class="form-group">
<div class="label">
<label>市场价:</label>
</div>
<div class="field">
<input type="text" class="input w80" value="${gd.market_price }"
name="market_price" />
<div class="tips"></div>
</div>
</div>
<div class="form-group">
<div class="label">
<label>商城价:</label>
</div>
<div class="field">
<input type="text" class="input w80" value="${gd.mall_price }"
name="mall_price" />
<div class="tips"></div>
</div>
</div>
<div class="form-group">
<div class="label">
<label>商品类别:</label>
</div>
<div class="field">
<select name="catelog_id">
<c:forEach var="ct" items="${catelogs }">
<option value="${ct.catelog_id }" ${ct.catelog_id eq gd.catelog.catelog_id?'selected':'' }>${ct.catelog_name }</option>
</c:forEach>
</select>
</div>
</div>
<div class="form-group">
<div class="label">
<label></label>
</div>
<div class="field">
<button class="button bg-main icon-check-square-o" type="submit">保存</button>
</div>
</div>
</form>
</div>
</div>
</body>
- 6.把update.jsp页面上表单的路径改一下
<form method="post" class="form-x"
action="${pageContext.request.contextPath}/goods.action?method=update">
- 7GoodsDao中加入修改商品方法
@Override
public int update(Goods goods) {
// TODO Auto-generated method stub
String sql="update t_goods set goods_name=?,market_price=?,mall_price=?,catelog_id=? where goods_id=?";
int i=JdbcUtil.executeUpdate(sql, goods.getGoods_name(),goods.getMarket_price(),goods.getMall_price(),goods.getCatelog().getCatelog_id(),goods.getGoods_id());
return i;
}
- 8GoodsService中加入修改商品方法
@Override
public boolean updateGoods(Goods goods) {
// TODO Auto-generated method stub
int i = goodsDao.update(goods);
return i>0;
}
- 9在GoodsServlet中加入修改商品的方法
// 修改商品
public void update(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取表单中的参数
int goods_id=Integer.parseInt(request.getParameter("goodsId"));
String goodsName=request.getParameter("goodsName");
int market_price=Integer.parseInt(request.getParameter("market_price"));
int mall_price=Integer.parseInt(request.getParameter("mall_price"));
int catelog_id=Integer.parseInt(request.getParameter("catelog_id"));
//封装一个商品对象
Goods gd=new Goods();
gd.setGoods_id(goods_id);
gd.setGoods_name(goodsName);
gd.setMarket_price(market_price);
gd.setMall_price(mall_price);
Catelog catelog=new Catelog();
catelog.setCatelog_id(catelog_id);
gd.setCatelog(catelog);
//调用service的修改商品方法
GoodsService service=new GoodsServiceImpl();
boolean flag = service.updateGoods(gd);
//跳转到列表页面
if (flag) {
response.sendRedirect("goods.action?method=queryByPage");
}
}
任务5:分页显示订单
- 修改main/index.jsp上的”订单管理”超链接
<a href="${pageContext.request.contextPath}/order.action?method=queryByPage"
target="right"><span class="icon-caret-right"></span>订单管理</a>
- 2创建OrderDao,添加针对分页查询的两个方法
public class OrderDaoImpl extends BaseDao<Order> implements OrderDao {
@Override
public List<Order> queryData(PageBean<Order> pb) {
String sql="select order_id,order_jine,order_time,order_address,order_zhuangtai from t_order limit ?,?";
List<Order> list = this.getList(Order.class, sql, (pb.getCurrentPage()-1)*pb.getPageSize(),pb.getPageSize());
return list;
}
@Override
public int queryCount() {
// TODO Auto-generated method stub
String sql="select count(*) from t_order";
int total = this.getTotal(sql);
return total;
}
}
- 3创建OrderService,添加getPageBean方法
@Override
public void getPageBean(PageBean<Order> pb) {
// TODO Auto-generated method stub
List<Order> list = dao.queryData(pb);
int totalCount = dao.queryCount();
// 封装PageBean对象的另2个属性
pb.setData(list);
pb.setTotalCount(totalCount);
}
- 4创建OrderServlet,加入处理分页查询的方法
// 分页查询订单
public void queryByPage(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取请求的页号,即要查询第几页数据,假设请求参数名currentPage
String pageStr = request.getParameter("currentPage");
// 保存请求的页号
int currentPage = 1;
if (pageStr != null) {
currentPage = Integer.parseInt(pageStr);
}
// 每页条数
int pageSize = 5;
//封装PageBean
PageBean<Order> pb=new PageBean<>();
pb.setCurrentPage(currentPage);
pb.setPageSize(pageSize);
//调用service的分页查询方法,传入pageBean
OrderService service=new OrderServiceImpl();
service.getPageBean(pb);
//将pageBean对象存到request域中
request.setAttribute("pb", pb);
//转发到订单列表页面order/list.jsp
request.getRequestDispatcher("WEB-INF/jsp/order/list.jsp").forward(request, response);
}
1.6在order/list.jsp页面上显示数据,代码略
<body>
<div class="panel admin-panel">
<div class="panel-head">
<strong class="icon-reorder">订单列表</strong> <a href=""
style="float:right; display:none;">添加字段</a>
</div>
<table class="table table-hover text-center" width="100%">
<tr>
<th width="15%">编号</th>
<th width="10%">订单金额</th>
<th width="10%">下单日期</th>
<th width="20%">收货地址</th>
<th width="10%">订单状态</th>
<th>操作</th>
</tr>
<c:forEach var="order" items="${pb.data }">
<tr>
<td>${order.order_id }</td>
<td>${order.order_jine }</td>
<td>${order.order_time }</td>
<td>${order.order_address }</td>
<td><c:choose>
<c:when test="${order.order_zhuangtai eq 0 }">待发货</c:when>
<c:when test="${order.order_zhuangtai eq 1 }">已发货</c:when>
<c:when test="${order.order_zhuangtai eq 2}">已收货</c:when>
<c:otherwise>已完成</c:otherwise>
</c:choose></td>
<td>
<!-- 如果当前订单状态是待发货,就显示“发货”超链接,状态是已收货时,显示"完成"超链接 -->
<c:choose>
<c:when test="${order.order_zhuangtai eq 0}">
<a class="button border-main"
href="${pageContext.request.contextPath}/order.action?method=updateState&orderid=${order.order_id }&state=1"><span
class="icon-edit"></span>发货</a>
</c:when>
<c:when test="${order.order_zhuangtai eq 2}">
<a class="button border-main" href="${pageContext.request.contextPath}/order.action?method=updateState&orderid=${order.order_id }&state=3">
<span
class="icon-edit"></span>完成</a>
</c:when>
</c:choose> <%-- <a class="button border-red"
href="${pageContext.request.contextPath}/jsp/order/detail.jsp"><span
class="icon-trash-o"></span>订单明细</a> --%> <!-- 已完成的订单才显示删除超链接 -->
<a class="button border-red" href="#"><span
class="icon-trash-o"></span>删除</a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="80">
<div class="pagelist">
<!-- 当前页是第1页时,首页,上一页直接显示,
<a class="nocls">首页</a> <a class="nocls">上一页</a>
不是第1页时,点击后跳转页面,onclick指定函数 -->
<c:choose>
<c:when test="${pb.currentPage eq 1}">
<a class="nocls">首页</a>
<a class="nocls">上一页</a>
</c:when>
<c:otherwise>
<a href="javascript:void(0)" onclick="changePageNum(1)">首页</a>
<a href="javascript:void(0)"
onclick="changePageNum(${pb.currentPage-1})">上一页</a>
</c:otherwise>
</c:choose>
<!-- 生成一组页号 -->
<!-- 当前页显示在span里面,其它页点击后跳转页面 -->
<c:forEach var="sn" begin="1" end="${pb.totalPage }">
<c:choose>
<c:when test="${pb.currentPage eq sn}">
<span class="current">${sn }</span>
</c:when>
<c:otherwise>
<a href="javascript:void(0)" onclick="changePageNum(${sn})">${sn }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<!-- <a href="javascript:void(0)" onclick="alert(1);">1</a> <span
class="current">2</span> -->
<!-- 当前页是尾页时,尾页,下一页直接显示,
<a class="nocls">下一页</a> <a class="nocls">尾页</a>
不是尾页时,点击后跳转页面,onclick指定函数 -->
<c:choose>
<c:when test="${pb.currentPage eq pb.totalPage}">
<a class="nocls">下一页</a>
<a class="nocls">尾页</a>
</c:when>
<c:otherwise>
<a href="javascript:void(0)"
onclick="changePageNum(${pb.currentPage+1})">下一页</a>
<a href="javascript:void(0)"
onclick="changePageNum(${pb.totalPage})">尾页</a>
</c:otherwise>
</c:choose>
<!-- <a class="nocls">下一页</a> <a class="nocls">尾页</a> -->
</div>
</td>
</tr>
</table>
</div>
</body>
任务6:在订单页面上动态显示”发货”和”完成”超链接
<!-- 如果当前订单状态是待发货,就显示“发货”超链接,状态是已收货时,显示"完成"超链接 -->
<c:choose>
<c:when test="${order.order_zhuangtai eq 0}">
<a class="button border-main" href="#"><span
class="icon-edit"></span>发货</a>
</c:when>
<c:when test="${order.order_zhuangtai eq 2}">
<a class="button border-main" href="#"><span
class="icon-edit"></span>完成</a>
</c:when>
</c:choose>
任务7:修改订单的状态
- 把”发货”和”完成”超链接的请求路径改过来
<c:when test="${order.order_zhuangtai eq 0}">
<a class="button border-main"
href="${pageContext.request.contextPath}/order.action?method=updateState&orderid=${order.order_id }&state=1"><span
class="icon-edit"></span>发货</a>
</c:when>
<c:when test="${order.order_zhuangtai eq 2}">
<a class="button border-main" href="${pageContext.request.contextPath}/order.action?method=updateState&orderid=${order.order_id }&state=3">
<span
class="icon-edit"></span>完成</a>
</c:when>
2在OrderDao中加入一个方法updateState
@Override
public int updateState(Order order) {
// TODO Auto-generated method stub
String sql="update t_order set order_zhuangtai=? where order_id=?";
int i=JdbcUtil.executeUpdate(sql, order.getOrder_zhuangtai(),order.getOrder_id());
return i;
}
- 3OrderService中加一个修改状态方法updateOrderState,代码略
- 4OrderServlet中加入处理处理状态的方法
//修改订单的状态
public void updateState(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取订单编号
String orderid=request.getParameter("orderid");
//获取订单修改后的状态
int state=Integer.parseInt(request.getParameter("state"));
//封装Order对象
Order order=new Order();
order.setOrder_id(orderid);
order.setOrder_zhuangtai(state);
//调用service的修改订单状态方法,将编号,状态传进去
OrderService service=new OrderServiceImpl();
boolean flag = service.updateOrderState(order);
//跳转到订单列表页面
if(flag){
response.sendRedirect("order.action?method=queryByPage");
}
}
1.后台项目的最后两个功能
任务1:删除订单
- 在订单页面上动态显示”删除”超链接
<!-- 已完成的订单才显示删除超链接 -->
<c:if test="${order.order_zhuangtai eq 3 }">
<a class="button border-red" href="javascript:void(0)" onclick="deleteOrder(‘${order.order_id }’)"><span
class="icon-trash-o"></span>删除</a>
</c:if>
//点击"删除"超链接后,请求servelt去删除订单
function deleteOrder(orderid){
//是否确认删除的提示
var flag= confirm("是否真的要删除此订单");
if(flag){
location.href = "${pageContext.request.contextPath}/order.action?method=deleteOrder&orderid="+orderid;
}
}
2.
- 在OrderDao中加入删除方法
@Override
public int delete(String orderid) {
// TODO Auto-generated method stub
String sql="delete from t_order where order_id=?";
int i=JdbcUtil.executeUpdate(sql,orderid);
return i;
}
- 3在OrderService中加入删除订单的方法
@Override
public boolean deleteOrder(String orderid) {
// TODO Auto-generated method stub
int i = dao.delete(orderid);
return i>0;
}
- 在OrderServelt中加入处理删除订单的方法
// 删除订单
public void deleteOrder(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取订单编号值
String orderid=request.getParameter("orderid");
//调用service的删除订单方法
OrderService service=new OrderServiceImpl();
boolean flag = service.deleteOrder(orderid);
//跳转到订单列表页面
if(flag){
response.sendRedirect("order.action?method=queryByPage");
}
}
5.将子表t_orderitem中的外键order_id的删除策略设置为cascade,表示当删除订单表的记录时,子表中通过外键关联的多条记录会一起删除掉
任务2:修改密码
- 把main/index.jsp上”修改密码”的超链接改过来
<a href="${pageContext.request.contextPath}/admin.action?method=toUpdatePwd"
target="right"><span class="icon-caret-right"></span>修改密码</a
2.创建AdminServlet中加入准备修改密码的方法
//准备修改密码
public void toUpdatePwd(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//跳转到修改密码页面上
request.getRequestDispatcher("WEB-INF/jsp/user/pass.jsp").forward(
request, response);
}
3.在修改密码页面上点击提交按钮时,触发表单的onsubmit事件
<form method="post" class="form-x" id="updteForm" onsubmit="return checkForm()" action="${pageContext.request.contextPath}/admin.action?method=updatePwd">
//给表单加提交事件,该事件在点击"提交"按钮时自动触发的,调用checkForm()函数做表单验证
function checkForm(){
// console.log("提交按钮被点击");
var flag= checkPwd();
/* if(flag){
// return true:允许表单提交 return false:阻止表单提交
return true;
} */
return flag;
};
如果表单里用的是普通按钮,就给普通按钮添加onclick事件,调用函数checkForm()做表单验证
function checkForm(){
var flag= checkPwd();
if(!flag){
return;
}
//提交表单
$(form对象).submit();
}
- 4在AdminDao中加入修改密码方法
@Override
public int updatePwd(Admin admin) {
// TODO Auto-generated method stub
String sql="update t_admin set userpwd=? where userid=?";
int i = JdbcUtil.executeUpdate(sql, admin.getUserpwd(),admin.getUserid());
return i;
}
- 在AdminService中加入修改密码的方法
@Override
public boolean updatePwd(Admin admin) {
// TODO Auto-generated method stub
int i = adminDao.updatePwd(admin);
return i>0;
}
6.
- 在Servlet中加入修改密码的方法
// 修改密码
public void updatePwd(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取新密码
String newpass = request.getParameter("newpass");
// 获取用户id
int userid = Integer.parseInt(request.getParameter("userid"));
// 封装成用户对象
Admin admin = new Admin();
admin.setUserid(userid);
admin.setUserpwd(newpass);
// 调用service的修改密码方法
AdminService service = new AdminServiceImpl();
boolean flag = service.updatePwd(admin);
// 跳转到登录页面上
if (flag) {
// 清空session
HttpSession session = request.getSession();
session.invalidate();
// 跳转到登录页面
// response.sendRedirect(request.getContextPath() + "/login.jsp");
// 使用js做跳转,跳转到iframe所在小窗口的父窗口,要改变父窗口的路径
PrintWriter out = response.getWriter();
out.print("<script>parent.location.href='"
+ request.getContextPath() + "/login.jsp';</script>");
// 关闭流
out.flush();
out.close();
}
}