2016-08-24 39 views
1

我想要的变量变化的值传递给bean方法:通变值从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.subjectg.mark变化传递给gradesBean.edit(g)。当我尝试以某种方式做到这一点时,就会传递两个变量的原始值的相同值。有在各自的对象getter和setter方法

@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就已经呼吁支持bean类对应的制定者(我认为公众制定者getMark()和getSubject()存在) 。

由于行动=“#{gradesBean.edit(克)}”在服务器(当页面被首先显示)解决,将具有原始值,而不是改变的值。无论如何,要查看更改的值,可以使用ajax(f:ajax标记,并且应该设置相应的侦听器属性)。但你不必这样做。只需将您的处理程序更改为 action =“#{grades grades.edit()}”//无参数 并从您的bean类实例中获取最新值。

如果你愿意,我可以更具体。

+0

你好,谢谢,这听起来似乎合理。但不知何故,如果我将编辑方法更改为action =“#{gradesBean.edit()}”而不带参数,则对于gradesBean.grade,Object gradesBean将保留null值。是的,如果你可以更多地解释它与f:ajax组件的相似之处,那就太好了! – Noli

+1

是的,您必须手动创建一个Grade对象(如果它没有注释为托管属性),并且JSF框架应该完成剩下的工作。如果你仍然有问题,然后张贴你的成绩豆类。 –

+0

谢谢你的帮助!我发布了代码。 save方法可以正常工作,并且不会创建任何Grade对象。我删除了javadoc,因为它在德语:) – Noli