【问题标题】:Design pattern for jsp attributes to avoid name collisionjsp属性的设计模式以避免名称冲突
【发布时间】:2014-06-22 05:23:46
【问题描述】:

你正在制作一个自定义标签库并定义了一个属性:

test.tag:

<%@ attribute name="variableName" required="false" type="java.lang.String" %>
${variableName}

并有一个班级:

Test.java

public class Test {
     public String getVariableName() {...};
     public List<Test> getTests() {...};
}

最后是一个jsp:

<s:iterator value="getTests">
  <t:test />
</s:iterator>

虽然您没有在 &lt;t:test /&gt; 标记中指定变量名称,但该标记正在从 Test 对象中获取 variableName 的值,因为它恰好共享相同的变量名称。

如何避免这种命名空间冲突?

【问题讨论】:

  • 我查看了 JSTL、struts 和 cewolf(一个图形/图表标签库)的源代码,它们似乎都在 Java 类中实现了它们的标签,而不是作为 .tag 文件。我认为出于性能原因这是最好的,但在将库实现为 .tag 文件时,我仍然对正确的方法感兴趣。

标签: jsp custom-tags


【解决方案1】:

问题似乎是 ${variableName}。 jsp编译时java类使用:

pageContext.findAttribute("variableName");

根据javadocs,findAttribute“按顺序在页面、请求、会话(如果有效)和应用范围内搜索命名属性,并返回关联的值或null。”

由于该变量的值未在标记中传递,因此不会在页面范围内找到它,但随后会在我的班级提供的请求范围内找到它。为了限制可见性,我应该一直在使用

${pageScope.variableName}

改用这个函数:

pageContext.getAttribute("variableName");

根据javadocs,getAttribute“返回与页面范围内的名称关联的对象,如果没有找到则返回null。”这是期望的行为。仅当作为标签的属性提供时才使用该变量。

函数名称与我的口味太相似了。光看名字你不会知道两者的区别。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多