【问题标题】:Java beans multiple instances in same jspJava bean在同一个jsp中的多个实例
【发布时间】:2012-05-09 14:24:46
【问题描述】:

我有一个类 counterBean,我希望在我的 jsp 中实例化两个 counterBean 实例(用于两个单独的计数器)。我该怎么做?

编辑 - 添加代码

package beans;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name="CounterBean")
@SessionScoped
public class CounterBean implements Serializable
{
    private static final long serialVersionUID = 1L;
    private static int hitCount;

    public CounterBean() 
    {
        CounterBean.hitCount = 0;
    }

    public static int getCounter() 
    {
        hitCount++;
        return hitCount;
    }

    public static void setCounter(int hitCount) 
    {
        CounterBean.hitCount = hitCount;
    }

    public static int getValue() 
    {
        return hitCount;
    }
}

【问题讨论】:

  • 我唯一能想到的就是创建两个不同的计数器类,但这似乎有点太多了。
  • 您标记了问题[jsf-2.0]。您是否真的使用过时的 JSP 视图技术?为什么不是它的继任者 Facelets? (基于 XML)。
  • 这纯粹是教育性的,我意识到有更好的方法,正如你刚才提到的,只是好奇如何在 jsp 中做到这一点,因为我一直在关注教程。

标签: java jsp jsf-2


【解决方案1】:

最好不要直接在 JSP 代码中创建对象。由于 JSP 应该只是视图。在 JSP 页面中使用 scriptlet 不是好的做法。 最好使用<jsp:useBean>标签:

<jsp:useBean id="firstCounterId' class="yourpackagename.CounterBean" />
<jsp:useBean id="secondCounterId' class="yourpackagename.CounterBean" />

要更改特定计数器的值,请应用标签&lt;jsp:set Property&gt;

<jsp:setProperty name="firstCounterId" property="myNumber" value="123"/>

但我认为几乎所有从 JSP 更改和使用 bean 的问题都可以通过使用标签 &lt;c:set&gt;&lt;c:out&gt; 来解决

【讨论】:

  • 谢谢,我正在尝试使用类的 getCounter() 方法来增加计数器。使用上述方法我将如何做到这一点?
  • 以这种方式更改计数器的值,您可以使用&lt;jsp:setProperty name="counterBean" property="number" value="newValue"/&gt;。如果您想获取当前值,请使用标签&lt;jsp:getProperty name="counterBean" property="number"/&gt;。其中number 是您的counterBean 的属性。如需更详细的答案,我必须查看您的代码。
【解决方案2】:

像往常一样创建计数器 bean:

@Named(value="counterBean")
@SessionScoped
public class CounterBeanClass implements Serializable {

    private int counter = 0;

    public CounterBeanClass() {
    }

    public int getCounter() {
        return counter;
    }

    public void setCounter(int counter) {
        this.counter = counter;
    }

    public String addCounterValue() {
        this.counter++;
        return "";
    }
}

然后,在 faces-config.xml 文件中创建或添加新的托管 bean

<managed-bean>
    <managed-bean-name>anotherCounterBean</managed-bean-name>
    <managed-bean-class>my.backingbean.CounterBeanClass</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

现在您可以将两个计数器称为单独的 bean。

<h:form>
    <h:panelGrid columns="2">
        <h:outputText value="Counter 1" />
        <h:outputText value="#{counterBean.counter}" />
        <h:outputText value="Counter 2" />
        <h:outputText value="#{anotherCounterBean.counter}" />
        <h:commandButton value="Add Counter 1"
            action="#{counterBean.addCounterValue}" />
        <h:commandButton value="Add Counter 2"
            action="#{anotherCounterBean.addCounterValue}" />
    </h:panelGrid>
</h:form>

【讨论】:

    【解决方案3】:

    怎么样

    CounterBean cb1 = new CounterBean();
    CounterBean cb2 = new CounterBean();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 2011-05-31
      相关资源
      最近更新 更多