0


0

春のフォームが送信されない

私はフォームにSpring SimpleFormControllerを使用していますが、何らかの理由でonSubmitメソッドに行きません

これが私のコードです:

public class CreateProjectController extends SimpleFormController {

ProjectDao projectDao;

public CreateProjectController() {
    setCommandClass(Project.class);
    setCommandName("Project");
    setSessionForm(true);
}
@Override
protected Object formBackingObject(HttpServletRequest request)
        throws Exception {
    String id = request.getParameter("id");
    Project project = projectDao.getProjectByOutsideId(id);
    System.out.println("@formbacking object method");
    System.out.println("the success view is "+getSuccessView());
    return project;
}
@Override
protected ModelAndView onSubmit(Object command) throws Exception {
    Project project = (Project) command;
    System.out.println("this is the project title: "+project.getTitle());
    System.out.println("the success view is "+getSuccessView());
    projectDao.insert(project);

    return new ModelAndView(getSuccessView());
}

「@formbacking object method」という文字列を出力しますが、「成功ビューは…​」という文字列と:「this is the pr …​」という文字列は出力しないためです。 コンソールに「@formback ..」という文字列が表示されますが、送信するたびに最後の2つは表示されません。 問題がどこにあるのかわかりません。

これは私のJSPです

Name:

Description:

Link:

Tags:

Assessors

私はGoogle App Engineで実行しています。 たぶん問題はありますか?

更新:問題はformBackingObjectメソッドにあるようです。 削除すると、フォームは[送信]をクリックするとonSubmitに移動します。

しかし、フォームのデータベースのコマンドクラスの値が必要です。

動作しない別のコード:

    @Override
protected Object formBackingObject(HttpServletRequest request)
        throws Exception {
    String id = request.getParameter("id");
    Project projectFromConsumer = projectDao.getProjectByOutsideId(id);
    Project project = new Project();
    String title = projectFromConsumer.getTitle();
    project.setTitle(title);
    project.setUrl("projectUrl");
    return project;
}

しかし、これはうまくいきます:

    @Override
protected Object formBackingObject(HttpServletRequest request)
        throws Exception {
    String id = request.getParameter("id");
    Project projectFromConsumer = projectDao.getProjectByOutsideId(id);
    Project project = new Project();
    String title = projectFromConsumer.getTitle();
    project.setTitle("projectTitle");
    project.setUrl("projectUrl");
    return project;
}

今、私は本当に混乱しています。 笑

3 Answer


1


私はaxtavtと同じ線に沿って考えていました。 更新時にidリクエストパラメータのみを使用するため、作成フォーム用のコードを追加する必要があります。

参考までに、formBackingObjectではnull以外のオブジェクトを返す必要があります。 メモリを節約するために、デフォルトの戻り値である最終的な定数メンバー変数を持つことができます。 ただし、オブジェクトを転送しているので、コードはこれを満たしますが、DTOを使用していないときにデータを転送する(余分なオブジェクトを作成する)理由がわかりません。 あなたは単にこれを行うことができます:

private final static Project PROJECT_INSTANCE = new Project();
static {
    PROJECT_INSTANCE.setTitle("defaultProjectTitle");
}

@Override
protected Project formBackingObject(HttpServletRequest request) throws Exception {
    String id = request.getParameter("id");
    if(id == null || id.trim().length() == 0 || !id.matches("\\d+")) {
       return PROJECT_INSTANCE;
    }
    return projectDao.getProjectByOutsideId(id);
}

非表示のID入力フィールドは必要ありません。 (page.jsp?id = 111に移動して)更新のためにフォーム入力フィールドを初期化するために `formBackingObject()`を使用します。


0


`String id = request.getParameter(" id ");`を見てください。 フォームにはそのようなフィールドがないため、送信プロセス中にエラーが発生する可能性があります。「getProjectByOutsideId」は「null」を返します。

P.S. submitを押したときに formBackingObject`が実行されているのは奇妙ですが、実際に setSessionForm(true) `を設定した場合はそうではありません。


0


春のデバッグを有効にしてみてください。 それは多くの情報を提供し、それは役に立つかもしれません。 これを行うには、log4j.propertiesファイルを編集します。

log4j.logger.org.springframework=DEBUG

formBackingObjectが何かを返すようにロギングを追加しましたか?

System.out.println("@formbacking object method is returning: " + project);

何かが返されていることを確認します。 一般に、formBackingObjectは常に何かを返す必要があります。

編集:

Idはスニペットでの送信中に渡されません。 たぶん、ロード中です。 /page.do?id=4ですが、フォームには表示されません。

送信中にフォームに ``を追加します。 それ以外の場合、IDはパラメーターにならず、getProjectByOutsideIdは失敗します。