10
<servlet-mapping>
    <servlet-name>testServlet</servlet-name>
    <url-pattern>/test/*</url-pattern>
</servlet-mapping>

/test/pageを押すと、上記が機能します。ただし、/testまたは/test/を押しても機能しません。私は Spring MVC を使用しており、リクエスト マッピングは次のとおりです。

@RequestMapping(value = {"","/"})

編集:

独立したプロジェクトで検証中ですが、Spring の UrlPathHelper のバグのようです。次のメソッドは、コンテキストとサーブレット パスの両方があり、末尾のスラッシュなしでサーブレットをヒットすると、正しくないパスを返します。

public String getPathWithinApplication(HttpServletRequest request) {
    String contextPath = getContextPath(request);
    String requestUri = getRequestUri(request);
    if (StringUtils.startsWithIgnoreCase(requestUri, contextPath)) {
        // Normal case: URI contains context path.
        String path = requestUri.substring(contextPath.length());
        return (StringUtils.hasText(path) ? path : "/");
    }
    else {
        // Special case: rather unusual.
        return requestUri;
    }
}

例として、「admin」のコンテキストと次のサーブレット マッピングがあるとします。

<servlet-mapping>
    <servlet-name>usersServlet</servlet-name>
    <url-pattern>/users/*</url-pattern>
</servlet-mapping>

これで、コントローラーの 1 つに次のようなリクエスト マッピングができました。

@RequestMapping(value = {"","/"})

/ admin /usersにアクセスしても機能しません。ただし、/admin/users/を押すと動作します。ここで、リクエスト マッピングを次のように変更すると、両方とも機能します。

@RequestMapping(value = {"/users","/"})

ただし、URL /admin/users/usersも機能するようになりました (これは私が望むものではありません)。

4

5 に答える 5

3

私のセットアップは通常次のようになります。

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

コントローラー、ここで私はあなたが同じように扱いたい/testと思います:/test/

@Controller
public class MyController {

    @RequestMapping("/test")
    public String test() {
        return "redirect:/welcome";
    }

    @RequestMapping("/test/")
    public String test() {
        return "redirect:/welcome";
    }

    @RequestMapping("/welcome")
    public void test(ModelMap model) {
        // do your stuff
    }
}

このような設定では、ファイルのDispatcherServletリクエストを処理することになりますが、ほとんどの場合、これは望ましくありません。これがBhavikが説明する問題だと思います。これらのリソースについては、次のようにResourceControllerを使用できます。*.css*.js

<mvc:resources mapping="/css/**" location="/resources/css/" />
<mvc:resources mapping="/js/**" location="/resources/js/" />

からのファイルは/resources/css/resources/js追加のコントローラーを作成しなくても提供されます。

于 2012-11-15T21:06:10.710 に答える
2

まず、dispatcher servlet の「/」へのマッピングと「/*」へのマッピングの違い。違いがあります!

「/*」にマッピングすると、すべての URL リクエスト (「/WEB-INF/jsp/.../index.jsp」のようなものを含む) がディスパッチャー サーブレットにマッピングされます。

次に、Spring + Tiles を使用し、タイル定義で JSP を返す場合、それは内部転送要求として扱われ、元の要求と同じサーブレットによって処理されます。私の例では、home() メソッドによって適切にキャッチされたルート URL "/" を呼び出してから、Tiles によって "index.jsp" に転送されます。これは再び Dispatcher Servlet によって処理されます。明らかに、ディスパッチャー サーブレットは "index.jsp" を処理できません。これは、コントローラーがないためです。

ええ、醜いですが、これが機能する方法のようです。

したがって、これまでに見つけた唯一の解決策は、web.xml で「/*」を「/」に戻すことです。このようにして、JSPはTomcatのjspサーブレットによって適切にレンダリングされ、ディスパッチャーサーブレットではないと思います。残念ながら、この修正により、Spring による ROOT URL ディスパッチが機能しなくなるため、今のところ ROOT URL + タイルを使用するという考えを残す必要があります。

「/*」を使用している場合、web.xml に明示的なサーブレット マッピング「 .jsp -> Tomcat jsp 」を追加しても役に立たないことに注意してください。

それでも問題は解決しません。

また、これはSpring MVC 3.0の問題です

于 2012-11-15T20:59:02.703 に答える
0

私の場合、ルート "/" url を除くすべてのURL が機能していました。問題は、プロジェクトの webapp ルート フォルダー内のファイルを
削除しなかったことです。index.htm

于 2016-02-10T23:41:37.657 に答える
0

web.xml ファイルに手を加えない方法は、マップをデフォルトのウェルカム ファイル パスに設定することです。

@RequestMapping("/index.html")
于 2014-11-17T22:38:47.767 に答える