【问题标题】:Java Function with No Return in TLDTLD 中没有返回的 Java 函数
【发布时间】:2016-09-27 22:10:15
【问题描述】:

所以,我试图弄清楚如何使用 JSTL 和 TLD 与 JSP 中的 Java 函数进行交互。这个特定的函数没有返回值,所以我假设我需要在 JSP 中直接使用 EL 调用来调用它:

<html code here>
${prefix:createChildPage(currentPage, resourceResolver, strings, string)}
<other jstl code here>
<more html here>

但我不知道如何为此正确设置 TLD。 Java 函数如下所示:

public static void createChildPage(Page page, ResourceResolver resourceResolver, String[] strings, String string) throws Exception {
    // code in here
}

如您所见,没有回报。该函数只接受其输入参数,并使用这些参数在 Adob​​e CQ/AEM 环境中使用 JCR/Oak 节点结构构建子页面结构。因此,我尝试像这样设置 TLD 函数,但它一直失败告诉我该方法在我的类中不存在。

<function>
    <name>createChildPage</name>
    <function-class>com.org.utils.ClassName</function-class>
    <function-signature>createChildPage(com.day.cq.wcm.api.Page, org.apache.sling.api.resource.ResourceResolver, java.lang.String, java.lang.String)</function-signature>
</function>

起初,我在想我可能只是不知道如何为 TLD 分类 String[]。但是我已经尝试了很多具有相同结果的类,我相当肯定这可能与我没有指定返回的事实有关。对于上面的示例代码,我将 String[] 归类为 java.lang.String,但它可能应该是 java.util.Array。我已经把头撞到了墙上,现在无法真正分辨。我假设我需要 TLD 函数,因为我必须通过某种方式从 JSP 调用(因此,代码的 ${prefix: 部分。

所以我的问题是:如何使用没有返回的 JSTL/EL 从 JSP 调用 Java 函数?它只是在页面加载时做一些事情。

【问题讨论】:

    标签: java jsp jstl uri aem


    【解决方案1】:

    您是否考虑过只返回一个被忽略的值? 如:

    public static int createChildPage(Page page, ResourceResolver resourceResolver, String[] strings, String string) throws Exception {
        // code in here
        return 0;
    }
    

    【讨论】:

    • 我已经考虑过了。但据我所知,它没有遵循良好的编码实践。这是针对企业项目的,所以我想确保我交出的代码尽可能干净。不过,我想我可以使用这种方法来确认问题是否是缺少回报。
    【解决方案2】:

    我最终从另一个函数调用了该函数,该函数返回了创建页面的路径。

    public static String getArticleIncludePath(Page givenPage, String pageName, ResourceResolver resourceResolver) throws Exception {
        // Call createChildPage to build out child page as needed
        createChildPage(givenPage, resourceResolver, pageName);
        // Now get the child includePath
        String childPath = givenPage.getPath() + pageName;
        return childPath;
    }
    

    【讨论】:

      【解决方案3】:

      有点晚了,但您是否尝试将 void 添加到 function-signature?这样做对我有用。

      <function>
         <name>createChildPage</name>
         <function-class>com.org.utils.ClassName</function-class>
         <function-signature>void createChildPage(com.day.cq.wcm.api.Page, org.apache.sling.api.resource.ResourceResolver, java.lang.String, java.lang.String)</function-signature>
      </function>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-25
        • 2011-06-06
        • 2011-10-26
        • 2021-07-02
        相关资源
        最近更新 更多