jsp属性的设计模式,以避免名称冲突

时间:2014-05-05 19:40:37

标签: jsp custom-tags

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

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>

虽然您未在<t:test />标记中指定variableName,但标记正在从Test对象中获取variableName的值,因为它碰巧共享相同的变量名称。

如何避免此命名空间冲突?

1 个答案:

答案 0 :(得分:0)

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

pageContext.findAttribute("variableName");

根据javadocs,findAttribute&#34;按顺序搜索页面中的命名属性,请求,会话(如果有效)和应用程序范围,并返回相关值或null。&#34;

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

${pageScope.variableName}

改为使用此功能:

pageContext.getAttribute("variableName");

根据javadocs,getAttribute&#34;返回与页面范围中的名称关联的对象,如果未找到则返回null。&#34;这是理想的行为。仅在作为标记的属性提供时才使用该变量。

功能名称与我的口味太相似了。仅凭这个名字你就不会知道两者之间的区别。