关闭

【详解】30min内禁止议价

164人阅读 评论(0) 收藏 举报
分类:

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<Long, Boolean> isHideMap=new HashMap<Long,Boolean>();

//获取议价订单创建时间
                createddate=bargainTO.getCreatedDate();
                if(currentdate.getTime()-createddate.getTime()>=1800000){ //判断时间差是否大于30min
                	isHideCancelBargainBtn=true;
                }else{
                	isHideCancelBargainBtn=false;
                }
                isHideMap.put(sellingGoodsTO.getId(),isHideCancelBargainBtn);
<p>model.put("isHideMap", isHideMap);
</p>return new ModelAndView("/jsp/member/buyer_order_bargain.jsp", "model", model);

【Map的封装】

这里注意一个细节的东西,

Map<Long, Boolean> isHideMap=new HashMap<Long,Boolean>();
这里新的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标签

<c:if test="${model.isHideMap[bargainTO.sellingGoodsId] eq true}">                                             
<a href="${basePath2}/bcs.jx?act=del&id=${bargainTO.id}&sgid=${bargainTO.sellingGoodsId}" class="home-btn">取消议价</a>
</c:if>

逻辑是 超出时限以后,才能够取消议价,出现取消议价的按钮

这里的

<c:if test="${model.isHideMap[bargainTO.sellingGoodsId] eq true}">
是关键,其中取出id的方式值得注意。bargainTO来自

<c:forEach var="bargainTO" items="${model.bargainCtn.list}" varStatus="orderIndex">
而这个bargainCtn,在Controller中的代码如下:

CollectionTO<BargainTO> bargainCtn=miscService.listBargainByCriteriaTO(criteriaTO);
model.put("bargainCtn", bargainCtn);
bargainCtn并不是一个列表,这里明确说了,是个CollectionTO对象。

bargainCtn中的list属性,bargainCtn.list才是装满了BargainTO的列表。

所以,我们从bargainCtn.list得到的就是bargainTO。


这里一次着重介绍一下<c:forEach>标签还有CollectionTO对象。

【<c:forEach>标签】

<c:forEach var="bargainTO" items="${model.bargainCtn.list}" varStatus="orderIndex">
var是要遍历的列表中的其中一条,items是要遍历的列表集合,varStatus是当前遍历状态,相当于Java中for循环的i,表示遍历的当前状态,这里的i起名为orderIndex,也可以另外起别的名字(这个参数的使用可以用来实现列的变色)

【CollectionTO对象】

这里贴出它的定义代码

public class CollectionTO<T> implements Serializable {

    private static final long serialVersionUID=1L;

    private int pageSize;

    private int pageCnt;

    private int recordCnt;

    private List<T> list=new ArrayList<T>();

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list=list;
    }

    public CollectionTO() {
        super();
    }

    public CollectionTO(List<T> 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函数中执行后面的操作。

<c:if test="${model.bargainCtn.pageCnt gt 1}">
  <a href="javaScript:moreOrder(2,0);" id="moreOrder" class="load-more">加载更多</a>
</c:if>
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<list.length;i++){
        bargainTO = list[i];
        sellingGoodsTO = data.sellingGoodsTOMap[bargainTO.sellingGoodsId];
        isHideTO=data.isHideMap[bargainTO.sellingGoodsId];
    ........
    if(isHideTO==true){
        html+='<a href="${basePath2}/bcs.jx?act=del&id='+bargainTO.id+'&sgid='+bargainTO.sellingGoodsId+'" class="home-btn">取消议价</a>';
    }
点击 加载更多 之后,js函数从Controller中拿到JSON对象。进行处理,然后在appendOrder这个js函数中,

通过大段大段的html+=''打印出HTML,来进行显示。

Controller中的修改方法与未分页无异,只需要在jsp中的显示上费点心思就行了。


至此修改完成!


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:77714次
    • 积分:2419
    • 等级:
    • 排名:第15917名
    • 原创:171篇
    • 转载:2篇
    • 译文:0篇
    • 评论:8条
    最新评论