2013-03-19 3 views
1

У меня были проблемы при создании проекта JSF с ViewScopeManagedBeans. Поэтому я решил изолировать проблему до простого кода, где, очевидно, проблема сохраняется. В основном я понял, что свойства, которые находятся в классе 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; 
    } 
} 

Веб-форма:

<!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

Я забыл опубликовать «аннотация» в суперклассе. Исправлено сейчас. –

ответ

1

Update
Удалены мой старый ответ теперь, когда я вижу вашу проблему.

  1. Вам не нужно h:form вокруг вашего h:outputLabel s. Просто используйте какой-то h:outputPanel вокруг них, этого достаточно.
  2. Вы используете actionListener в своем h:commandButton вместо action - все в порядке, но знаете ли вы, что difference? Кроме того, вы можете удалить скобки внутри атрибута actionListener.
  3. После этого попробуйте использовать некоторые отладочные сообщения в incrementar, чтобы помочь вам найти проблему.
  4. Если вы используете функциональность ajax, вам нужно обновить h:outputLabel s внутри вашего недавно созданного h:outputPanel.

Так просто:

<h:outputPanel id="myOutputPanel"> 
    ... your h:outputLabels here ... 
</h:outputPanel> 

<h:form id="formIncremento"> 
    <h:commandButton action="#{testeMBean.incrementar}" update=":myOutputPanel"> 
</h:form> 

Но код при условии не использует функциональные возможности AJAX. Это означает, что страница должна быть перезагружена (обновить или F5 в вашем браузере), чтобы отобразить изменения. Это не будет хорошо работать с bean-компонентом @ViewScoped, так как bean-файл будет уничтожен после обновления страницы и будет создан сразу после этого. либо вы должны использовать <f:ajax...> в своем h:commandButton или попытаться использовать некоторую фреймворк, который имеет функциональность buildin, например, primefaces 'p:commandButton.

+0

Спасибо за ответ, но у меня все еще есть некоторые вопросы. Я не мог заставить его работать, применяя их пример. Я попытался поместить @ManagedProperty над переменной в baseclass, а затем над новой созданной частной переменной с тем же именем в производном классе, используя «# {testMBean.textoBase}» или «# genericoTesteMBean.textoBase» »и все еще не сохраняя значение. Что я могу сделать сейчас? –

+0

Я добавил дополнительную информацию, не знаю, что-то изменится. Большое спасибо –

+0

@RonneeryTeles Я обновил свой ответ, увидев больше вашего кода – Manuel

3

Просто скопировал три файла в мое рабочее пространство, и «incrementar» работает отлично.

Единственная разница в управляемой фасоли, у вас есть этот импорт для @ManagedBean аннотации

import javax.annotation.ManagedBean; 

изменить его к

import javax.faces.bean.ManagedBean; 

Вы можете прочитать это для понятий Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean

+0

Спасибо. Мне действительно нужно прочитать достаточно, чтобы понять эти различия. Я делаю изменение в аннотации для javax.faces.bean.ManagedBean, и даже тогда «A» не увеличивает «AAAAA ...». В ваших тестах это случилось? Что еще может вызвать этот эффект здесь? –

+0

Помимо этого импорт все было таким же и работало так, как было разработано. Я бы предложил использовать точки отладки в incremantar и методах абстрактного класса. Попробуйте использовать последние jars для jsf, и, если возможно, используйте maven и начните с архетипа jsf –

0

Ваш абстрактный базовый класс должен реализовать Serializable, чтобы свойства передавались в запросах.