2016-08-24 4 views
1

Я пытаюсь передать измененное значение переменного метода боба:Pass изменил значение от inputText к фасоли

<h:panelGroup rendered="#{! empty gradesBean.getAllGrades()}"> 
       <h:dataTable value="#{gradesBean.getAllGrades()}" var="g"> 
        <h:column> 
         <f:facet name="header">#{msg['outputSubject']}</f:facet> 
         <h:inputText value="#{g.subject}" onchange="#{g.subject}" /> 
        </h:column> 
        <h:column> 
         <f:facet name="header">#{msg['outputGrade']}</f:facet> 
         <h:inputText value="#{g.mark}" onchange="#{g.mark}"/> 
        </h:column> 
        <h:column> 
         <h:form> 
          <h:commandButton value="#{msg['actionSave']}" action="#{gradesBean.edit(g)}" /> 
         </h:form> 
        </h:column> 
       </h:dataTable> 
(.........) 
</h:panelGroup> 

Я хочу изменения этого пользователя, что он делает в inputText на g.subject и g.mark для передачи gradesBean.edit(g). Когда я пытаюсь это сделать, как-то передаются те же значения исходных значений обеих переменных. Есть методы получения и установки в соответствующем объекте

@Named 
@ViewScoped 
public class GradesBean extends AbstractBean implements Serializable { 

    private static final long serialVersionUID = 320401008216711886L; 

    private static final String NO_GRADES_PRESENT = "keine Noten  eingetragen"; 

    private static final Logger loggerLogger.getLogger(GradesBean.class); 

    @Inject 
    private transient GradeDAO gradeDAO; 

    @Inject 
    private UserDAO userDAO; 

    private Grade grade; 

    private List<Grade> allGrades; 

    @PostConstruct 
    public void init() { 
     if (!isLoggedIn()) { 
      return; 
     } 
     grade = new Grade(); 
     allGrades = getSession().getUser().getGrades(); 
    } 

    public Grade getGrade() { 
     return grade; 
    } 

    public List<Grade> getAllGrades() { 
     return allGrades; 
    } 

    public String getGradeAverage() { 
     final List<BigDecimal> theDecimals = new ArrayList<>(allGrades.size()); 
     for (final Grade g : allGrades) { 
      theDecimals.add(g.getMark()); 
     } 
     final Configuration config = Configuration.getDefault(); 
     final int scale = config.getScale(); 
     final RoundingMode roundingMode = config.getRoundingMode(); 
     try { 
      final BigDecimal average = de.unibremen.st.gradelog.businesslogic.Math 
       .average(theDecimals, scale, roundingMode); 
     return average.stripTrailingZeros().toPlainString(); 
     } catch (final ArithmeticException e) { 
      logger.debug(
       "Calculation of grade average has been called without any grades.", e); 
     return NO_GRADES_PRESENT; 
     } 
    } 

    public String getGradeMedian() { 
     final List<BigDecimal> theDecimals = new ArrayList<>(allGrades.size()); 
     for (final Grade g : allGrades) { 
      theDecimals.add(g.getMark()); 
     } 
     try { 
      final BigDecimal median = de.unibremen.st.gradelog.businesslogic.Math 
       .median(theDecimals); 
     return median.stripTrailingZeros().toPlainString(); 
     } catch (final ArithmeticException e) { 
     logger.debug(
       "Calculation of grades median has been called without any grades.", e); 
      return NO_GRADES_PRESENT; 
     } 
    } 

    public String save() { 
     if (!isLoggedIn()) { 
      return null; 
     } 
     final User user = getSession().getUser(); 
     grade.setUser(user); 
     user.addGrade(grade); 
     gradeDAO.save(grade); 
     try { 
      userDAO.update(user); 
     } catch (final DuplicateUniqueFieldException e) { 
      throw new UnexpectedUniqueViolationException(e); 
     } 
     init(); 
     return null; 
    } 

    public String edit() { 
     if (!isLoggedIn()) { 
      return null; 
     } 
     assertNotNull(grade); 
     final User user = getSession().getUser(); 
     gradeDAO.update(grade); 
     try { 
      userDAO.update(user); 
     } catch (final DuplicateUniqueFieldException e) { 
      throw new UnexpectedUniqueViolationException(e); 
     } 
     init(); 
     return null; 
    } 

    public String remove(final Grade theGrade) { 
     if (!isLoggedIn()) { 
      return null; 
     } 
     assertNotNull(theGrade); 
     final User user = getSession().getUser(); 
     user.removeGrade(theGrade); 
     gradeDAO.remove(theGrade); 
     try { 
      userDAO.update(user); 
     } catch (final DuplicateUniqueFieldException e) { 
      throw new UnexpectedUniqueViolationException(e); 
     } 
     init(); 
     return null; 
    } 

}` 
+0

Также вы можете добавить свой код для этих методов: 'getAllGrades()' и 'edit()' – tfosra

ответ

1

g.mark и g.subject уже называют соответствующие сеттеров на вашем бэк-классе фасоли (я предполагаю, что публичные сеттеры getMark() и getSubject() существуют) ,

Поскольку действие = «# {gradesBean.edit (г)}» разрешен на сервере (когда страница отображается первым), он будет иметь исходные значения, а не измененные значения. В любом случае, чтобы увидеть измененные значения, вы можете использовать ajax (тег f: ajax и соответствующий атрибут прослушивателя). Но вам не обязательно это делать. Просто измените обработчик на action = "# {gradesBean.edit()}" // no аргумент и получите последние значения из экземпляра класса компонента.

Я мог бы быть более конкретным, если вы хотите.

+0

Привет, спасибо, это звучит правдоподобно. Но каким-то образом, если я изменю edit-method на action = "# {gradesBean.edit()}" без параметра, Object gradesBean содержит нулевое значение на gradesBean.grade. Да, если бы вы могли объяснить это немного больше, как это выглядело бы с помощью f: ajax-component, это было бы неплохо! – Noli

+1

Да, вы должны создать объект класса вручную (если он не аннотируется как управляемое свойство), а JSF Framework должен сделать все остальное. Если у вас все еще есть проблемы, отправьте класс gradesBean. –

+0

Спасибо вам за помощь! Я отправил код. Метод save работает правильно и не создает объектов класса. Я вырезал javadoc, потому что это на немецком языке :) – Noli