1

通常のJavawebaアプリでは、これをサーブレットコードに入れると、転送が機能します。

getServletConfig().getServletContext().getRequestDispatcher("/something.jsp").forward(req, resp);

しかし、Spring 3.0アプリの同じサーブレットでこれを行うと、404このエントリをアプリケーションコンテキストxmlファイルに追加しても次のようになります。

    <intercept-url pattern="/something.jsp**" access="hasRole('ROLE_ANONYMOUS')" requires-channel="http" />

代わりに、私は春にこれをしなければならないようです:

getServletConfig().getServletContext().getRequestDispatcher("/something").forward(req, resp);

コントローラにマッピングを追加します。

@RequestMapping(value = {"/something"}, method = RequestMethod.GET)
public final String something(HttpServletRequest req, ModelMap model) {
    ...
    }

しかし、これは単純なJSPを機能させるための非常に重要な迂回路です。

これを行うためのより良い方法はありますか?

4

3 に答える 3

3

私はあなたの問題を完全には理解していませんが:

  • return "/something"コントローラから呼び出されたjspに転送しsomething.jspます(最も一般的なビューリゾルバ構成が使用されている場合)

  • メソッドからの戻り値がない場合、デフォルトでは、メソッド名を持つjspが検索されます。

于 2011-02-17T13:17:52.650 に答える
1

これが私のやり方です:

ビュー名がリクエストURLに基​​づくように、ビューリゾルバーを設定します。

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/pages/"/>
  <property name="suffix" value=".jsp"/>
</bean>

次に、サーブレットコンテナは、一致する最長のパスに基づいてマッピングを選択します。したがって、このマッピングをJSPに組み込むことができ、/*マッピングよりも選択されます。

<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>/WEB-INF/pages/*</url-pattern>
</servlet-mapping>

実際、Tomcatの場合、jspはそのままの状態で存在するサーブレットであるため、必要なのはそれだけです。他のコンテナの場合は、JSPサーブレットの名前を確認するか、次のようなサーブレット定義を追加する必要があります。

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

これらの2つが整ったら、モデルを返す以外にコントローラーで何もする必要はありません。リクエストのURLに基​​づいて、WEB-INF/ページからのビューに自動的に転送されます。あなたの例では、それは/WEB-INF/pages/something.jspになります。

于 2011-02-17T13:32:57.310 に答える
1

まず、Spring MVCコントローラー内から実行できるサーブレットから実行できることはすべて(その時点では基本的には内部にいるためDispatcherServlet.service())、404を取得した場合、これはサーブレットマッピングに関連している可能性があります。Dispatcherサーブレットを/*としてマッピングした可能性はありますか?

これとは別に(しかしもっと重要なことですが)、Spring MVC(基本的にはすべてのWebフレームワーク)はサーブレットインフラストラクチャを非表示にすることになっているため、RequestDispatcherを使用してリクエストを転送する必要性は私にはあまり明確ではありません。

リクエストをJSPに転送するには、ViewResolverが認識している場所にリクエストを配置し、コントローラーメソッドから「何か」を返すだけです。これはまったく同じ効果があり、より「MVCっぽい」ものです...

于 2011-02-17T13:33:38.103 に答える