您正在制作自定义标记库并定义了一个属性:
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
的值,因为它碰巧共享相同的变量名称。
如何避免此命名空间冲突?
答案 0 :(得分:0)
似乎问题是$ {variableName}。当jsp编译时java类使用:
pageContext.findAttribute("variableName");
根据javadocs,findAttribute&#34;按顺序搜索页面中的命名属性,请求,会话(如果有效)和应用程序范围,并返回相关值或null。&#34;
由于该变量的值未在标记中传递,因此无法在页面范围中找到它,但随后会在我的类提供的请求范围中找到它。为了限制我应该使用的可见性
${pageScope.variableName}
改为使用此功能:
pageContext.getAttribute("variableName");
根据javadocs,getAttribute&#34;返回与页面范围中的名称关联的对象,如果未找到则返回null。&#34;这是理想的行为。仅在作为标记的属性提供时才使用该变量。
功能名称与我的口味太相似了。仅凭这个名字你就不会知道两者之间的区别。