Jsp Jahia从编辑模式获取实时工作区JCR数据

Jsp Jahia从编辑模式获取实时工作区JCR数据,jsp,jstl,jcr,jackrabbit,jahia,Jsp,Jstl,Jcr,Jackrabbit,Jahia,我正在使用Jahia数字体验管理器7.1.2 如何在编辑模式下显示live工作区中的数据(在JSTL中从JSP中) 详情: 我需要在编辑模式下在页面中显示一些数据。问题在于,数据是用户提交的内容,仅存储在JCRlive工作区中(不存储在编辑模式使用的default工作区中) 通常我会这样显示数据(在编辑模式下显示default工作区数据和在线模式下显示live数据非常有用): 我也可以用完整的java scriptlet(或者更好地用taglib)或groovy来完成,但是有没有办法用纯JST

我正在使用Jahia数字体验管理器7.1.2

如何在编辑模式下显示
live
工作区中的数据(在JSTL中从JSP中)


详情:

我需要在编辑模式下在页面中显示一些数据。问题在于,数据是用户提交的内容,仅存储在JCR
live
工作区中(不存储在编辑模式使用的
default
工作区中)

通常我会这样显示数据(在编辑模式下显示
default
工作区数据和在线模式下显示
live
数据非常有用):


我也可以用完整的java scriptlet(或者更好地用taglib)或groovy来完成,但是有没有办法用纯JSTL来完成呢?

你说得对,在Jahia中,在jsp组件视图之前,你没有对呈现servlet的控制权

此外,在默认JSP标记中切换模式并不容易(因为在正常使用时,您仅从当前工作区呈现内容)

但是在这种情况下使用过滤器也不是一个好主意,因为过滤器可能会导致性能或刷新问题(破坏JSP Jahia视图组件中的默认缓存机制),并且很难在代码中的不同上下文中重用

但是,有一种可能的解决方案可以保持JSP代码的整洁:

  • 使用scriptlet代码创建自己的JSP标记,然后在其中调用方法
    JCRContentUtils.getChildrenOfType(responseNode,type)(示例的参数中的类型为“unt:formResponse”)
  • 例如,您可以使用标记库前缀=
    myjcr
    将此标记命名为
    getChildrenOfTypeInLive(…)
文档:

  • 对于一般JSP标记库创建:
  • Jahia JCR标记库实现示例:和
我希望这能帮助你

问候,


Cédric

您应该使用servlet并将
responseNode
设置为请求。这将为您解决这是一个组件视图,我无法控制servlet。我认为修改它的唯一方法是使用servlet。我将尝试一下。是的,我最终使用了自己的taglib,我只是想知道在纯JSTL中是否有可能。谢谢你对过滤器的建议。
<%@ taglib prefix="jcr" uri="http://www.jahia.org/tags/jcr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--@elvariable id="currentNode" type="org.jahia.services.content.JCRNodeWrapper"--%>

<c:forEach items="${jcr:getChildrenOfType(currentNode,'unt:formResponse')}" var="resp">
     ${resp.name}
</c:forEach>
<c:set var="currentNodeId" value="${currentNode.identifier}"/>
<c:set var="locale" value="${renderContext.mainResourceLocale}"/>
<%
     JCRNodeWrapper responsesNode = JCRSessionFactory.getInstance().getCurrentUserSession("live", locale).getNodeByIdentifier(currentNodeId);
     for (JCRNodeWrapper resp : responsesNode.getNodes()) {
          log.info(resp.getName());
     }
     pageContext.setAttribute("responsesNode", responsesNode);
%>
<c:forEach items="${jcr:getChildrenOfType(responsesNode,'unt:formResponse')}" var="resp">
     ${resp.name}
</c:forEach>