2017-09-14 27 views
0

Apache Wicketに関する質問:私はいくつかのテキスト入力フィールドを含むフォームを持っています。 DateTextFieldを追加するまでうまく動作します。オーバーライドされたonSubmit()メソッドは単に呼び出されません。私はWicketの例を見ましたが、私のコードと大きな違いはありません。私はブラウザに表示されるHTMLを見ていたDateTimeFieldが存在する場合、フォームのonSubmitメソッドが呼び出されないのはなぜですか?

package it.foo; 

import java.util.Locale; 

import org.apache.wicket.Session; 
import org.apache.wicket.datetime.StyleDateConverter; 
import org.apache.wicket.datetime.markup.html.form.DateTextField; 
import org.apache.wicket.markup.html.form.Button; 
import org.apache.wicket.markup.html.form.Form; 
import org.apache.wicket.markup.html.form.TextField; 
import org.apache.wicket.model.CompoundPropertyModel; 
import org.apache.wicket.spring.injection.annot.SpringBean; 
import org.joda.time.DateTime; 

public class CreateStudentForm extends Form<Student> { 

private static final long serialVersionUID = 1L; 

private String lastName; 
private String firstName; 
private DateTime dateOfBirth; 

@SpringBean 
StudentDao studentDao; 

public CreateStudentForm(String id) { 
    super(id); 
    setDefaultModel(new CompoundPropertyModel<>(this)); 
    add(new TextField<String>("lastName")); 
    add(new TextField<String>("firstName")); 

    final DateTextField dateOfBirthField = new DateTextField("dateOfBirth", new StyleDateConverter("S-", true)) { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Locale getLocale() { 
      return Session.get().getLocale(); 
     } 
    }; 

    dateOfBirthField.setType(DateTime.class); 
    add(dateOfBirthField); 

} 

@Override 
protected void onSubmit() { 
    // does not get called as soon as the DateTextField is present. Works fine otherwise. 
    Student student = new Student(this.lastName, this.firstName, this.dateOfBirth); 
    studentDao.store(student); 
    setResponsePage(StudentsPage.class); 
} 

} 

<html xmlns:wicket="http://wicket.apache.org"> 
 
\t <head> 
 
\t \t <title>Students</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <div class="container"> 
 
\t \t \t <form id="createStudent" wicket:id="createStudent"> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="lastNameLabel"><wicket:message key="lastNameLabel" /></span> 
 
\t \t \t \t \t <input id="lastName" wicket:id="lastName" type="text" /> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="firstNameLabel"><wicket:message key="firstNameLabel" /></span> 
 
\t \t \t \t \t <input id="firstName" wicket:id="firstName" type="text" /> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="dateOfBirthLabel"><wicket:message key="dateOfBirthLabel" /></span> 
 
\t \t \t \t \t <input id="dateOfBirth" wicket:id="dateOfBirth" type="text" /> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <input id="submit" type="submit" value="" wicket:message="value:submitLabel"/> 
 
\t \t \t \t </div> 
 
\t \t \t </form> 
 
\t \t </div> 
 
\t </body> 
 
</html>

対応するJavaファイル:ここで

はhtmlコードです。 dateTextFieldが存在しない場合、それは次のようになりますとすぐdateTextFieldが存在しているよう

<html> 
 
\t <head> 
 
\t \t <title>Students</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <div class="container"> 
 
\t \t \t <form id="createStudent" method="post" action="./?2-1.IFormSubmitListener-createStudent"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="createStudent_hf_0" id="createStudent_hf_0" /></div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="lastNameLabel">Nachname: </span> 
 
\t \t \t \t \t <input id="lastName" type="text" value="" name="lastName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="firstNameLabel">Vorname:</span> 
 
\t \t \t \t \t <input id="firstName" type="text" value="" name="firstName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <!-- <div> 
 
\t \t \t \t \t <span id="dateOfBirthLabel"><wicket:message key="dateOfBirthLabel" /></span> 
 
\t \t \t \t \t <input id="dateOfBirth" wicket:id="dateOfBirth" type="text" /> 
 
\t \t \t \t </div> --> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <input id="submit" type="submit" value="Schüler anlegen"/> 
 
\t \t \t \t </div> 
 
\t \t \t </form> 
 
\t \t </div> 
 
\t </body> 
 
</html>

、フォームにはJavaScript呼び出しで追加の部門を持っています。

<html> 
 
\t <head> 
 
\t \t <title>Students</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <div class="container"> 
 
\t \t \t <form id="createStudent" method="post" action="./?6-7.IFormSubmitListener-createStudent"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="createStudent_hf_0" id="createStudent_hf_0" /></div><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="text" tabindex="-1" autocomplete="off"/><input type="submit" tabindex="-1" name="p::submit" onclick=" var b=document.getElementById('submit'); if (b!=null&amp;&amp;b.onclick!=null&amp;&amp;typeof(b.onclick) != 'undefined') { var r = Wicket.bind(b.onclick, b)(); if (r != false) b.click(); } else { b.click(); }; return false;" /></div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="lastNameLabel">Nachname: </span> 
 
\t \t \t \t \t <input id="lastName" type="text" value="Matthias" name="lastName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="firstNameLabel">Vorname:</span> 
 
\t \t \t \t \t <input id="firstName" type="text" value="Tonhäuser" name="firstName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="dateOfBirthLabel">Geburtsdatum: </span> 
 
\t \t \t \t \t <input id="dateOfBirth" type="text" value="06.09.17" name="dateOfBirth"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <input id="submit" type="submit" value="Schüler anlegen" name="p::submit"/> 
 
\t \t \t \t </div> 
 
\t \t \t </form> 
 
\t \t </div> 
 
\t </body> 
 
</html>

追加部門が突然外れすべてがありますなぜ私はかなり理解していません。私の推測では、JavaScript呼び出しは機能しません。

ありがとうございました。

+1

.. onError(...)メソッドをオーバーライドして起こっていただきました見ることができますか? – soorapadman

+0

検証の成功後、Wicket onSubmitが呼び出されます。あなたはonErrorをチェックすることができます、多分いくつかの問題が存在します –

答えて

1

onSubmit()メソッドは、dateFieldの値が正しく検証されていない可能性があります。ページにfeedback panelを追加して確認する必要があります。

+0

あなたは正しいです。フィードバックパネルを追加し、入力された値がDateTime.classのフォーマットが間違っているというエラーメッセージが表示されました。だから私の間違いは、DateTextFieldに間違ったクラスを設定することでした。それは:_dateOfBirthField.setType(Date.class); _ – ScarOnTheSky

1

あなたは `フィードバックpanel`を追加して起こっていただきました!それはあなたにいくつかのアイデアを与えるだろう提出することができます

+0

でなければなりません。フォームをsubmitするのではなく 'ajax submit'なのでメソッドをオーバーライドしなくても動作します。私は、フィードバックパネルが存在しないので、表示されないトラブルを引き起こす日付コンポーネントの問題がなければならないと考えています – soorapadman

関連する問題