查看JEECMS的源代码发现开发者版本还没有类似现成的统计标签,一种解决的办法是使用现有的JEECMS标签,像这样Struts( [@cms_content_list channel=id]${tag_list?size}[/@cms_content_list] ) ,但是这样的做法非常地低效,原因是[@cms_content_list]标签会把所有当前栏目的文章内容对象查询出来,做全表查询!
没办法啊!!!为了网站访问效率,只好自己写一个统计标签吧。那下面就以[@cms_channel_statistic]为例说下如何在JEECMS加入自定义标签。

第一步:编写装载统计信息的Entity。

/**
* 频道统计实体类
* @author www.javake.net
*/
public class ChannelStatistics {
/**
* 文章总数
*/
private long contentAllCount;
/**
* 待审核文章总数
*/
private long contentCheckingCount;
/**
* 评论总数
*/
private long commentCount;
/**
* 阅读总数
*/
private long viewCount;
public long getContentAllCount() {
return contentAllCount;
}
public void setContentAllCount(long contentAllCount) {
this.contentAllCount = contentAllCount;
}
public long getContentCheckingCount() {
return contentCheckingCount;
}
public void setContentCheckingCount(long contentCheckingCount) {
this.contentCheckingCount = contentCheckingCount;
}
public long getCommentCount() {
return commentCount;
}
public void setCommentCount(long commentCount) {
this.commentCount = commentCount;
}
public long getViewCount() {
return viewCount;
}
public void setViewCount(long viewCount) {
this.viewCount = viewCount;
}
}
         第二步:编写栏目信息统计的Dao接口。暂时只实现文章总数统计,待审核文章统计,评论总数。

/**
* 栏目信息统计Dao接口
* @author www.javake.net
*/
public interface CmsChannelStatisticDao {
/**
* 当前栏目文章统计
* @param restrictions
* @return
*/
public long contentStatistic(Map<String, Object> restrictions);
/**
* 当前栏目待审核文章统计
* @param restrictions
* @return
*/
public long contentCheckingStatistic(Map<String, Object> restrictions);
/**
* 当前栏目评论统计
* @param restrictions
* @return
*/
public long commentStatistic(Map<String, Object> restrictions);
}
         第三步:编写Dao接口的实现。

/**
* 栏目信息统计Dao实现类
* @author www.javake.net
*/
import static com.jeecms.cms.entity.main.Content.ContentStatus.passed;
import static com.jeecms.cms.entity.main.Content.ContentStatus.prepared;
import static com.jeecms.cms.entity.main.Content.ContentStatus.rejected;
import static com.jeecms.cms.statistic.CmsStatistic.CHANNELID;
import static com.jeecms.cms.statistic.CmsStatistic.ISREPLYED;
import static com.jeecms.cms.statistic.CmsStatistic.SITEID;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.jeecms.cms.entity.main.Content.ContentStatus;
import com.jeecms.common.hibernate3.Finder;
import com.jeecms.common.hibernate3.HibernateSimpleDao;
@Repository
public class CmsChannelStatisticDaoImpl extends HibernateSimpleDao
implements CmsChannelStatisticDao{
/**
* 获取文章总数
*/
public long contentStatistic(Map<String, Object> restrictions) {
Finder f = createCacheableFinder("select count(*) from Content bean");
Integer channelId = (Integer) restrictions.get(CHANNELID);
if (channelId != null) {
f.append(" join bean.channel channel,Channel parent");
f.append(" where channel.lft between parent.lft and parent.rgt");
f.append(" and channel.site.id=parent.site.id");
f.append(" and parent.id=:parentId");
f.setParam("parentId", channelId);
} else {
f.append(" where bean.site.id=:siteId").setParam("siteId",
restrictions.get(SITEID));
}
return (Long) find(f).iterator().next();
}

private long contentStatistic(Map<String, Object> restrictions,ContentStatus status) {
Finder f = createCacheableFinder("select count(*) from Content bean");
if (prepared == status || passed == status || rejected == status) {
f.append(" join bean.contentCheckSet check");
}
Integer channelId = (Integer) restrictions.get(CHANNELID);
if (channelId != null) {
f.append(" join bean.channel channel,Channel parent");
f.append(" where channel.lft between parent.lft and parent.rgt");
f.append(" and channel.site.id=parent.site.id");
f.append(" and parent.id=:parentId");
f.setParam("parentId", channelId);
} else {
f.append(" where bean.site.id=:siteId").setParam("siteId",
restrictions.get(SITEID));
}
if (prepared == status || passed == status) {
f.append(" and check.rejected=false");
} else if (rejected == status) {
f.append(" and check.rejected=true");
}
return (Long) find(f).iterator().next();
}

/**
* 待审核文章总数
* @param restrictions
* @param status
* @return
*/
public long contentCheckingStatistic(Map<String, Object> restrictions) {
return contentStatistic(restrictions,ContentStatus.prepared);
}
public long commentStatistic(Map<String, Object> restrictions) {
Finder f = createCacheableFinder("select count(*) from CmsComment bean ");
Integer channelId = (Integer) restrictions.get(CHANNELID);
if (channelId != null) {
f.append(" join bean.channel channel,Channel parent");
f.append(" where channel.lft between parent.lft and parent.rgt");
f.append(" and channel.site.id=parent.site.id");
f.append(" and parent.id=:parentId");
f.setParam("parentId", channelId);
} else {
f.append(" where bean.site.id=:siteId").setParam("siteId",
restrictions.get(SITEID));
}
Boolean isReplyed = (Boolean) restrictions.get(ISREPLYED);
if (isReplyed != null) {
if (isReplyed) {
f.append(" and bean.replayTime is not null");
} else {
f.append(" and bean.replayTime is null");
}
}
return (Long) find(f).iterator().next();
}

private Finder createCacheableFinder(String hql) {
Finder finder = Finder.create(hql);
finder.setCacheable(true);
return finder;
}
}
         第四步:编写栏目统计的FreeMarker标签类。这里可以输入两个参数,一个是id(栏目id),一个是siteId(站点id)。这两个参数可在使用标签的时候输入。

