`

JEECMS自定义标签

 
阅读更多

        查看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]

 

分享到:
评论

相关推荐

    自定义分页标签

    自定义的漂亮分页标签,支持上下翻页,直接跳转指定页

    强大的自定义标签分页,内有说明

    "强大的自定义标签分页"是指通过自定义JSP标签来实现灵活、高效的分页功能。这种方式可以提供更高的定制性,使得开发者可以根据项目需求进行个性化的设计和调整。 首先,我们来了解自定义标签。在Java Web开发中,...

    jeecms 标签 使用说明

    这涉及到Java的标签库开发技术,包括编写标签处理类和标签库描述文件(TLD),然后将自定义标签部署到Jeecms环境中。 六、模板标签说明文档 在提供的文件`jss_CMS标签说明.doc`和`jeecms模板标签说明.doc`中,详细...

    jeecms个人标签文档

    比如,如何优化标签的使用以提高页面加载速度,如何自定义标签以扩展功能,如何配置缓存策略以提升系统性能,都是实践中值得分享和学习的经验。 6. **文档资源** 提到的"jeecms部分文档"可能包含了Jeecms的使用...

    jeecms2012标签使用教程

    8. **自定义标签**:Jeecms还支持开发者自定义标签,可以根据项目需求扩展功能,实现更加个性化的展示效果。 在实际应用中,开发者通常需要结合模板语言(如Freemarker或JSP)来使用这些标签,通过设置不同的属性和...

    jeecms标签

    标签名称]` 格式,适用于自定义标签输出样式,例如 `[@cms.ChnlList id='' inner='1';c]┆${c.url}"&gt;${c.name}[/@cms.ChnlList]` 用于显示栏目列表,`c` 是别名,可以用来引用标签内部的对象属性,如链接(`url`)和...

    jeecms开发指南v1.0.pdf

    Jeecms的一个重要特点是其模板机制,它允许用户无需深入理解Java或JSP,仅通过掌握HTML和Jeecms自定义标签就能进行页面设计。系统提供了两种风格的标签:一种封装了常见显示样式,便于快速生成动态效果,如文章列表...

    freemarker及jeecms标签使用学习文档

    - **Jeecms简介**:Jeecms是一款基于Java的企业级内容管理系统,它提供了丰富的自定义标签供开发者使用。 - **标签语法**:Jeecms的标签通常以`{`开头,如`{dede:arclist}`,用于列出文章列表。 - **标签参数**:...

    JEECMS系统标签使用概述

    ### JEECMS系统标签使用概述 #### 一、引言 JEECMS是一款基于Java语言开发的开源内容管理系统(Content Management System, CMS),广泛应用于企业门户、政府网站、新闻媒体等多种类型的网站建设。对于JEECMS系统的...

    JEECMS系统标签说明2010

    ### JEECMS系统标签说明2010 #### 关键知识点概述 本文将详细介绍JEECMS系统中的一个重要功能——文章列表标签(`ArtiList`标签)。该标签是JEECMS中最常用的功能之一,它可以帮助开发者和网站管理员快速地生成...

    jeecms3.0标签使用说明书

    Jeecms 3.0 标签使用说明书 Jeecms 是一个强大的内容管理系统,其标签功能强大且灵活,能够帮助开发者轻松地构建网站内容。下面我们将详细介绍这些标签的使用方法。 1. 页面处理时间标签:`[@process_time/]` 这个...

    JEECMS3.0 标签使用

    ### JEECMS3.0 标签使用详解 #### 页面处理时间标签 页面处理时间标签 `[@process_time/]` 用于记录并展示页面从加载到渲染完成所消耗的时间。这有助于开发者了解页面性能表现,特别是在优化用户体验方面尤为重要。...

    Jeecms2012版标签学习手册

    该标签允许自定义显示的数量,并通过循环遍历来呈现每个标签。 **作用:** 显示tag列表,通常用于侧边栏或页面底部,以增强用户体验和内容导航。 **示例代码:** ```html ;color:red"&gt; 热门tags: [@cms_tag_...

    JEECMS标签-使用说明pdf文档.pdf

    标签名称]` - 这种格式允许自定义标签的输出样式,例如 `[@cms.ChnlList id=''inner='1';c] ${c.url}"&gt;${c.name}[/@cms.ChnlList]` 用于显示栏目列表并创建链接。 在使用这些标签时,可以通过新建模板进行测试。...

    jeecms_3.0+标签的使用

    Jeecms是一款基于Java技术的企业级内容管理系统,其3.0版本提供了丰富的标签库,方便开发者在构建网站时快速地生成动态内容。本文将详细解析Jeecms 3.x版本中的部分核心标签及其使用方法。 1. 页面处理时间标签:`...

    我爱jeecms

    Jeecms 提供了一套丰富的自定义标签,这些标签极大地简化了开发者在模板中的编程工作,使得内容展示更加灵活。 1. 常用标签:如`{cmsList}`用于列出指定栏目下的文章,`{cmsLink}`用于获取链接信息,`{cmsContent}`...

    JEECMS3.x模板标签使用说明

    ### JEECMS3.x模板标签使用说明 #### 页面处理时间标签 **标签示例:** `[@process_time/]` 此标签用于展示当前页面的加载处理时间。它可以帮助开发者和管理员了解页面加载速度,并据此优化系统性能。 #### 页面...

Global site tag (gtag.js) - Google Analytics