zoukankan      html  css  js  c++  java
  • 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]
    ---------------------
    作者:brittany2009
    来源:CSDN
    原文:https://blog.csdn.net/brittany2009/article/details/84724711
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/Jeely/p/11214609.html
Copyright © 2011-2022 走看看