现有一需求如下:
    按时间段查询及留言状态(已回复,未回复,已审批)来查询留言。
    当时的想法是这样子的,首先要把查询的条件通过页面传递到后台。于是在后台管理中找看有没有类似的功能,费了半天劲还真给找了一个有条件查询的例子,那就是文章内容的查询。

<@p.text colspan="1" width="45" label="起始时间" name="queryStartDate" id="queryStartDate" readonly="readonly" size="24" οnclick="WdatePicker({dateFmt:'yyyy-MM-dd'})" class="Wdate" />
<@p.text colspan="1" width="50" label="结束时间" name="queryEndDate" id="queryEndDate" readonly="readonly" size="24" οnclick="WdatePicker({dateFmt:'yyyy-MM-dd'})" class="Wdate" />

接手该项目时有留言状态代码,如下:

<a href="/web/admin/auxiliary/msg/Com_list.do?group_state=0_" >[未回复]</a>
<a href="/web/admin/auxiliary/msg/Com_list.do?group_state=0_true" >[已回复]</a>
<a href="/web/admin/auxiliary/msg/Com_list.do?group_state=1_true" >[已审核]</a>

关于查询条件是怎么传递到后台,一开始是用request.getParameter();数据顺利的传递到后台。在action中将查询条件放入放入到获取数据的页面中也能够查出数据。为了美观考虑所以我建议将超链接改为了button,代码如下:

<td width="20px" align="left"><@p.button value="未回复" οnclick="submit_date('0_');" /></td>
<td width="20px" align="left"><@p.button value="已回复" οnclick="submit_date('0_true');" />&nbsp;&nbsp;&nbsp;&nbsp; <@p.button value="已审核" οnclick="submit_date('1_true');" /></td>
function submit_date(group_state){
var form = document.getElementById("submitForm");
alert("form.aciton:"+form.action);
form.action = form.action+"?group_state="+group_state;
form.method = "post"; form.submit();
}

当时以为能够查出数据应该就没什么问题了。再就是当时别的需求比较急,于是将此放在了一旁。等别的任务完成后,准备将此功能修改好一起测试。刚一测就发现了问题:点击下一页时直接找不着页面。 于是赶紧在action中将查询条件参数打印到控制台。发现分页的时候页面参数根本没有传递到后台去。
    查看了前台的代码及@p.table源码后才发现查询条件是一个form,分页是另外封装好的一个form。那么点击分页的时候当然不能将查询的form中的参数一并传过去。记得当时还在网上搜怎么样一次将两个Form中的数据提交到后台,结果找了半天也没查到,结果郁闷了好半天。
自己不能搞定当然不能坐以待毙,还得请高人指点。
    先用httpwatch观察文章查询时的数据传递情况,结果发现条件查询的数据全部传递过去的。接着查看文章列表的源码发现了下面的情况:

<input type="hidden" name="id"/>
<input type="hidden" name="pageNo" value="2"/>
<input type="hidden" name="chnlId" value="76"/>
<input type="hidden" name="queryInputAdminId" value=""/>
<input type="hidden" name="queryTitle" value="公积金"/>
<input type="hidden" name="queryTopLevel" value="0"/>
<input type="hidden" name="queryOrder" value="0"/>
<input type="hidden" name="queryContentCtgId" value="1"/>
<input type="hidden" name="queryStatus" value="3"/>

说明数据是通过隐藏域的方式提交过来的,我进行过一些测试,发现查询条件不同时隐藏域的个数是不一样的,那么说明是通过动态的方式产生隐藏域的。 由于分页是有@p.table标签封装的,于是查看了半天的源码(table.ftl)文件。
    看了很长时间终于发现了下面的代码(如果freemarker不是很精通的话头会变大的)隐藏了细节。

<input type="hidden" name="${keyId}"/>
<@p.hidden name="pageNo" />
<#list keepParams as keep> <@p.hidden name="${keep}" /> </#list>
<#list Parameters?keys as pkey>
<#if pkey!=keyId && pkey!=batchId && !keepParams?seq_contains(pkey) && pkey?starts_with('query')> <@p.hidden name="${pkey}" />
</#if>
</#list>

究竟是哪一个起作用,到底该如何做。这个也是看了很久才看明白。其实动态将表单中的参数生成到分页form中的就是下面的语句:

<#list Parameters?keys as pkey>
<#if pkey!=keyId && pkey!=batchId && !keepParams?seq_contains(pkey) && pkey?starts_with('query')>
<@p.hidden name="${pkey}" />
</#if>
</#list>

其中最关键的词语就是最后的条件starts_with('query'),于是赶紧查看文章列表的参数是不是query开头。 于是我也将我的留言的查询参数的name也全部改为了已小写query开头,并将三个按钮该为了一个select下拉框外加一个查询俺就。后台的参数通过setter(),getter()方法,果然数据就能通过分页传递到后台去了。暗自庆幸了一会发现问题又来了。分页是没有什么问题了,可进行不同状态留言的时候却发现后台立马报错。查看后台的打印参数才明白,原来从页面传递过来的参数分别传递了2次,也就是后台获得数据是两次查询的数据拼接的,自然就报错了。

搞了半天终于明白是@form标签中将已query开头的字段也封装成了隐藏域,代码如下:

<#if query=="true">
<@p.hidden name="pageNo" /><#rt/>
<#list Parameters?keys as pkey> <#if pkey?starts_with('query')> <@p.hidden name="${pkey}" />
<#t/> </#if>
</#list>
</#if>

终于搞明白缘由,于是赶紧将条件查询的freemarker标签定义的@p.form改为普通的form,但是报了个更加离谱的错误freemarker错误。没得办法,只得将条件先删掉调试,发现删掉后显示正常。确定产生异常的原因因该是时间组件报的错,于是将@p.text时间标签改造为普通的时间标签,结果发现数据显示正常了。 参数的初始化。(注:${}一定要放在""里,要不然会产生不可预料的结果,教训啊,教训!)

