Struts2:在迭代器

时间:2017-05-16 16:00:13

标签: jsp struts2

我在尝试更新某些数据时遇到了一些麻烦,我遇到了一些例外......

我读了Struts 2 nesting iterators并应用了修改,但它不起作用......

这是Java类:

 public class Epreuveevb implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int idEpreuve;
    private String nom;
    private int coef;
    private int note;
    private int idExamen;

/* all setters and getters */

然后第二个:

public class Examenevb implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int idJury;
    private String nom;
    private String prenom;
    private List<Epreuveevb> listeEpreuves = null;

/* all setters and getters */

最后,这是最高级的(使用servlet):

    public class Saisie extends ActionSupport {

        static final Logger log = LogManager.getLogger(Saisie.class);

        private int idJury;
        private Jury leJury;
        private List<Examenevb> lesExamens;

[...]

        public List<Examenevb> getLesExamens() {
            return lesExamens;
        }
        public void setLesExamens(List<Examenevb> lesExamens) {
            this.lesExamens = lesExamens;
        }

现在JSP:

            <s:form theme="simple" action="relevernote">
        <table class="notation">
            <tbody>
                <s:iterator value="lesExamens" status="examstat">
                <tr>
                    <td class="default"><span class="gras">${nom}</span>, ${prenom}</td>
                    <s:iterator value="listeEpreuves" status="eprstat">
                    <td>
                        ${nom}<br/>
                        <s:textfield name="lesExamens[%{#examstat.index}].listeEpreuves[%{#eprstat.index}].note"/>
                        <p>&nbsp;</p>
                    </td>
                    </s:iterator>
                </tr>
                </s:iterator>
            </tbody>
        </table>
        <p>&nbsp;</p>
        <p class="center"><s:submit value="Valider"/></p>
        </s:form>

一切正常,所有标记在文本字段中都正确。例如,这是最终的HTML页面:

        <td class="default"><span class="gras">EL MORABIT</span>, MOHAMED</td>

                <td>
                    Maths<br/>
                    <input type="text" name="lesExamens[0].listeEpreuves[0].note" value="0" id="relevernote_lesExamens_0__listeEpreuves_0__note"/>
                    <p>&nbsp;</p>
                </td>

但提交时,我会在日志中看到:

    2017-05-16 17:29:44,910 ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor [notifyDeveloperParameterException] Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'lesExamens[0].listeEpreuves[0].note' on 'class evb.pg.notation.Saisie: Error setting expression 'lesExamens[0].listeEpreuves[0].note' with value ['0', ]
2017-05-16 17:29:44,914 ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor [notifyDeveloperParameterException] Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'lesExamens[0].listeEpreuves[1].note' on 'class evb.pg.notation.Saisie: Error setting expression 'lesExamens[0].listeEpreuves[1].note' with value ['0', ]

出了什么问题?有什么想法吗?

我多次检查过setter / getters,一切都很好......

1 个答案:

答案 0 :(得分:0)

我刚刚解决了问题,现在一切都好了。但我希望被告知可能存在更好的解决方案。如果有,请告诉我。

让我告诉你我带来了哪些修改。

首先,我忘记了Epreuveevb和Examenevb类的空构造函数。

其次,我向ActionSupport类添加了Preparable和ModelDriven接口:

public class Saisie extends ActionSupport implements Preparable,    
    ModelDriven<List<Examenevb>> {

        static final Logger log = LogManager.getLogger(Saisie.class);

        private int idJury;
        private Jury leJury;
        private List<Examenevb> lesExamens;
        private int idPassageGrade;

这些接口迫使我采用两种额外的方法:

@Override
    public List<Examenevb> getModel() {
        // TODO Auto-generated method stub
        return lesExamens;
    }

    @Override
    public void prepare() throws Exception {
        // TODO Auto-generated method stub
    }

最后,JSP变得更重了一些:

    <s:form theme="simple" action="relevernote">
    <table class="notation">
        <tbody>
            <s:iterator value="lesExamens" status="idexam">
            <tr>
                <td class="default">
                    <span class="gras">${nom}</span>, ${prenom}
                    <s:hidden name="lesExamens[%{#idexam.index}].idJury"/>
                    <s:hidden name="lesExamens[%{#idexam.index}].idAdherent"/>"
                    <s:hidden name="lesExamens[%{#idexam.index}].nom"/>
                    <s:hidden name="lesExamens[%{#idexam.index}].prenom"/>

                </td>
                <s:iterator value="listeEpreuves" status="idepr">
                <td>
                    ${nom}<br/>
                    <s:hidden name="lesExamens[%{#idexam.index}].listeEpreuves[%{#idepr.index}].idEpreuve"/>
                    <s:hidden name="lesExamens[%{#idexam.index}].listeEpreuves[%{#idepr.index}].idExamen"/>
                    <s:hidden name="lesExamens[%{#idexam.index}].listeEpreuves[%{#idepr.index}].coef"/>
                    <s:hidden name="lesExamens[%{#idexam.index}].listeEpreuves[%{#idepr.index}].nom"/>
                    <s:textfield name="lesExamens[%{#idexam.index}].listeEpreuves[%{#idepr.index}].note"/>
                    <p>&nbsp;</p>
                </td>
                </s:iterator>
            </tr>
            </s:iterator>
        </tbody>
    </table>
    <p class="center"><s:submit value="Valider"/></p>
    </s:form>

为了确保设置所有属性,我添加了几个标签......也许有更好的方法。如果是的话,请告诉我。