【问题标题】:Injecting JSP EL and/or JSTL tags from Java code从 Java 代码中注入 JSP EL 和/或 JSTL 标签
【发布时间】:2015-10-30 11:30:56
【问题描述】:

我有用于 JSP 页面的 Java 类。 getAttr() 返回一个字符串,其中包含任意数量的 HTML 锚元素,这些元素指向我的 Web 应用程序本地的 URL:

public class C {
    public String getAttr() {
        return "foo <a href = \"/index.html\">bar</a> baz";
    }
}

<c:set var = "c" value = "..."/>
${c.attr}

只要使用默认上下文 (/),一切都很好。可以通过使用类似&lt;a href = "&lt;c:url value = "..."/&gt;"&gt;...&lt;/a&gt; 的smth 来解释非默认上下文,但这是特定于JSP 的。像 return "&lt;a href = \"&lt;c:url value = \"...\"/&gt;\"&gt;...&lt;/a&gt;"; 这样的 Java 代码的 JSTL/EL 注入不起作用(也不应该)起作用。

如何在不暴露 Java 类内部结构的情况下支持非默认上下文?在 JSP 范围之外手动创建超链接至少是丑陋的,但我已经没有想法了。

【问题讨论】:

    标签: java jsp jstl el


    【解决方案1】:

    尝试在您的 c 类中获取 HttpServletRequest:

    public class C {
    
        private HttpServletRequest request;
        //initialize request in a constructor
    
        public String getAttr() {
            return "foo <a href = \""+request.getContextPath()+"/index.html\">bar</a> baz";
        }
    }
    

    【讨论】:

    • 我希望我的类与 JSP 无关,因此我通过将 ${pageContext.request.contextPath} 作为唯一的 String 参数传递给 getAttr(...) 来解决这个问题。从 JSP 的角度来看,这看起来像 ${c.getAttr(pageContext.request.contextPath)}。首先我没有想到,JSP EL 2.2+(Tomcat 6+)允许invoking arbitrary instance methods with arguments。然后我在我的 Java 代码中重新实现了org.apache.taglibs.standard.tag.common.core.UrlSupport#resolveUrl()
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多