8

現在、フロントのフレームワークなしでJSPのみを使用していた古いWebアプリにいくつかの新機能を追加しています。最近Springを追加しましたが、SpringMVC、Struts2、またはTapestry5を使用するようにすべてを書き直すのではなく、変更したJSPでBeanを自動配線したいと考えています。

タイプごとの自動配線を使用しているため、以前はWebアプリケーションコンテキスト(「wap」として)を取得していましたが、JSPでこのようなコードを取得することになります。

MyDao myDao = (MyDao) wap.getBeansOfType(MyDao.class).values().toArray()[0];

このようなコードを使用するのではなく、@ Autowiredアノテーションを使用するビジネスBeanの場合と同様に、JSPに直接Beanを自動的に注入します。

実際、JSPにBeanを注入するための最もクリーンな方法を探しています。あなたは何を使うのですか ?

4

5 に答える 5

9

Spring のContextExposingHttpServletRequestを使用できます。

特定の WebApplicationContext 内のすべての Spring Bean をリクエスト属性としてアクセス可能にする HttpServletRequest デコレータ。属性がアクセスされると、遅延チェックが行われます。

HttpServletRequestこれには、コントローラ コードでオリジナルをでラップし、それを JSP に転送する必要がありますContextExposingHttpServletRequest。特定の名前付き Bean、またはコンテキスト内のすべての Bean を公開できます。

もちろん、これは単に問題を JSP からコントローラ コードに移すだけですが、おそらくその方が扱いやすい問題です。

于 2010-01-26T11:54:38.783 に答える
7

@Autowiredjspとサーブレットの両方がサーブレットconainerによってインスタンス化されるため、直接使用することはできません。したがって、それらはSpringコンテキストの一部ではないため、依存関係は注入されません。

あなたはできる:

  1. すべてのコードをjspsではなく純粋なサーブレットに移動します-プレゼンテーションのみをjspsに残します。
  2. サーブレットで使用@Configurableします(リンクされたドキュメントで説明されているように、javaagentを追加します)

もう1つの方法は、サーブレットを現在のコンテキストの一部にすることです。これは、jspsとサーブレットの両方で可能です。

public void init() {
    WebApplicationContext ctx = WebApplicationContextUtils
         .getRequiredWebApplicationContext(getServletContext());

    AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();

    bf.autowireBean(this);
}

@Autowiredこれにより、注釈付きの依存関係が解決されます。

さて、サーブレットコンテナがサーブレットクラスのインスタンスを1つだけ使用する必要があるかどうかはわかりません。getDao()そうでない場合は、上記のコードを依存関係( )のgetterメソッドに配置し、@Autowiredプロパティがnull(つまり、サーブレットクラスの別のインスタンスがコンテナによって使用される)場合は、上記の操作を実行します。


とはいえ、実際にはWebフレームワーク(リストしたもののいずれか)の使用を検討してください。jspsにロジックがあることは完全に間違っている、サポートするのが難しい、読みにくいなどです。

于 2010-01-26T12:34:21.017 に答える
6

jspInit() メソッドをオーバーライドして Autowiring サポートを追加するのはどうでしょうか。

<%@ page import="com.example.ExampleService"%>
<%@ page import="org.springframework.beans.factory.annotation.Value"%>
<%@ page import="org.springframework.beans.factory.annotation.Autowired"%>
<%@ page import="org.springframework.web.context.support.SpringBeanAutowiringSupport"%>
<%!
    public void jspInit() 
    {
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
        getServletContext());
    }

    @Value("${example.property}")
    private String someField;

    @Autowired
    private ExampleService exampleService;
%>

<% final Object data = exampleService.getSomething(someField); %>
于 2013-04-05T15:23:19.203 に答える
4

依存性をJSPに注入するクリーンな方法があるとは思えません。

クリーンな解決策は、SpringMVCまたは引用した代替案のいずれかを使用して、JSPからビジネスロジックを引き出すためにコードのリファクタリングを開始することだと思います。

注入されたBeanを属性としてJSPにリクエストを渡すだけの1つ以上のミニマリストコントローラーから始めます。@skaffmanの答えは、それを行う1つの方法を提供します。または、より選択的に行うこともできます。次に、コードをJSPからコントローラーに段階的に移行します。

于 2010-01-26T12:35:04.300 に答える