【详解】30min内禁止议价

原创 2015年11月17日 16:06:35

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


至此修改完成!


详解CAP理论

理解分布式计算领域的公认定理CAP:Consistency, Availability, Partition-tolerance
  • ybdesire
  • ybdesire
  • 2017年12月03日 22:03
  • 196

python_基础讲解_30min

一 python大致介绍 python是一种脚本语言,简而言之就是不需要编译链接,而直接解释运行。python主要运用了库的概念,丰富的库方便开发者的进行工程开发,正因此其广泛运用。而且其还可以对接...
  • kongshanwuyu
  • kongshanwuyu
  • 2018年01月04日 12:11
  • 10

禁止未加入域电脑访问域资源|活动目录域外的用户不能访问域内怎么设置

 禁止未加入域电脑访问域资源|活动目录域外的用户不能访问域内怎么设置?windows2003域环境下,如何设置让未加入域的电脑不能访问域内资源(该用户拥有域成员权限)???具体的情况是这样的,公司局域...
  • lzlutao
  • lzlutao
  • 2008年10月23日 16:50
  • 4512

禁止iframe内的页面跳转

代码: sandbox 属性 "" 应用以下所有的限制。 allow-same-origin 允许 iframe 内容被视为与包含文档有相同的来源。 allo...
  • xtgefzhangqing
  • xtgefzhangqing
  • 2017年03月22日 19:33
  • 2041

如何能做到禁止域内计算机的本地登陆?

问题:1。怎么可以禁止登陆本地计算机?有没有方法可以使登陆框中的登陆到按钮无效?      2。怎么样对域内所有机器的本地管理员统一设定管理员密码?问题1 : 禁止登陆本地计算机?有没有方法可以使登陆...
  • wip
  • wip
  • 2007年02月27日 23:32
  • 2915

屏蔽iframe中的超链接

在道州网daozhou.net网站设计时,碰到了一个问题,如何屏蔽iframe中的超链接?经过摸索,屏蔽iframe中的超链接找到了一个办法,呵呵 步骤一:新建一个文档,命名为A.html,代码如下 ...
  • danns888
  • danns888
  • 2011年03月16日 13:57
  • 2109

JavaWeb网页聊天室(WebSocket即时通讯)

概要: WebSocket是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,这里就将使用WebSocket来开发网页聊天室,前端框架会使用AmazeUI,后台使用Java,编辑器使用UMEd...
  • qq_17497931
  • qq_17497931
  • 2017年09月11日 11:17
  • 455

其他程序中禁止或者自动下拉状态栏

4.3android 需求一: 需求二:
  • yunwuhuxin
  • yunwuhuxin
  • 2014年04月24日 10:08
  • 1611

ionic 之cordova 极光推送jpush和百度定位插件结合使用之定位失效问题解决办法

之前项目已经装了cordova的百度定位插件,曾经出现过定位失败问题,那是由于项目上传svn再checkout下来的话会丢失.so文件。只需把.so文件补齐就OK了。但是最近由于项目需要推送消息功能,...
  • m0_38050352
  • m0_38050352
  • 2018年01月11日 13:32
  • 23

Java中的注解/注释详解(Override/Deprecated/SuppressWarning)

Java中的注解/注释详解 Java中的注释主要有以下三种:Override/Deprecated/SuppressWarning,接下来我们主要讨论这3个注解的内容。 一,什么是注释(注解) ...
  • reggergdsg
  • reggergdsg
  • 2016年08月07日 16:46
  • 3812
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【详解】30min内禁止议价
举报原因:
原因补充:

(最多只允许输入30个字)