【问题标题】:Retrieve JavaBean names associated with JSP or build variable with dynamic name检索与 JSP 关联的 JavaBean 名称或使用动态名称构建变量
【发布时间】:2010-05-12 11:27:35
【问题描述】:

我在 jsp 页面中使用 JavaBean。我想给它一个动态名称,因为根据变量的值(我们称之为foo),我希望它具有不同的内容,并且我希望将所有这些不同的版本保留在内存中。我希望 bean 具有会话范围,因为重新评估内容的成本很高。

现在 bean 有一个静态名称,如果我用不同的值 foo 重新加载页面,bean 的内容与以前相同(jsp:usebean 查找具有指定名称的 JavaBean,如果它存在,它使用旧的)。我想保留旧版本和新版本,所以它们必须有不同的名称。

我想做的是这样的:

<jsp:useBean id="stats<%=foo%>" class="foo.bar" scope="session">
</jsp:useBean>

我的问题是我无法在 JSP 代码中引用 JavaBean,因为我不知道它的名称。关于如何解决这个问题的任何想法?

本质上,我想基于另一个变量的值来构建一个具有动态名称的变量。

或者,我想检索与当前页面关联的 JavaBean 的名称,以便获得对刚刚创建的 JavaBean 的引用。

【问题讨论】:

    标签: jsp javabeans dynamic-variables


    【解决方案1】:

    最简单的方法是实现一个自定义的Map,您将其存储在会话范围内。使用Map,您可以使用大括号符号来动态引用键。

    <jsp:useBean id="beanMap" class="com.example.BeanMap" scope="session" />
    ...
    ${beanMap[someDynamicKey].someProperty}
    

    您只需要重写Map#get() 方法,让它在不存在时实例化bean,而不是返回null

    public class BeanMap extends HashMap<String, Bean> {
        @Override public Bean get(Object key) {
            Bean bean = super.get(key);
            if (bean == null) {
                bean = new Bean();
                super.put(String.valueOf(key), bean);
            }
            return bean;
        }
    }
    

    【讨论】:

    • 这看起来很简单,我也可以取消 foo.bar 类的 Bean(我更喜欢)。但是,我会做一些 JSP 框架已经实现的事情,我不希望这样做。我想如果我不能做我最初的想法,这是一个可以接受的黑客攻击。 :) 谢谢你的回答!
    • 我尝试这样做,Java 不理解 Bean 是一个类,它认为它是一个类型参数,即使我导入了该类。因此“new Bean()”给出了一个错误。我什至用“String”尝试过,我得到了同样的结果。
    • 我使用了这个解决方案,虽然做了一些修改。我没有扩展HashMap(因为这是不可能的),但是我在useBean标签中使用了一个Hashtable,并在我的jsp代码中实现了上述逻辑。不是很干净,但它很有效,也没有那么难看。
    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多