0

私にはゲームと開発者がいます。ゲームには一連の開発者がいます。データベースにゲームを追加できるフォームを作成したいと考えています。フォームに名前、価格を入力し、開発者を確認します。だから私はすべての開発者にチェックボックスを作成します。ただし、それらを確認すると、ページが更新されたようです。デバッグすると、コントローラーが doSubmitAction 関数に到達しないようです。チェックボックスを外すと、すべてが想定どおりに機能します。春はコレクションを作成できませんか? Spring の舞台裏で何が起こっているのか、私は完全には理解していません。これは、Spring を使用して作成する最初のプロジェクトです。

ここに私のフォームがあります:

 <form:form method="POST" commandName="game" >
                    <table>
                        <tr>
                            <td>
                                Name
                            </td>
                            <td>
                                <form:input path="gameNaam" size="20" />
                            </td>
                        </tr>

                        <tr>
                            <td>Choose Developers</td>
                            <td>
                                <form:checkboxes id="selectdeveloper" items="${developers}" path="developers" itemLabel="naam" />

                            </td>
                        </tr>
                        <tr>
                            <td>
                               Price
                            </td>
                            <td>
                                <form:input path="prijs" size="10" />
                            </td>
                        </tr>
                        <tr>
                            <td>

                                <input type="submit" value="Add" />

                            </td>
                            <td></td>
                        </tr>

                    </table>
                </form:form>

そしてformController:

public class GameFormController extends SimpleFormController {

    private GameOrganizer gameOrganizer;

    public GameFormController() {
       setCommandClass(Game.class);
       setCommandName("game");
       setFormView("AddGame");
       setSuccessView("forward:/Gamedatabase.htm");
   }

    public void setGameOrganizer(GameOrganizer gameOrganizer){
       this.gameOrganizer=gameOrganizer;
    }

    @Override
    protected Object formBackingObject(HttpServletRequest request) throws Exception {
       Game game = null;
       long id = ServletRequestUtils.getLongParameter(request, "id");
       if(id<=0){
           game = new Game();
       }else{
           game = gameOrganizer.getGame(id);
       }
       return game;
    }



    @Override
    protected void doSubmitAction(Object command) throws Exception {

        Game game = (Game) command;
        if(game.getId()<=0){
            gameOrganizer.addGame(game);
        }else{
           gameOrganizer.update(game);

       }

   }

   @Override
   protected Map referenceData(HttpServletRequest request) throws Exception {
       Set<Developer> developers = gameOrganizer.getAllDevelopers();
       HashMap<String, Object> map = new HashMap<String, Object>();
      map.put("developers", developers);
      return map;
   }


}
4

1 に答える 1

1

どうやら、Developer 用に propertyEditor を作成する必要がありました。このサイトに適切な説明があります:

http://static.springsource.org/spring/docs/2.0.x/reference/validation.html

追加情報を編集:

したがって、チェックボックスをオンにすると、値が文字列として表示されるようです。もちろん、コレクションは開発者オブジェクトで作成する必要がありました。

だから私はdeveloperEditorを作成しました:

package domainmodel;

import java.beans.PropertyEditorSupport;

public class DeveloperEditor extends PropertyEditorSupport {

    private GameOrganizer gameOrganizer;


    public void setGameOrganizer(GameOrganizer gameOrganizer) {
        this.gameOrganizer = gameOrganizer;
    }

    @Override
    public void setAsText(String id) {
        long id2 = Long.parseLong(id);
        Developer type = gameOrganizer.getDeveloper(id2);
        setValue(type);
    }
}

そして、アイテム値としてオブジェクトのIDを指定したチェックボックスを使用して

<form:checkboxes id="selectdeveloper" items="${allDevelopers}" itemValue="id" path="developers" itemLabel="name" />

次に、formcontroller で initBinder メソッドをオーバーライドします。そのため、Spring が開発者オブジェクトを入力する必要がある場合、最初にエディターを使用してそれを文字列から開発者オブジェクトに変換します。

 private DeveloperEditor developerEditor;

 public void setDeveloperEditor(DeveloperEditor developerEditor){
    this.developerEditor = developerEditor;
    developerEditor.setGameOrganizer(gameOrganizer);
}

 @Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
    binder.registerCustomEditor(Developer.class, developerEditor);
}

それだけです。ご不明な点がございましたら、喜んでお答えいたします。

于 2012-05-07T08:34:22.163 に答える