小ネタメモ
・インタセプタと継承
インターセプションの仕様を考えると、全てのコントローラの基底クラスを定義すべきですね。全てのコントローラに対して透過的に適用したい処理は、
public class BaseController extends Controller{
@Before
public static void before(){
System.out.println("ろぐろぐ);
}
}
と実装しておくと、という感じでこれ継承したクラスの全メソッドに対してインタセプタが走ると。アクセス毎に初期データとしてキャッシュする情報(ユーザ情報とか)を取得するのにはこういうやり方ができますね(実際やったし)。しかし継承って言ってもまともな継承じゃないよなぁ…これJavaかなぁww
public class ConcreteController extends BaseController{
public static void index(){
render();
}
}
・フラッシュスコープにエラーメッセージ入れると自画面遷移の場合はエラーが残ってしまう件
バリデーションエラー時にエラーメッセージを入れるためのスコープとしてflashスコープが推奨されており、flash.error(String)というメソッドでメッセージを入れられるのですが、flashはその名の通り次のリクエストまで有効なスコープです。なので例えば
という感じで、エラーになったら直接自画面に遷移するように実装し、全ての画面で
public static void hogeForm(@Required String param){
if(validation.hasError()){
flash.error("入力エラー");
render(param);
}
}みたいに実装しておくと、エラー後に別の画面を開くとエラーメッセージが残ってしまう…。そもそもrenderArgに共通的に値を入れるようにしたほうがよさそうなんだけど、そうしちゃまずい理由ってあるのかな?PRGパターンを考慮してるとは思うけど…。あれ、そもそもrenderArgってリクエストスコープ?となるとエラー情報をrenderArgにいれるとPRGパターンでだめなのか。PRGはplayでは多用しそうなのでたしかにflashのほうがよさそうだが…。そもそもエラーメッセージを引き継ぐインタセプタを書いたほうが良いのかな? と書いた所で今日はもう寝ますがw
<div id="error">
#{if flash.error}${flash.error}#{/if}
</div>