【发布时间】:2010-10-18 22:25:49
【问题描述】:
我正在创建一个站点,其中有许多页面组件引用页面中其他地方使用的对象。其中一些组件也用于其他页面,因此我希望使用包括而不是剪切和粘贴。
问题是,如果我在页面的多个组件中有相同的“jsp:useBean”语句,编译器会给出错误“重复的局部变量”。
如何在一个 JSP 页面的多个组件中使用相同的对象,而不需要在文件中包含所有内容?
示例:在主(父)页面中:
<jsp:useBean id="fred" class="..." scope="request" />
<jsp:directive.include file="myWidget.jsp" />
包含的页面,myWidget.jsp,也需要使用“fred”对象:
<jsp:useBean id="fred" class="..." scope="request" />
但是,这会导致编译失败并出现“重复的局部变量 'fred'”。
这基本上破坏了将页面分解为组件的想法;我不希望有数百行长的 JSP 文件,它们之间只有细微的差别!
对于一个组件,它在网站的每个页面上保持一致是绝对必要的,我已经使用 scriptlet 解决了这个问题:
<%
{ // for scope
Object _o1 = request.getAttribute("fred");
if (_o1 !=null && _o1 instanceof MyClass)
{
// use a deliberately obscure variable name to avoid conflict
MyClass _myLocalFred1 = (MyClass) _o1;
}
} // for scope
%>
这可行,但很难看;有几本书说“永远不要使用 scriptlet”,但 scriptlet 似乎是唯一可以控制变量范围的方法,而且我可以使用名称而不必担心它们在页面的其他地方使用。
如何在包含的文件中使用 jsp:useBean?
【问题讨论】:
-
JSP 从未设计用于“小部件”风格的编程。 Sun 知道这一点,因此他们已转向 JSF。您是否考虑过使用 JSF 代替纯 JSP?任何其他 Web 框架也可以满足您的需求。
标签: jsp scope components