5

これは初心者の質問だと確信しており、答えを得るために1時間の大半をスタックオーバーフローのトロールに費やしましたが、誰も私のケースを持っていないようです...

Spring MVC を使用する新しい webapp があります。アプリのほとんど (99%) は純粋な REST であるため、「ビュー」自体はなく、単純に JSON を送信するか、エラーなどの代替 HTTP ステータスを送信します。

例外は、実際の JSP である必要があるログイン ページですが、どういうわけか、REST コントローラーをマップするために使用している構成によって、通常の JSP マッピングが失敗する状態になっています。

これが私が持っているものです:

私の Dispatcher サーブレット構成では、関連する部分は次のとおりです。

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

それを機能させるために、現在ログイン JSP にリダイレクトするだけの "HomeController" へのマッピングも追加しました。

<bean name="/" class="com.somepackage.HomeController"/>

今、私が持っている web.xml で:

<servlet>
    <servlet-name>spring-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-dispatcher-servlet.xml
    </param-value>
</context-param>

これは、次のような RESTful コントローラーでは正常に機能します。

@Controller
@RequestMapping(value = "/api/user")
public class BlahBlahController {...

私の「HomeController」は次のようになります。

@Controller
@RequestMapping(value = "/")
public class HomeController extends AbstractController {
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new ModelAndView("login");
    }
}

「/」URL にアクセスすると IS がトリガーされますが、ログに次のエラーが記録されます。

WARNING: No mapping found for HTTP request with URI [/WEB-INF/pages/login.jsp] in DispatcherServlet with name 'spring-dispatcher'

今、私はそれが言っていることを理解していますが、解決方法がわかりません/WEB-INF/pages/login.jsp(このページは存在します)。

私はそれがどのように機能するはずなのか少し混乱しています。手がかりを得た人はいますか?

ありがとう。

4

2 に答える 2

6

OK ..答えが見つかりました。それは、ディスパッチャ構成の url-pattern です。

それ以外の:

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

そのはず

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

私は実際にこの答えを他の場所で見つけて試してみましたが、うまくいかないと「思った」ので、これが根本的な原因とは無関係だと思った理由に気付きました.

なぜこれが機能し、もう一方が機能しないのかわかりません..しかし、一度に1つの問題があります...

于 2013-04-17T06:56:25.933 に答える
-1

メソッドレベルで RequestMapping を配置して、コードで試してみましたが、うまくいきました。@Controller を使用していて、適切な「context:component-scan」がある場合は、HomeController Bean を定義する必要はありません。

@Override
@RequestMapping(value = "/") 
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
    return new ModelAndView("login");
}

すべての「/」アクセスに対してログイン ビューをリダイレクトするだけの場合は、以下のコードを使用することもできます。

<mvc:view-controller path="/" view-name="login"/>

役に立つリファレンスとして、github からmvc ショーケースプロジェクトをチェックアウトしてください。

于 2013-04-16T10:01:57.880 に答える