30分钟内不显示 取消议价 的按钮。
这次的按钮隐藏与出现,由时间来进行控制。超过了创建订单的时间30分钟,才会出现取消议价的按钮,才可以取消议价。
【大致思想】
实现此功能的关键是,将当前时间与数据库中的创建时间进行比较,若超过时限,返回一个true,若没超过,返回一个false。
Controller将这个true或者false的值,传递到JSP,在JSP中用c:if标签或者js函数检测true或者false,控制按钮的出现与消失。
一、拿到当前时间
这里的当前时间必须在Controller中拿到,因为java代码中拿当前时间,是通过new一个Date对象来实现的。这个时间,是服务器的时间,准确。
不能在jsp中用now()拿当前时间,因为这样拿到的时间是开发者电脑本身的系统时间。这个时间一则不准确,二则可随意修改。
所以,我们使用如下代码
//获取当前时间
Date currentdate=new Date();
比较方法如下:
//获取议价订单创建时间
createddate=bargainTO.getCreatedDate();
if(currentdate.getTime()-createddate.getTime()>=1800000){ //判断时间差是否大于30min
isHideCancelBargainBtn=true;
}else{
isHideCancelBargainBtn=false;
}
这里通过Date类型的getTime函数,得到毫秒数来比较差值,从而进行时间差的判断
三、将比较结果传递到jsp
该例比较特别,因为这一堆的商品订单,一条一条各自有自己的ID和true、false值。若传递肯定要传递一堆。
所以将这些ID与Boolean值的键值对放入一个map中。因为还有别的map也要传递,所以这些map又被装入另外一个更大的名为model的map中。
如下:
Map isHideMap=new HashMap();
//获取议价订单创建时间
createddate=bargainTO.getCreatedDate();
if(currentdate.getTime()-createddate.getTime()>=1800000){ //判断时间差是否大于30min
isHideCancelBargainBtn=true;
}else{
isHideCancelBargainBtn=false;
}
isHideMap.put(sellingGoodsTO.getId(),isHideCancelBargainBtn);
model.put("isHideMap", isHideMap);
return new ModelAndView("/jsp/member/buyer_order_bargain.jsp", "model", model);
【Map的封装】
这里注意一个细节的东西,
Map isHideMap=new HashMap();
这里新的HashMap,isHideMap的定义,封装的类型是long 和boolean
封装的时候写作Long和Boolean,首字母大写。
我们可以引申到另外一个知识点,封装类
【封装类】
Java语言为八大基本数据类型提供了包装类。
Java有两种不同的类型:引用类型和原始类型。比如:int是java的原始数据类型,Integer是java为int提供的封装类。
Java为每个原始类型提供了封装类。
【为什么要使用这样的封装类呢?】
原因有二:
一者,Java语言是面向对象的,int只能够算作一个int类型的数据,不能算作一个对象,因为一个类才能说是一个对象,
我们为int型配备了Integer的封装类,就可以把int型的数据当成一个类来看待。
Java也为封装类写了很多方法,比如Integer就有parseInt()等方法来专门处理int型相关的数据。
二者,Java中绝大部分方法和类都市用来处理类类型对象的,如ArrayList集合类就只能以类作为他的存储对象。
这时,如果想把一个int型的数据存入list就是不可能的,必须把它包装成类,也就是Integer才能被List所接受。
这也就是我们在新建HashMap时,声明Long和Boolean的原因。
附对应图表:
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
这里自然是用c:if标签
取消议价
逻辑是 超出时限以后,才能够取消议价,出现取消议价的按钮
这里的
是关键,其中取出id的方式值得注意。bargainTO来自
而这个bargainCtn,在Controller中的代码如下:
CollectionTO bargainCtn=miscService.listBargainByCriteriaTO(criteriaTO);
model.put("bargainCtn", bargainCtn);
bargainCtn并不是一个列表,这里明确说了,是个CollectionTO对象。
bargainCtn中的list属性,bargainCtn.list才是装满了BargainTO的列表。
所以,我们从bargainCtn.list得到的就是bargainTO。
这里一次着重介绍一下
【
var是要遍历的列表中的其中一条,items是要遍历的列表集合,varStatus是当前遍历状态,相当于Java中for循环的i,表示遍历的当前状态,这里的i起名为orderIndex,也可以另外起别的名字(这个参数的使用可以用来实现列的变色)
【CollectionTO对象】
这里贴出它的定义代码
public class CollectionTO implements Serializable {
private static final long serialVersionUID=1L;
private int pageSize;
private int pageCnt;
private int recordCnt;
private List list=new ArrayList();
public List getList() {
return list;
}
public void setList(List list) {
this.list=list;
}
public CollectionTO() {
super();
}
public CollectionTO(List list, int recordCnt, int pageSize) {
super();
this.pageSize=pageSize;
if(pageSize >= 0) {
pageCnt=(int)Math.ceil((double)recordCnt / (double)pageSize);
}
this.recordCnt=recordCnt;
this.list=list;
}
可以看到,CollectionTO对象是包含了list还有别的诸如 recordCnt、pageSize参数的一个对象。
CollectionTO对象只是起到了封装的作用,用起来方便而已,如方便传递。
回忆一下最开始的留言板项目的分页,
model.put("pageNo", pageNo);
model.put("totalPages", totalPages);
这些用来分页的信息是分别传的,比较麻烦。
五、处理分页
本例中,分页展现议价订单的代码与直接显示是不同的。
因为如果分页了,要点击加载更多,会跳到js函数中执行后面的操作。
加载更多
function moreOrder(pageNo, isHistory){
var url='${basePath}nm/member/moreBuyerBargainOrder.html';
$.getJSON(url,{
pageNo : pageNo,
buyerId:'${model.memberTO.id}',
isHistory: isHistory,
stage:'${model.stage}'
},function(data){
appendOrder(data);
});
}
function appendOrder(data){
html = "";
list = data.bargainCtn.list;
for(var i=0 ;i取消议价';
}
点击 加载更多 之后,js函数从Controller中拿到JSON对象。进行处理,然后在appendOrder这个js函数中,
通过大段大段的html+=''打印出HTML,来进行显示。
Controller中的修改方法与未分页无异,只需要在jsp中的显示上费点心思就行了。
至此修改完成!