6

これは、Spring MVC に使用している現在の構成です。

1- web.xml:

<servlet>  
    <servlet-name>spring</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/config/dispatcherServlet.xml</param-value>
   </init-param>
<load-on-startup>1</load-on-startup>
</servlet>

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

2-dispatcherServlet.xml:

<context:component-scan base-package="com.app" />
 <context:annotation-config />
<mvc:annotation-driven />   
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
</bean>

3-コントローラー:私のWebページはwebappフォルダーの下にあります

@Controller
public class SearchController {

private Log log = LogFactory.getLog(getClass());

@RequestMapping("/search.jsp")
public String search(Model model, HttpServletRequest request,
        HttpSession session) {
          log.debug("Search Controller");
          return "search";
 }

問題: 次のように検索ページにアクセスしようとすると:

http://localhost:8080/MyAPP/search.jsp

コントローラーは呼び出されませんが、次のようにディスパッチャーサーブレットをマッピングし/mapping/*て検索ページにアクセスしたとき:

http://localhost:8080/MyAPP/mapping/search.jsp

コントローラーが正しく呼び出されました。私はspring 3.0.5.RELEASEを使用しています。

アドバイスしてください、ありがとう。

4

2 に答える 2

1

Webサーバー/サーブレットコンテナに設定されている組み込みのデフォルトサーブレットを忘れていると思います。たとえば、Tomcat7 / conf/web.xmlには次のものがあります。

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

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

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

*.jsp春になる前にキャッチしています。Spring構成をすべて削除してこれをローカルでテストしましたが、それでもを取得できましたsearch.jsp

DefaultAnnotationHandlerMappingがどのように機能するかは、なぜこれがそのように機能するのかを説明するのに役立つはずです。

<url-pattern>/mapping/*</url-pattern>単純なものよりも具体的な一致を作成した場合、要求/はデフォルト(つまり、Tomcat)サーブレットによって無視され、正しく構成されたコントローラーにルーティングされます。

これを修正する1つの方法は、を使用してサーブレットを介してすべてを強制する<url-pattern>/*</url-pattern>ことですが、マッピングの解決の問題を回避するために、他のいくつかの変更も行う必要があります。

* .jspファイルを(標準?)サブディレクトリに移動して/WEB-INF追加しました

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

web.xmlに変更し、 dispatcherServlet.xmlを次のように一致するように変更しました。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/"/>
    <property name="suffix" value=".jsp"/>
</bean>

これらの変更を行わない場合、Tomcatを無限転送ループに送信/search.jspするように構成したInternalResourceViewResolverによって、への要求が解決されます。/search.jsp

ここでは、URI[/WEB-INF/pages/apiForm.jsp]を使用したHTTPリクエストのマッピングが見つからない場合があります。

余談ですが、Spring XMLで構成されたプロジェクトのほとんどで/WEB-INF/views、ビューレイヤーを/WEB-INFルートの構成から分離するために使用しています。

于 2013-01-09T13:22:27.243 に答える
0

次のマッピングにより、ディスパッチャ サーブレットは、web.xml 内の他の URL マッピングによって明示的にマッピングされていない URL を処理します。URL が他のマッピングによって処理されていない限り、これはほぼすべてのマッピングと考えてください。

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

ViewResolver を次のように構成すると、次のようになります。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
</bean>

ViewMapping はプロジェクト内の JSP を指している必要があります。そうしないと、ディスパッチャーに提供されたすべてのマッピングをキャッチして、適切なビューへの転送/リダイレクトを処理しようとします。ビューリゾルバーの結果を得るために、プロジェクト内にビューが存在することを確認する必要があります/search.jsp。これは、プロジェクトの Web コンテンツ フォルダーのルート内に search.jsp が存在する必要があることを意味します。これらのビューが WEB-INF フォルダー内に配置され、次のマッピングが表示されるのは、はるかに一般的です。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/"/>
    <property name="suffix" value=".jsp"/>
</bean>
于 2013-01-09T10:48:31.453 に答える