2011-01-19 5 views
0

私はstruts初心者です。私はFormActionjsp viewです。イベントのフォームのプロパティのstruts 1.xでビューを作成する方法

<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> 

一つ私がActionで行うCountryので最初の事はあるさ:私が使用してselect要素をレンダリングビューで

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

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

ActionForm#validateを追加していくつかの妥当性チェックを行うまでは正常に動作します(例:surname!= nullなどの国には関係ありません)。

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

私は、おそらくストラットのいくつかのコア概念が欠けていることを知っています。友人はビューでDAOを利用できるように提案したので、いつでも国を取得できますが、JSPコードが実行される前にビュー(プリフェッチDBデータ)を作成することをお勧めします。

アイデア?

答えて

0

はストラットをバイパスし、Formに自分のvalidateメソッドを追加することでした

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

は素晴らしい作品私の要求を満たしています。アクションは、ビュー、エラーまたは成功のページを表示する前に常に実行され、ビューを準備するコードを持ちます。

0

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

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

+0

validate()メソッドで読み込んでいる国を追加すると機能しますが、レイヤーとMVCにはっきりと違反しています。 – cherouvim

0

私の知る限り、検証が失敗した場合、コントロールはvalidateメソッドに実装されたActionErrorsを使って画面に戻ります。また、validateが呼び出される前に、フォームが入力されます。

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からそれを呼び出す:私はストラットvalidate問題を克服するためにやった

+0

はい、コントロールがJSPにディスパッチされる前に実行されるいくつかのJavaコード(できればアクション)が必要です。データベースから国リストを読み込むためには、これが必要です。 – cherouvim

+0

その場合、ロードを画面に表示してセッションキャッシュに保持する前のプロセスとして実行することをお勧めします。 – Sid

+0

私はそのような種類のデータをhttpセッションに格納することを好まない。私はそれが正しいとは思わない。 – cherouvim

0

実際にStruts 1に組み込まれているActionFormのresetメソッドが必要です。

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

@Override 
public void reset(ActionMapping mapping, HttpServletRequest request) { 
    request.setAttribute(SITES, siteDao.findAll()); 
    request.setAttribute(SERVICES, serviceDao.findAll()); 
} 
関連する問題