`
ctrain
  • 浏览: 135508 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Jeecms之查询实现

阅读更多
    现有一需求如下:
    按时间段查询及留言状态(已回复,未回复,已审批)来查询留言。
    当时的想法是这样子的,首先要把查询的条件通过页面传递到后台。于是在后台管理中找看有没有类似的功能,费了半天劲还真给找了一个有条件查询的例子,那就是文章内容的查询。
<@p.text colspan="1" width="45" label="起始时间" name="queryStartDate" id="queryStartDate" readonly="readonly" size="24" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'})" class="Wdate" /> 
<@p.text colspan="1" width="50" label="结束时间" name="queryEndDate" id="queryEndDate" readonly="readonly" size="24" onclick="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="未回复" onclick="submit_date('0_');" /></td> 
<td width="20px" align="left"><@p.button value="已回复" onclick="submit_date('0_true');" />&nbsp;&nbsp;&nbsp;&nbsp; <@p.button value="已审核" onclick="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> 

分享到:
评论
1 楼 di1984HIT 2014-06-23  
写的很好啊。

相关推荐

    jeecms3.0强大的jeecms平台,实现没有编程基础,只要懂得HTML就能轻松制作网站的平台

    10. **性能优化**:Jeecms3.0对服务器端进行了性能优化,包括缓存机制、数据库查询优化等,提升了系统的响应速度和稳定性。 在压缩包文件"jeecms-3.0.0-beta"中,用户可以找到Jeecms3.0的完整安装包,包括所有必要...

    jeecms个人标签文档

    Jeecms的标签系统是其核心功能之一,它允许开发者通过简单的标签语法在JSP页面中嵌入动态内容。这些标签覆盖了内容发布、分类、搜索、评论等多个功能模块,大大简化了开发流程。例如,`&lt;jeecms:content&gt;`标签用于...

    jeecms最全的api

    这些文件将帮助我们了解Jeecms如何与数据库交互,比如数据表的设计、SQL查询的编写以及事务处理等。 在实际使用Jeecms的过程中,掌握API的使用是至关重要的。例如,通过API,开发者可以创建、更新、删除内容,管理...

    jeecms数据库表结构详解

    ### Jeecms数据库表结构详解 #### 一、概述 Jeecms是一款基于Java技术的开源内容管理系统(Content Management System, CMS),广泛应用于企业网站、新闻门户等网站平台建设。其核心优势在于高度可定制化与模块化...

    jeecms3.2.2版本源码包

    10. **性能优化**:Jeecms作为一个高性能的CMS,源码中会包含一些性能优化策略,如缓存机制、数据库查询优化等。 11. **并发与安全**:Jeecms在处理高并发请求时,需要考虑线程安全和数据一致性问题,源码中会有...

    JEECMS 精简第二部分 共2

    JEECMS构建于Java EE平台之上,这意味着它利用了诸如Servlet、JSP、EJB、JMS、JPA等组件。Java EE提供了一个企业级的应用程序框架,能够处理并发、事务、安全性以及数据库集成等复杂问题,使得开发者可以更专注于...

    Jeecms学习笔记

    《Jeecms学习笔记》是针对Java企业级内容管理系统Jeecms的学习资料,主要以guestbook功能为例,探讨了如何实现数据的写入操作。在这个过程中,开发者将深入理解Jeecms的架构、核心组件以及如何进行代码的修改与优化...

    jeecms 源码包

    2. 性能优化:分析系统瓶颈,优化数据库查询、减少内存消耗等。 3. 界面定制:设计新的模板,提升用户体验。 4. 集成其他服务:例如与第三方支付、社交媒体等进行集成。 五、学习资源与社区 1. 官方文档:Jeecms...

    jeecms 3.0

    在协作和权限管理上,Jeecms 3.0实现了精细的权限控制,可以为不同的角色分配不同的操作权限。这样,团队成员可以根据职责分工,安全地进行内容编辑、审核、发布等工作,提高了团队协作的效率。 最后,Jeecms 3.0的...

    jeecms oracle 版本

    此外,Oracle的RAC(Real Application Clusters)集群技术还能实现高可用性,确保即使在硬件故障情况下,Jeecms也能持续运行。 Jeecms针对Oracle数据库进行了优化,包括SQL语句的调整和存储过程的使用,以充分利用...

    jeecms 终极版源码

    Jeecms是一款基于Java技术构建的内容管理系统,被誉为“终极版”源码,意味着它具有全面的功能和高度可...在实际操作中,可以逐步分析每个部分的代码,结合在线文档和社区资源,逐步理解和掌握Jeecms的功能和实现方式。

    jeecms v9.3 正式版 安装包.zip

    对于技术达人来说,jeecms不仅提供全部源码,而且在研发之初即全面的考虑了二次开发的高效性和代码的高移植性,是一款非常容易上手和二次开发的产品。  JEECMSv8版本是一款集PC互联网、移动互联网和微信网站于一体...

    jeecms开发文档

    Jeecms的CMS标签是其强大的特性之一,它们简化了页面元素的渲染,如文章列表、分类导航、评论等。CMS标签文档会列出所有内置的标签及其用法,如`{cms:article}`用于显示单篇文章,`{cms:category}`用于展示分类列表...

    JEECMS 3.04 模版标签字符 GBK UTF8对照

    在JEECMS中,模版标签是用于控制内容展示和功能实现的关键元素。它们类似于HTML标签,但具有更强大的逻辑和动态内容处理能力。例如,`&lt;cms:article&gt;`标签可以用来显示文章内容,`&lt;cms:category&gt;`可以用于遍历和显示...

    jeecms v9.3 正式版 源码包.zip

    2、内容复用待审核查询报错(开源版) 3、根栏目添加内容报错 4、后台页面样式调整 5、后台编辑器分页问题 7、数据统计今日数据没有问题 8、公众号推送菜单和群发微信菜单获取微信端消息返回处理 9、OSS...

    jeecms系统源码

    Jeecms系统源码是基于SSH(Struts2、Spring、Hibernate)架构开发的一款内容管理系统。SSH是一个流行的企业级Java应用框架,它整合了这三个强大的开源框架,为开发者提供了便捷的开发工具和高效的开发模式。 Struts...

    jeecms文档说明

    这份文档可能详细阐述了如何设计和操作涉及多个表的业务场景,如一对多、多对多关系的处理,以及如何通过关联查询实现数据的联动。了解多表控制对于开发复杂的业务逻辑和数据报表至关重要。 综上所述,Jeecms的这些...

    jeecms相关的所有文档(包括二次开发文档)

    Jeecms的强大之处在于其可扩展性和二次开发能力。二次开发文档可能包含以下部分: 1. **API参考**:详述了Jeecms提供的接口和类库,供开发者调用以实现特定功能。 2. **模板引擎**:Jeecms通常使用自定义的模板引擎...

    jeecms-2012.rar

    在Jeecms-2012中,Java主要负责处理业务逻辑、数据访问以及服务器端的功能实现。Java的面向对象特性使得代码结构清晰,易于维护,同时丰富的类库如Spring、Hibernate等,提供了强大的支持。 SQL(Structured Query ...

Global site tag (gtag.js) - Google Analytics