包含页面组件中的jsp useBean作用域

时间:2009-04-11 17:19:10

标签: jsp scope components

我正在创建一个网站,其中有许多页面组件引用页面中其他位置使用的对象。其中一些组件也用于其他页面,因此我的使用愿望包括而不是剪切和粘贴。

问题是如果我在页面的多个组件中有相同的“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似乎是唯一可以控制变量范围的方法,我可以使用名称而不用担心它们在页面的其他地方使用过。

如何在include'd文件中使用jsp:useBean?

1 个答案:

答案 0 :(得分:0)

我最终使用了Struts框架的“Tiles”部分。它提供了组件的隔离,因此它们不会影响彼此的命名空间。