2016-08-24 4 views
1

へのinputTextから値を変更:パスは私がBeanメソッドに変数の変更された値を渡すようにしようとしている豆

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

私はg.subjectg.markに、彼はのinputTextでないユーザの変更をしたいです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、すでにあなたのバッキングBeanクラスに対応するセッターを呼び出しますg.subject(私は公共のセッターはのgetMark()とgetSubject()が存在すると仮定)があります。

アクションは=「#{gradesBean.edit(G)}」が(ページが最初に表示されている)サーバで解決されるので、元の値ではなく、変更された値を有することになります。とにかく、変更された値を見るには、ajax(f:ajaxタグとそれに対応するリスナー属性を設定する必要があります)を使用できます。しかし、あなたはこれをする必要はありません。単にハンドラーを action = "#{gradesBean.edit()}" // という引数に変更し、Beanクラスインスタンスから最新の値を取得してください。

必要に応じて、より具体的にすることができます。

+0

こんにちは、ありがとうございます。しかし、どういうわけか、パラメータを指定せずにedit-methodをaction = "#{gradesBean.edit()}"に変更すると、オブジェクトgradesBeanはgradesBean.gradeにnull値を保持します。はい、f:ajax-componentを使ってどのように見えるかを少し説明すれば、それは素晴らしいでしょう! – Noli

+1

はい、Gradeオブジェクトを手動で作成する必要があります(管理プロパティとして注釈が付けられていない場合)。JSFフレームワークで残りの作業を行う必要があります。それでも問題が解決しない場合は、gradesBeanクラスを投稿してください。 –

+0

お手数ですが助けてください!私はコードを投稿した。 saveメソッドは正常に動作し、Gradeオブジェクトは作成されません。私はそれがドイツ語のjavadoc原因を切り捨てました:) – Noli

関連する問題