0

私はストラット初心者です。私は 、FormActionを持っていjsp viewます。

<form-beans>
    <form-bean name="bookEventForm" type="com.example.BookEventForm" />
</form-beans>

<action path="/bookEvent"
        type="com.example.BookEventAction"
        name="bookEventForm"
        input="/WEB-INF/jsp/bookEvent.jsp"
        scope="request">
    <forward name="success" path="/WEB-INF/jsp/bookEvent.jsp" />
</action>

イベント フォームのプロパティの 1 つCountryなので、最初に行うことActionは次のとおりです。

request.setAttribute("countries", countriesDao.getAll());

ビューで、次を使用して選択要素をレンダリングします。

<html:select property="..." >
    <html:optionsCollection name="countries" ... />
</html:select>

これは、 ActionForm#validateを追加していくつかの検証チェックを行うまでは正常に機能します (たとえば、姓 != null など、国とは関係ありません)。

struts 仕様では、エラーが発生するとすぐにAction#execute実行されません。したがって、countriesコレクションはリクエストに含まれなくなり、ビューは空の select 要素でレンダリングされます。

ストラットの核となる概念が欠けている可能性が高いことはわかっています。ビューで dao を使用できるようにすることを友人が提案したので、いつでも国をフェッチできますが、私は通常、JSP「コード」が実行される前にビューを準備する (db データをプリフェッチする) ことを好みます。

何か案は?

4

4 に答える 4

0

ストラットの問題を克服するために私がしたことは、ストラットvalidateをバイパスし、に独自のvalidateメソッドを追加することでしたForm:

public ActionErrors validate() {
    ActionErrors errors = new ActionErrors();
    if (...) errors.add("name", new ActionError("error.field.mandatory"));
    if (...) errors.add("surname", new ActionError("error.field.mandatory"));
    return errors;
}

そして、から呼び出しますAction

saveErrors(request, ((BookEventForm)form).validate());

うまく機能し、私の要件を満たしています。アクションは、ビュー、エラー、または成功ページを表示する前に常に実行され、ビューを準備するコードが含まれるようになりました。

于 2011-01-24T10:09:54.833 に答える
0

実際、Struts 1 には、必要なものを可能にするメカニズムが組み込まれています。それは、ActionForm の reset メソッドです。

フォームのフィールドをデフォルト値にリセットすることを目的としていますが、フォームに入力する前、つまり validate メソッドが呼び出される前に実行されるため、コレクションやその他のオブジェクトをセッションに保存するのにも適しています。

@Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
    request.setAttribute(SITES, siteDao.findAll());
    request.setAttribute(SERVICES, serviceDao.findAll());
}
于 2011-07-29T17:54:31.327 に答える
0

ここで説明されている事前入力方法を使用するのが最も簡単な方法だと思います。ただし、私はこのアプローチを個人的に使用したことはありません (セッション スコープのフォームを使用しました)。

別の方法として、国リストの設定をフォームの validate() メソッドに含めることもできます (ただし、これはちょっとしたハックです)。

于 2011-01-20T03:05:21.043 に答える
0

私の知る限り、検証が失敗した場合、検証メソッドに ActionErrors が入力された状態でコントロールが画面に戻ります。また、validate が呼び出される前に、フォームにデータが入力されます。

于 2011-01-20T03:09:10.980 に答える