使用ViewScope
ManagedBeans
构建JSF项目时遇到了问题。所以我决定将问题分离成一个简单的代码,显然问题仍然存在。
基本上我意识到类TesteMBean
中的属性完美地工作,但是,从超类GenericoMBean
继承的属性不保留其值。
我还是初学者,所以不知道这是否是JSF的正常行为。有人可以开导我这个吗?如果可能的话,告诉我如何通过一个例子做到这一点。非常感谢你。
遵循代码。
SuperClass:
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;
}
}
Inherited 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;
}
}
网络表单:
<!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
答案 0 :(得分:4)
刚刚将三个文件复制到我的工作区,“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
答案 1 :(得分:1)
<强>更新强>
现在我已经看到了你的问题,删除了我的旧答案。
h:form
周围不需要h:outputLabel
。只需在它们周围使用某种h:outputPanel
即可。actionListener
中使用h:commandButton
- 在这种情况下没问题,但您知道difference吗?此外,您可以删除action
属性中的括号。actionListener
中使用一些调试消息来帮助您找到问题。incrementar
内的h:outputLabel
。所以只是:
h:outputPanel
但是提供的代码不使用任何ajax功能。这意味着必须重新加载页面(浏览器中的刷新或 F5 )才能显示更改。这对于<h:outputPanel id="myOutputPanel">
... your h:outputLabels here ...
</h:outputPanel>
<h:form id="formIncremento">
<h:commandButton action="#{testeMBean.incrementar}" update=":myOutputPanel">
</h:form>
bean不适用,因为bean在页面刷新后被销毁并且之后立即创建。您应该在@ViewScoped
中使用<f:ajax...>
,或者尝试使用某些具有功能构建的框架,例如primefaces'h:commandButton
。
答案 2 :(得分:0)
您的抽象基类必须实现Serializable,以便在请求中传递属性。