易生活(三)-web—商品排行和分页综合处理、sql占位符异常处理
目录
- 任务
- 技术难点
- 处理
- 该部分遇见的疑难杂症(mysql占位符的问题的处理)
任务
- 该部分主要完成根据用户(管理员、商家)点击不同的按钮进行相应的排序并且包括分页显示商品信息。
- 对于该部分有以下排序:销量、库存、现价、原价按照由高到低和由低到高排序排序;默认根据商家名字进行排序然后分页显示。
- 特别注意,排序和分页是同步进行的,换句话说进行排序的时候同时要完成分页处理,用户点击某一项排序后再翻页不会改变现有排序方式。
技术难点
- 难点一:对于这么多条件的排序任务,如何处理?每一个都写一个sql执行语句,每一个都写一个servlet?如何更好的扩展?
- 难点二:如何和原有的商品排行进行结合共有一套代码?因为之前的默认商品排行很明显和这里的排行筛选处理有很大的相似度,只是进行了排序处理。
- 难点三:如何保证用户翻页、删除某项、添加商品之后仍能按照现有的排序方式进行排序而不是按照原有的排序方式。
处理
控制层GoodsServlet的处理。
我们在该部分向显示层跳转之前设置req.getSession().setAttribute(“rank”, rank)。如果为空,就是默认排序;如果用户点击了其它排序方式,就替换掉原有的排序方式。在用户提交排序信息的时候传过来一个rank值,这个值我们存储到上述的session之中。根据该值判断以何种方式排序。
if (type.equals("7")) { /* * 这里具体排行根据rank字段:1:销量由低到高;2:销量由高到低;3:库存由低到高;4:库存由高到低; * 5:现价由低到高;6:现价由高到低;7:原价由低到高;8:原价由高到低。默认:按照商家排名 */ String rank = req.getParameter("rank"); if (rank == null) { rank = ""; } System.out.println(TAG + "rank--->" + rank); // 第一步 String parameter = req.getParameter("page");// 获取的页码 int page = 1;// 默认第一页 if (parameter == null) { } else { page = Integer.parseInt(parameter);// 获取的页码 } Pager<Goods> goodsPager = goodsService.getGoodsPagerByRank(page, rank); /* * 测试数据 */ System.out.println(TAG + "页码信息:" + goodsPager); List<Goods> goodsList = goodsPager.getObjects(); for (Goods goods2 : goodsList) { System.out.println(TAG + "获取到的商品list:" + goods2); } req.getSession().setAttribute("rank", rank); req.setAttribute("type", type); req.setAttribute("goodsPager", goodsPager); req.getRequestDispatcher("web/admin/ShowGoodsList.jsp").forward( req, resp); }
显示层ShowGoodsList.jsp的处理。
排行的处理
- 我们在用户点击某一个排序方式,如“销量由低到高排序”的点击事件给一个js方法:οnclick=”myRank(‘7’,’1’)”,第一个参数不用管,主要是为了判断对于GoodsServlet何种操作;第二个方法的值就是rank的值。
js中这样处理:
function myRank(mtype, mrank) { var type = mtype; var rank = mrank; self.location = 'goodsservlet?type=' + type+'&rank='+rank; }
分页的处理
页码按钮的处理,特别注意rank的值的设置,不然控制层不知道要进行何种排序。
<a href="goodsservlet?type=${type}&page=${goodsPager.nowPager-1 }&rank=${rank}"</a>
删除的处理
删除按钮,特别注意 οnclick=”prepareDel(${goods.id })”
<span class="btn btn-danger" data-toggle="modal" onclick="prepareDel(${goods.id })" data-target=".bs-example-modal-sm"><c:set var="myid" value="${goods.id }" />删除</span>
删除提示框的处理,特别注意οnclick=”processDel()”
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <!-- onclick="javascript:window.location.href='goodsservlet?type=6&id=${myid}';" --> <a class="btn btn-danger" onclick="processDel()">删除</a>
js的处理,主要是为了获取goods.id进行指定商品删除
// 以下两个函数处理删除问题
var myid;
function prepareDel(id){
myid=id;
}
function processDel(){
self.location =”goodsservlet?type=6&id=”+myid;}
dao层GoodsDao的处理
/* * 这里具体排行根据rank字段:1:销量由低到高;2:销量由高到低;3:库存由低到高;4:库存由高到低; * 5:现价由低到高;6:现价由高到低;7:原价由低到高;8:原价由高到低。 */ // select * from goods order by name asc limit 0,1; @Override public List<Goods> getGoodsListByRank(int page, String rank) { String placeHolder = ""; if (rank.equals("1")) { placeHolder = "sale asc"; } else if (rank.equals("2")) { placeHolder = "sale desc"; } else if (rank.equals("3")) { placeHolder = "stock asc"; } else if (rank.equals("4")) { placeHolder = "stock desc"; } else if (rank.equals("5")) { placeHolder = "price asc"; } else if (rank.equals("6")) { placeHolder = "price desc"; } else if (rank.equals("7")) { placeHolder = "oldprice asc"; } else if (rank.equals("8")) { placeHolder = "oldprice desc"; } else { placeHolder = "name asc"; } /* * 特别注意,placeHolder不能使用占位符,原因:怀疑占位符之间如果没有“,”,就不能连着使用占位符,可以使用传统的拼接方式 */ String sql = "select * from goods order by " + placeHolder + " limit ?,?"; QueryRunner queryRunner = new QueryRunner(C3p0Utils.getDataSource()); try { List<Goods> goodsList = queryRunner.query(sql, new BeanListHandler<Goods>(Goods.class), PageUtils.getParam1(page), ParamUtils.PERPAGE); // 返回之前,我们获取商家名字 for (Goods goods : goodsList) { String name = getBusinessNameById(goods.getBusinessid()); goods.setUsername(name); } return goodsList; } catch (SQLException e) { e.printStackTrace(); } return null; }
该部分遇见的疑难杂症
主要就是sql占位符异常问题。问题是这样的,当我使用下面这种方式处理排序问题的时候,无论怎么设置第一个“?”总是按照默认顺序排序,已经测试该值没有问题。不知道什么原因导致的,并且把该语句拿出来在mysql命令行执行是没有问题的。查找很多资料也没有结果。后来常识用最最原始的拼接字符串的方式进行处理结果就可以了,具体原因到现在不祥,猜测可能因为第一个问号和和后面没有“,”分割,因为我们之前的操作全部都是有“,”分割的,只是猜测。解决如下面代码
//执行错误 String sql = "select * from goods order by ? limit ?,?"; /* * 特别注意,placeHolder不能使用占位符,原因:怀疑占位符之间如果没有“,”,就不能连着使用占位符,可以使用传统的拼接方式 */ String sql = "select * from goods order by " + placeHolder + " limit ?,?";