查看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]
相关推荐
自定义的漂亮分页标签,支持上下翻页,直接跳转指定页
强大的自定义标签分页,内有说明,更加通用。
freemarker文档两个,有助于理解和学习freemarker。jeecms标签文档能够帮助你理解模板总的自定义标签。更加方便学习
jeecms图文安装过程,导入myeclipse步骤,jeecms首页加载过程,标签的使用及自定义标签,怎样使用自己创建的表
4.强大、灵活的标签,用户自定义显示内容和显示方式 5. 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 6. 完全生成全站静态页面,可自定义路径结构,全面提高页面访问速度 7.轻松建设大规模网站,可...
强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 采用伪静态页面技术,可自定义路径结构,无需urlrewrite 轻松建设大规模网站,可通过次级域名建立子...
JEECMS是JavaEE版网站管理系统 (Java Enterprise Edition Content Manage System)的简称。...· 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性
· 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 · 完全生成全站静态页面,可自定义路径结构,无需urlrewrite · 轻松建设大规模网站,可通过...
自定义标签内容样式或使用系统提供的内容样式都非常方便。 ·尽量减少对第三方类库的依赖,减小发布包体积。 ·使用fckeditor代替原有编辑器。 ·文章内容不入库,减少数据库体积,程序运行效率更高。
继承其强大、稳定、安全、高效、跨平台等多方面的优点,采用hibernate3+struts2+spring2+freemarker主流技术架构,懂html就能建站,提供最便利、合理的使用方式 ,强大、灵活的标签,用户自定义显示内容和显示方式 ...
· 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 · 采用伪静态页面技术,可自定义路径结构,无需urlrewrite · 轻松建设大规模网站,可通过次级...
基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示...
· 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 · 完全生成全站静态页面,可自定义路径结构,全面提高页面访问速度 · 轻松建设大规模网站,可...
· 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 · 完全生成全站静态页面,可自定义路径结构,无需urlrewrite · 轻松建设大规模网站,可通过...
强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 采用伪静态页面技术,可自定义路径结构,无需urlrewrite 轻松建设大规模网站,可通过次级域名建立子...
·强大、灵活的标签,用户自定义显示内容和显示方式 ·在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 ·采用伪静态页面技术,可自定义路径结构,无需urlrewrite ·轻松建设大规模网站,可通过次级域名...
· 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 · 完全生成全站静态页面,可自定义路径结构,全面提高页面访问速度 · 轻松建设大规模网站,可...
强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 采用伪静态页面技术,可自定义路径结构,无需urlrewrite 轻松建设大规模网站,可通过次级域名建立子...
Jeecms是基于Spring注解,在自定义标签时对于实体类和dao service等注意注解的问题。 五 自定义标签及使用自己创建的表的实现过程 下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_...