17

わかりましたので、かなり一般的なエラーに遭遇しました:

WARNING: No mapping found for HTTP request with URI [/WEB-INF/jsp/index.jsp] in DispatcherServlet with name 'app'

私は既存の回答を見ていますが、コンポーネントがどのように相互作用するかについての本当に良い説明を見たことがありません。DispatcherServlet既存の回答に基づいて問題を解決できないので、誰かがand Resolvers の機能の詳細な説明を提供してくれることを願っています。

Eclipse で開発すると、次のような構造になります。

/src/com/whiuk/philip/web/controller/IndexController.java
/WebContent
/WebContent/WEB-INF
/WebContent/WEB-INF/web.xml
/WebContent/WEB-INF/app-servlet.xml
/WebContent/WEB-INF/jsp/index.jsp

Eclipse Deployment Assembly は、次のようにデプロイすることを意味します。

/src -> WEB-INF/classes
/WebContent -> /
/ivy.xml[*] -> WEB-INF/lib

およびすべてのファイルへのマッピングを定義するweb.xmlファイルがあります ( )DispatcherServlet/*

<servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

パッケージをスキャンして定義する app-servlet.xml ファイルがありますInternalResourceViewResolver

<context:component-scan base-package="com.whiuk.philip.web" />
<mvc:annotation-driven />
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

IndexControllerインデックスの RequestMapping を持つ があります。

 @Controller
 public class IndexController {
      @RequestMapping(value = "/index", method = RequestMethod.GET)
      public ModelAndView index() {
             return new ModelAndView();
      }
 }

ログは、これが登録されていることを示しています:

org.springframework.web.servlet.handler.AbstractHandlerMethodMapping registerHandlerMethod
INFO: Mapped "{[/index],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}"
onto public org.springframework.web.servlet.ModelAndView 
com.whiuk.philip.web.controller.IndexController.index()

最後に、index.jspファイルがあります。

上部に表示されているエラーの原因となっている設定ミスが何であるかを誰かが説明し、可能であれば、DispatcherServlet、リゾルバー、およびそれらがコントローラーにどのようにフィードするかについて、文などを提供してください。

4

2 に答える 2

51

Spring Web MVC アプリケーションでのリクエストの「流れ」について説明します。

アプリケーションにリクエストを送信すると、次のことが起こります。

  • リクエストがサーバー (Tomcat など) に届きます。URL のコンテキスト パスに応じて、サーバーは要求が属するアプリケーションを決定します。
  • アプリケーションの web.xml ファイル内の URL とサーブレット マッピングに応じて、サーバーはどのサーブレットが要求を処理する必要があるかを認識します。
  • リクエストは、リクエストを変更または拒否できるサーブレット フィルタチェーンに渡されます。
  • サーブレットがリクエストを制御します。Spring アプリケーションの場合、Spring Dispatcherservlet がリクエストを受け取ります。春の訪れ
  • リクエストはmvc インターセプター preHandleメソッドによって処理されます
  • リクエストは、url に基づいてコントローラーにマップされます。対応するコントローラ メソッドが呼び出されます。
  • コントローラーがリクエストを処理しています。コントローラーでは、さまざまな応答を返すことができます (jsp、pdf、json、リダイレクトなど)。ここでは、単純な jsp ビューをレンダリングすることを前提としています。コントローラーの結果は、モデルとビューの 2 つです。モデルは、ビューで後でアクセスするデータを含むマップです。この段階のビューは、ほとんどの場合、ビュー名を含む単純な文字列です。
  • 登録された springs mvc インターセプターは、postHandleメソッドを使用して再び開始できます (モデルを変更する場合など)。
  • コントローラーの「ビュー」の結果は、を使用して実際のビューに解決されますViewResolver。ViewResolver に応じて、結果は jsp ページ、タイル ビュータイムリーフ テンプレート、またはその他の多くの「ビュー」になります。あなたの場合、ViewResolverビュー名(「myPage」など)をjspファイル(など/WEB-INF/jsp/myPage.jsp)に解決します
  • ビューは、コントローラーから返されたモデル データを使用してレンダリングされます
  • レンダリングされたビューを含む応答は、再び mvc インターセプターに渡されます (afterCompletionメソッド)
  • 応答は、ディスパッチャ サーブレットを離れます。ここでスプリングランドは終了。
  • 応答が再びサーブレット フィルタを通過する
  • 応答はクライアントに送り返されます

私が 100% 正しくない場合、または何かを見逃している場合は、お気軽に訂正してください :-)

于 2012-12-24T00:39:34.407 に答える
8

基本的に何が起こっているかというと、Spring の DispatcherServlet が にマップされて/*いるため、リクエストごとに呼び出される傾向がありますが (これは問題ありません)、残念ながら/WEB-INF/jsp/index.jsp、コンテナのデフォルトではなく、リクエストが JSP ページ ( ) にディスパッチされた場合でも呼び出されます。サーブレットが呼び出されます。

私が認識している修正は次のとおりです。

/代わりに、デフォルトのサーブレット パスにマップします。

<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

上記で見られる問題の 1 つは、webapp のルートの下にあるリソースが、残念ながら DispatcherServlet によって処理され、それが何をするかわからないということです。修正するには、次のように default-servlet-handler を登録します

<mvc:default-servlet-handler />
于 2012-12-24T00:26:19.797 に答える