/**
* 栏目统计
* @author www.javake.net
*/
import static com.jeecms.common.web.freemarker.DirectiveUtils.OUT_BEAN;
import static freemarker.template.ObjectWrapper.DEFAULT_WRAPPER;
import static com.jeecms.cms.statistic.CmsStatistic.SITEID;
import static com.jeecms.cms.statistic.CmsStatistic.ISREPLYED;
import static com.jeecms.cms.statistic.CmsStatistic.USERID;
import static com.jeecms.cms.statistic.CmsStatistic.CHANNELID;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.jeecms.cms.entity.main.ChannelStatistics;
import com.jeecms.cms.entity.main.CmsSite;
import com.jeecms.cms.statistic.CmsChannelStatisticDao;
import com.jeecms.cms.web.FrontUtils;
import com.jeecms.common.web.freemarker.DirectiveUtils;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
public class CmsChannelStatisticsDirective implements TemplateDirectiveModel{
/**
* 输入参数,站点ID。存在时,获取该站点栏目,不存在时获取当前站点栏目。
*/
public static final String PARAM_SITE_ID = "siteId";
/**
* 输入参数,栏目ID。
*/
public static final String PARAM_ID = "id";
@SuppressWarnings("unchecked")
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
CmsSite site = FrontUtils.getSite(env);
Integer id = DirectiveUtils.getInt(PARAM_ID, params);
ChannelStatistics statistics = null;
Map<String,Object> restrictions = new HashMap<String,Object>();
Integer siteId = DirectiveUtils.getInt(PARAM_SITE_ID, params);
if (siteId == null) {
siteId = site.getId();
}
if (id != null ) {
restrictions.put(CHANNELID, id);
} else {
restrictions.put(SITEID, siteId);
}
long contentCount = channelSatistic.contentStatistic(restrictions);
long contentCheckingCount = channelSatistic.contentCheckingStatistic(restrictions);
long commentCount = channelSatistic.commentStatistic(restrictions);

statistics = new ChannelStatistics();
statistics.setCommentCount(commentCount);
statistics.setContentAllCount(contentCount);
statistics.setContentCheckingCount(contentCheckingCount);

Map<String, TemplateModel> paramWrap = new HashMap<String, TemplateModel>(
params);
paramWrap.put(OUT_BEAN, DEFAULT_WRAPPER.wrap(statistics));
Map<String, TemplateModel> origMap = DirectiveUtils
.addParamsToVariable(env, paramWrap);
body.render(env.getOut());
DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap);
}

