【详解】30min内禁止议价

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函数,得到毫秒数来比较差值,从而进行时间差的判断
getTime函数得到的毫秒数是,从1970年开始到当前,过了多少毫秒。


三、将比较结果传递到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


 
  四、在jsp中进行处理 
  

这里自然是用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。


这里一次着重介绍一下标签还有CollectionTO对象。

标签】

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中的显示上费点心思就行了。


至此修改完成!


你可能感兴趣的:(14,30min隐藏取消议价)