JSP ファイルを完全に再設計すれば、ビューにタイプ セーフを追加できる可能性があります (私自身がそう言うかもしれませんが、非常に醜い方法です)。
サーブレットは Java コードであるため、型の安全性を提供します。クラスをリファクタリングして何かを見逃した場合、コンパイラはすぐにそれを見逃したことを通知します。しかし、JSP は、はるかに動的で迅速な開発ペースを提供するビュー テクノロジとしてサーブレットに取って代わります (out.write
タグを開く、タグを閉じる、引用符をエスケープするなどの無限の命令はもう必要ありません)。
お気づきのように、EL 式は基本的に文字列であり、後で評価され、何かがオフになっていると実行時に失敗します。JSPをプリコンパイルしても、EL は生成されたサーブレットに文字列として残るため、失敗します。それらはそのままタグに渡され、それ自体で評価されます。または、JSP 2.x バージョンを使用している場合は、サーブレット コンテナ自体が式を値として渡す前に評価呼び出しでラップします。
基本的に、JSP 2 未満のバージョンの場合、次のようなタグの場合:
<my:tag value="${bean.someProp}" />
次のような結果が得られます。
myTagInstance.setValue("${bean.someProp}");
サーブレットで。
タグ自体が実行時にその文字列の評価を行います。
JSP 2 の場合は改善されません。評価は引き続き実行時に行われますが、サーブレット コンテナーはこの負担をタグから取り除き、次のようなコードを生成します。
myTagInstance.setValue((SomePropTypeCastHere) ProprietaryServletContainerEvaluationUtil.evaluate("${bean.someProp}"));
評価が行われたときにオブジェクト自体のコンテンツが予期されたものではない場合、奇妙な結果またはエラーが発生します。
JSP で静的型付けを強制する (私が知っている) 唯一の方法は、Java コードを JSP に戻すことです (EL は排除するために発明されました)。そのため、JSP を醜い方法で変更する必要があると懇願したのです。
すべてのタグ<rtexprvalue>true</rtexprvalue>
で値を使用できる場合は、スクリプトレットを使用してタイプ セーフを適用できます。
次のようなタグ:
<my:tag value="<%=bean.getSomeProp()%>" />
これに変換されます:
myTagInstance.setValue(bean.getSomeProp());
プロパティの名前が変更されたり、削除されたり、タイプが変更されたりした場合someProp
、コンパイラはそれについて通知できます。IDE 自体が、JSPをプリコンパイルする必要さえないことを通知できるはずです。
私が間違っていなければ、Spring タグは実行時式をサポートしているので、これは機能するはずです... JSP を台無しにするつもりなら、それは!
IDE の補完サポートに関しては、スクリプトレットにはありますが、EL にはありません。これは、EL の場合も同じ議論であり、実行時に発生するためです。JSP の実行時に IDE がコンテキスト (ページ、リクエスト、セッションなど) を認識し、JSP の開発時にそれを認識する方法は?