当前位置 博文首页 > 高远的博客:易生活(三)-web---商品排行和分页综合处理、sql占位
控制层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中这样处理:
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 ?,?";
cs