@Autowired
private CmsChannelStatisticDao channelSatistic;
public void setChannelSatistic(CmsChannelStatisticDao channelSatistic) {
this.channelSatistic = channelSatistic;
}
}
         第五步:在jeecms-context.xml文件中加入CmsChannelStatisticsDirective标签类的bean注入代码。

<!— Author:www.javake.net -->
<bean id="cms_lucene_page" class="com.jeecms.cms.lucene.LuceneDirectivePage"/>
<bean id="cms_advertising" class="com.jeecms.cms.action.directive.CmsAdvertisingDirective"/>
<bean id="cms_channel_statistic" class="com.jeecms.cms.action.directive.CmsChannelStatisticsDirective"/>
<!— Author:www.javake.net -->
<property name="freemarkerVariables">
<map>
<entry key="uuid" value-ref="uuid"/>
<entry key="process_time" value-ref="process_time"/>
<entry key="text_cut" value-ref="text_cut"/>
<entry key="html_cut" value-ref="html_cut"/>
<entry key="cms_pagination" value-ref="cms_pagination"/>
<entry key="cms_channel_list" value-ref="cms_channel_list"/>
<entry key="cms_channel_page" value-ref="cms_channel_page"/>
<entry key="cms_channel" value-ref="cms_channel"/>
<entry key="cms_content" value-ref="cms_content"/>
<entry key="cms_content_list" value-ref="cms_content_list"/>
<entry key="cms_content_page" value-ref="cms_content_page"/>
<entry key="cms_tag_list" value-ref="cms_tag_list"/>
<entry key="cms_tag_page" value-ref="cms_tag_page"/>
<entry key="cms_topic_list" value-ref="cms_topic_list"/>
<entry key="cms_topic_page" value-ref="cms_topic_page"/>
<entry key="cms_comment_list" value-ref="cms_comment_list"/>
<entry key="cms_comment_page" value-ref="cms_comment_page"/>
<entry key="cms_guestbook_ctg_list" value-ref="cms_guestbook_ctg_list"/>
<entry key="cms_guestbook_list" value-ref="cms_guestbook_list"/>
<entry key="cms_guestbook_page" value-ref="cms_guestbook_page"/>
<entry key="cms_vote" value-ref="cms_vote"/>
<entry key="cms_friendlink_ctg_list" value-ref="cms_friendlink_ctg_list"/>
<entry key="cms_friendlink_list" value-ref="cms_friendlink_list"/>
<entry key="cms_lucene_list" value-ref="cms_lucene_list"/>
<entry key="cms_lucene_page" value-ref="cms_lucene_page"/>
<entry key="cms_advertising" value-ref="cms_advertising"/>
<entry key="cms_channel_statistic" value-ref="cms_channel_statistic"/>
</map>
</property>
         第六步:在jeecms-servlet-front.xml文件中配置

<!— Author:www.javake.net -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="freemarkerVariables">
<map>
<entry key="uuid" value-ref="uuid"/>
<entry key="process_time" value-ref="process_time"/>
<entry key="text_cut" value-ref="text_cut"/>
<entry key="html_cut" value-ref="html_cut"/>
<entry key="cms_pagination" value-ref="cms_pagination"/>
<entry key="cms_channel_list" value-ref="cms_channel_list"/>
<entry key="cms_channel_page" value-ref="cms_channel_page"/>
<entry key="cms_channel" value-ref="cms_channel"/>
<entry key="cms_content" value-ref="cms_content"/>
<entry key="cms_content_list" value-ref="cms_content_list"/>
<entry key="cms_content_page" value-ref="cms_content_page"/>
<entry key="cms_tag_list" value-ref="cms_tag_list"/>
<entry key="cms_tag_page" value-ref="cms_tag_page"/>
<entry key="cms_topic_list" value-ref="cms_topic_list"/>
<entry key="cms_topic_page" value-ref="cms_topic_page"/>
<entry key="cms_comment_list" value-ref="cms_comment_list"/>
<entry key="cms_comment_page" value-ref="cms_comment_page"/>
<entry key="cms_guestbook_ctg_list" value-ref="cms_guestbook_ctg_list"/>
<entry key="cms_guestbook_list" value-ref="cms_guestbook_list"/>
<entry key="cms_guestbook_page" value-ref="cms_guestbook_page"/>
<entry key="cms_vote" value-ref="cms_vote"/>
<entry key="cms_lucene_list" value-ref="cms_lucene_list"/>
<entry key="cms_lucene_page" value-ref="cms_lucene_page"/>
<entry key="cms_friendlink_ctg_list" value-ref="cms_friendlink_ctg_list"/>
<entry key="cms_friendlink_list" value-ref="cms_friendlink_list"/>
<entry key="cms_advertising" value-ref="cms_advertising"/>
<entry key="cms_channel_statistic" value-ref="cms_channel_statistic"/>
</map>
</property>
         第七步:到目前为止,核心代码和配置编写完毕啦!!!可以在栏目模板中使用标签了!