function init(){
var tempDate = new Date();
var currDate = ChangeDateToString(tempDate);
var startDate = document.getElementById("queryStartDate");
var endDate =document.getElementById("queryEndDate");
<#if queryStartDate??> startDate.value = "${queryStartDate}"; endDate.value = "${queryEndDate}";
<#else> startDate.value =currDate;
endDate.value = currDate;
</#if> <#if queryResponseStatus??>
document.getElementById("queryResponseStatus").value="${queryResponseStatus}";
<#else> document.getElementById("queryResponseStatus").option[0].selected = true; </#if> }
function ChangeDateToString(DateIn){
var Year = 0;
var Month = 0;
var Day = 0;
var CurrentDate = ""; //初始化时间
Year = DateIn.getYear();
Month = DateIn.getMonth()+1;
Day = DateIn.getDate();
CurrentDate = Year + "-";
if (Month >= 10 ){
CurrentDate = CurrentDate + Month + "-";
}
else{ CurrentDate = CurrentDate + "0" + Month + "-";
}
if (Day >= 10 ){
CurrentDate = CurrentDate + Day ;
} else{
CurrentDate = CurrentDate + "0" + Day ;
}
return CurrentDate; }
</script>

---------------------
作者:ctrain
来源:CSDN
原文:https://blog.csdn.net/Ctrain/article/details/47145295
版权声明:本文为博主原创文章,转载请附上博文链接!

Jeecms之查询实现的更多相关文章

  1. JEECMS v8 发布,java 开源 CMS 系统

    JEECMSv8 是国内java开源CMS行业知名度最高.用户量最大的站群管理系统,支持栏目模型.内容模型交叉自定义.以及具备支付和财务结算的内容电商为一体:  对于不懂技术的用户来说,只要通过后台的 ...

  2. 如何在linux中搭建JEECMS系统

    本人正在进行jeecms二次开发,但因win7系统中的Tomcat无法使用,就想起在linux下安装,但去jeecms的官方网站,没有给出在linux下安装的方法,确实苦恼,经过一天的研究,终于大功告 ...

  3. 关于在jeecms中css,图片,html,模板是如何组装成——part1

    先从HTML入手:index.html <!DOCTYPE HTML> <html> <meta name="viewport" content=&q ...

  4. jeecms学习笔记

    jeecms学习笔记 内容管理系统 1.栏目列表标签 作用:获取栏目的列表 [@cms_channel_list] [#list tag_list as b] <a href="${b ...

  5. JEECMS站群管理系统-- 自定义标签及使用自己创建的表的实现过程

    下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_mycontent的表,其中有id,title,content三个字段 其次,创建了一个实体类 public cla ...

  6. JEECMS开发问题汇总

    1 添加Controller 将controller文件放在com.jeecms.cms.action.front包中, 图1.1 然后在jeecms-servlet-front-action.xml ...

  7. jeecms v9开发资料

    开发文档 . 系统架构概述 本系统核心架构为 FreeMarker+hibernate+Spirng 的 mvc 分层架构. 1.1 分层架构模型 img 1.2 数据流转模型 (前端) img . ...

  8. JEECMS 自定义标签

    CMS 是”Content Management System” 的缩写,意为” 内容管理系统”. 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场.对于内容管理,业界还没有一个统 ...

  9. JEECMS自定义标签

    查看JEECMS的源代码发现开发者版本还没有类似现成的统计标签,一种解决的办法是使用现有的JEECMS标签,像这样Struts( [@cms_content_list channel=id]${tag ...

随机推荐

  1. (转)JNI入门教程之HelloWorld篇 .

    转: http://blog.csdn.net/mingjava/article/details/180946 本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第 ...

  2. http://www.jianshu.com/简书。

    http://www.jianshu.com/ 简书,类似于博客园.也是一个交流平台.

  3. Big Number HDU - 1212

    As we know, Big Number is always troublesome. But it's really important in our ACM. And today, your ...

  4. 第二十一篇:spring怎么做缓存

     项目背景:你可能遇情景:1.一个做统计的页面,每次刷新需要调接口做查询 ,是联表查询,查出来的数据还需要做一些计算或者加工,不算页面上的图表插件,刷新一次,延迟个几秒钟才出的来2. 一个统计接口如此 ...

  5. 第二十篇:记下第一个mysql触发器

    项目背景:给一个服务限制访问次数,当用户访问这个服务的次数达到这个值的时候,关闭他的访问权限首先访问信息存在一张表中,记录用户的ip:visitor_ip,服务的id:service_id,访问次数: ...

  6. Spring Boot 实现定时任务的 4 种方式

    作者:Wan QingHua wanqhblog.top/2018/02/01/SpringBootTaskSchedule/ 定时任务实现的几种方式: Timer:这是java自带的java.uti ...

  7. <数据分析>初级入门

    1.何为数据分析? 数据分析是指用适当的统计方法对收集来的大量数据进行分析,将它们加以汇总和理解消化,以求最大化地开发数据的功能,发挥数据的作用. 直接的理解:提炼杂乱无章的数据背后的信息,总结出研究 ...

  8. RunLoop运行循环机制

    http://www.jianshu.com/p/0be6be50e461 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存空间内,比 ...

  9. loj2290 随机二分图

    题意:有一个左右各n个点的二分图,对于连边组有一些性质:1号组的一条边,有50%的概率出现.2号组两条边,有50%的概率同时出现,50%的概率同时不出现.3号组两条边,有50%的概率出现第一条,有50 ...

  10. 三剑客之一------>awk

    awk :  一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...