使用ViewScope ManagedBeans构建JSF项目时遇到问题。因此,我决定将问题隔离为一个简单的代码,显然该问题仍然存在。
基本上,我意识到类TesteMBean中的属性可以正常工作,但是,从超类GenericoMBean继承的属性不能保留其值。

我仍然是它的初学者,所以不知道这是否是JSF的正常行为。有人可以启发我吗?并通过一个示例告诉我如何正确进行操作。非常感谢你。

遵循代码。

超类:

package br.com.telesnet.sige.web.mb;


public abstract class GenericoTesteMBean {

    protected String textoBase;

    public java.lang.String getTextoBase() {
        if (this.textoBase == null){
            return "";
        }else{
            return textoBase;
        }
    }

    public void setTextoBase(String textoBase) {
        this.textoBase = textoBase;
    }
}


继承的ManagedBean:

package br.com.telesnet.sige.web.testes;

import java.io.Serializable;

import javax.annotation.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.telesnet.sige.web.mb.GenericoTesteMBean;

@ManagedBean
@ViewScoped
public class TesteMBean extends GenericoTesteMBean implements Serializable{
    private static final long serialVersionUID = 1L;
    private java.lang.Integer valor;
    private java.lang.String texto;

    public TesteMBean(){
        this.setValor(0);
    }

    public void incrementar(){
        this.setValor(this.getValor()+1);
        this.texto = this.getTexto() + "X";
        this.textoBase = this.getTextoBase() + "A";
    }

    public java.lang.Integer getValor() {
        if (this.valor == null){
            return 0;
        }else{
            return valor;
        }
    }

    public void setValor(java.lang.Integer valor) {
        this.valor = valor;
    }

    public java.lang.String getTexto() {
        if (this.texto == null){
            return "";
        }else{
            return texto;
        }
    }

    public void setTexto(java.lang.String texto) {
        this.texto = texto;
    }
}


Web表单:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<h:body>
    <f:view>
        <h:form id="formLabel">
            <h:outputLabel value="Valor:"></h:outputLabel>
            <h:outputLabel value="#{testeMBean.valor}"></h:outputLabel>

            <h:outputLabel value="Texto:"></h:outputLabel>
            <h:outputLabel value="#{testeMBean.texto}"></h:outputLabel>

            <h:outputLabel value="TextoBase:"></h:outputLabel>
            <h:outputLabel value="#{testeMBean.textoBase}"></h:outputLabel>

        </h:form>

        <h:form id="formIncremento">
            <h:commandButton actionListener="#{testeMBean.incrementar()}" value="incrementar">
            </h:commandButton>

        </h:form>


    </f:view>
</h:body>
</html>


不需要的输出(按钮“ incrementar”单击了五次):

    Valor: 5 Texto: XXXXX TextoBase: A


所需的输出(单击“ incrementar”按钮五次):

    Valor: 5 Texto: XXXXX TextoBase: AAAAA

最佳答案

只需将您的三个文件复制到我的工作区中,“ incrementar”就可以完美工作。

唯一的区别是在托管bean上,您可以导入@ManagedBean批注

import javax.annotation.ManagedBean;


更改为

import javax.faces.bean.ManagedBean;


您可以阅读有关Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean概念的内容

09-04 22:25