• 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    关于maven的一些记录
    3des和tomcat部署
    java串口通讯
    mina自定义编解码
    Linux 下关闭防火墙设置
    查看本机IP
    linux修改localhost方法
    centos 6.5下使用中文输入法
    linux:can't save files
    ng-model取不到值的问题
  • 原文地址:https://www.cnblogs.com/Jeely/p/11214609.html
Copyright © 2020-2023  润新知