[@cms_channel_statistic id=a.id]${tag_bean.contentAllCount}[/@cms_channel_statistic]
---------------------
作者:brittany2009
来源:CSDN
原文:https://blog.csdn.net/brittany2009/article/details/84724711
版权声明:本文为博主原创文章,转载请附上博文链接!

JEECMS自定义标签的更多相关文章

  1. JEECMS 自定义标签

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

  2. Jeecms自定义标签用法[单个内容]

    1.com.jeecms.cms.action.directive包下建立自己的标签类

  3. [原创]JEECMS 自定义标签调用广告版位下的所有广告(利用广告管理管理首页幻灯片)

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...

  4. JEECMS自定义标签开发步骤2

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...

  5. JEECMS自定义标签开发步骤

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...

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

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

  7. 自己动手编写JEECMS自定义栏目统计标签

    今天想在给Java客二级版面加入栏目文章统计效果,如下图, 查看JEECMS的源代码发现开发者版本还没有类似现成的统计标签,一种解决的办法是使用现有的JEECMS标签,像这样Struts( [@cms ...

  8. [JSP]自定义标签库taglib

    自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...

  9. [Java] JSP笔记 - 自定义标签

    自定义标签的创建步骤: 自定义标签的四大功能: 自定义标签的类结构: 在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现j ...

随机推荐

  1. 20175323《Java程序设计》第四周学习总结

    教材学习内容总结 我用幕布记录学习过程和思路,下面是我这章的知识框架总结https://mubu.com/doc/ffMhY6FVc0 教材学习中的问题和解决过程 问题1:教材121页的例六Examp ...

  2. Pycharm2019.1.3安装程序以及教程

    链接:https://pan.baidu.com/s/1TF--EyCUQgmPeXFaCMJm8w 提取码:5vme

  3. 面试系列18 rediscluster 原理

    一.节点间的内部通信机制 1.基础通信原理 (1)redis cluster节点间采取gossip协议进行通信 跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间 ...

  4. 计算图像数据集的RGB均值

    最近在跑代码的时候,需要用到RGB三个通道上的均值,如下图所示: 写了一个程序,如下: import os import cv2 import random import numpy as np #数 ...

  5. 获取url指定参数值(js/vue)

    function getParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&am ...

  6. mac os Catalina beta Jetbrains idea闪退解决方案

    第一时间升级最新版本的Catalina 10.15 Beta 版(19A501i) 后, 发现不管在idea 输入什么,都会直接crash. 不论是卸载重装还是,clean,结果都是一样的. 在网上查 ...

  7. linux yum 安装 卸载

    安装一个软件时 yum -y install httpd 安装多个相类似的软件时 yum -y install httpd* 安装多个非类似软件时 yum -y install httpd php p ...

  8. 关于Cadence SPB 16.6 破解的一些关键步骤

    网上搜索到的破解方法,一般来说流程都是没有什么大问题的.较详细的一个破解流程可参照: http://www.mr-wu.cn/cadence-orcad-allegro-spb-16-6-instal ...

  9. springboot与任务(异步任务)

    描述:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x ...

  10. 19-11-05-Night

    我就是不行. ZJ: 好像是因为郁闷了才咕掉的…… 33 Miemeng 30 00:01:34 40 00:01:46 0 00:01:22 70 00:01:46 不记得当时怎么想的 T1只会暴力 ...