浅谈<cms:contentaccess>标签的使用

来源:互联网 发布:linux rsync安装配置 编辑:程序博客网 时间:2024/05/16 11:34
OpenCms 7.02 新增加了一个非常有用的标签 <cms:contentaccess> ,但是好像官方一直没有给出它的用法的说明。那么今天就浅谈一下这个标签的用法。
[王毅原创,转载注明]
    在官方的版本说明里面是这样说的:“Added <cms:contentaccess> tag for easy access to XML contents with the JSP EL inside a <cms:contentload> block.”
    也就是说,这个标签主要是让你很容易的在 <cms:contentload> 标签代码段里面使用 JSP 的 EL 表达式来访问 XML 结构化内容。
    那么,原来我们访问 XML 内容的时候是什么样一种方式呢?请看下面示例代码(更多的可以查看"/system/modules/org.opencms.frontend.templateone.modules/pages/"下面关于 news,jobs等类型的显示模板的页面代码):

    <cms:contentload collector="singleFile" param="%(pageContext.detailfile)" editable="true">
    ......
        <cms:contentshow element="Title" />
    ......
    </cms:contentload>

    当然,我举的这个例子可能是比较简单,大家应该都看得出来,就是用来显示文章的一个标题“Title”,也就是xml里面的"Title"节点的值。
    在 OpenCms 7.0.2 里面引入<cms:contentaccess>标签以后呢,我们就可以使用下面的方式来使用:

    <cms:contentload collector="singleFile" param="%(pageContext.detailfile)" editable="true">
    <cms:contentaccess var="content" />
    ......
        <c:out value="${content.value['Title']}"
    ......
    </cms:contentload>

    就象上面看到的,在<cms:contentload>代码段中使用 <cms:contentaccess> 标签以后,就可以直接使用类似 <c:out value="${content.value['Title']}" 这样的 JSTL 代码 <c:out> 以及 EL 表达式 ${content.value['Title']} 来输出得到的数据。

    也就是说,原来在 OpenCms 的标签,或 JSTL 里面使用 EL 表达式的时候,表达式使用的标量可能是个麻烦事情。就大家在 TemplateOne 的代码里面看到的那样,如果你想使用类似<c:out value="${content.value['Title']}" 这样的方法输出数据,但是没有<cms:contentload> 可用的话,就必须向原来一样使用 <c:set var="Title" value="" /> 这样的语法来定义变量。

    可能在这个例子里面还不能体现出来所说的“easy access to XML contents”的好处。
    那么,当你使用 <cms:contentshow element="Title" /> 来输出标题的时候,如果标题为空的话,你如何判断呢?只好再去使用 <cms:contentcheck> 标签 <cms:contentcheck ifexists="Title"> 来判断了。而实际上这样的判断使用 JSTL 中的 <c:if test ...> 就可以做到。

    譬如,你可以使用
    <c:if test="${!content.value['Title'].isEmptyOrWhitespaceOnly}">
            <c:out value="${content.value['Title']}" />
    </c:if>
    来代替下面的这段代码:
    <cms:contentcheck ifexists="Title">
        <cms:contentshow element="Title" />
    </cms:contentcheck>

    这样效果会更好一点,为什么这样说呢?因为 contentcheck 的可选值只有:ifexists,ifexistsone,ifexistsall,ifexistsnone。也就是说煤你仅仅可以判断都这一步。而使用<cms:contentload>标签以后,你就可以有更多的选择。

    更重要的是,使用这个标签以后,你使用OpenCms做二次开发学习的标签可能就又少了几个,如果你对JSTL和EL已经很熟悉的话,恭喜你,你可以更方便的上手了。

    至于这个标签的更详细的用法,有兴趣的可以查看API中 org.opencms.jsp.util.CmsJspContentAccessBeanorg.opencms.jsp.util.CmsJspContentAccessValueWrapper 这两个相关的类,相信会游更大的收获。

   顺便说一下,我以前对标签不是很熟悉的时候,使用API来读取和操作XML内容,那可是相对麻烦的事情呢。
   所以说,OpenCms 还是越来越好用了。还是 java 开源内容管理系统的老大。所以,我推荐大家使用它!
原创粉丝点击