web-dev-qa-db-ja.com

Spring 3.0.6 MVC @PathVariableおよび@RequestParamがJSPビューで空白/空

私は信じられないほど単純なコントローラー/ビューのセットアップを取得しようとしていますが、それを機能させることができません。私のweb.xmlでは、正常に実行されている<servlet>というservlet-context.xmlを定義しました。 servlet-context.xmlで、次のように設定しました:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"

<...other stuff in here... />

<mvc:annotation-driven />

とりわけ。 @アノテーションを使用するために必要なのはこれだけです。

私のコントローラーには、次のものがあります:

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET)
public String adminStudent(@PathVariable String username, @RequestParam String studentid) {
    return "student";
}

そして、私のstudent.jspビューには、

<p>This is the page where you would edit the stuff for ${username}.</p>
<p>The URL parameter <code>studentid</code> is set to ${studentid}.</p>

http://localhost:8080/application/student/xyz123/?studentid=456にリクエストを送信すると、期待どおりのビューが表示されますが、すべての変数が空白またはnullです。

<p>This is the page where you would edit the stuff for .</p>
<p>The URL parameter <code>studentid</code> is set to .</p>

私のweb.xmlまたはservlet-context.xmlの設定方法に問題があると思われますが、どこに原因があるかわかりません。私が見る限り、ログには何も表示されません。


更新: spring-mvc-showcase のこの部分に基づいてコードを作成していました:

@RequestMapping(value="pathVariables/{foo}/{fruit}", method=RequestMethod.GET)
public String pathVars(@PathVariable String foo, @PathVariable String fruit) {
    // No need to add @PathVariables "foo" and "fruit" to the model
    // They will be merged in the model before rendering
    return "views/html";
}

...私にとってはうまくいきます。この例が機能する理由を理解できませんが、私の例では機能しません。それは、彼らがservlet-context.xmlを使って 何か違うことをしているからです

<annotation-driven conversion-service="conversionService">
    <argument-resolvers>
        <beans:bean class="org.springframework.samples.mvc.data.custom.CustomArgumentResolver"/>
    </argument-resolvers>
</annotation-driven>
12
alexmuller

ああ!最後にそれを考え出した。

_spring-mvc-showcase_は、Spring 3.1を使用しています。これにより、 SPR-754 に従って、_@PathVariable_ sがモデルに自動的に公開されます。

@duffymoと@JB Nizetで指摘されているように、model.put()を使用してモデルに追加することは、3.1より前のバージョンのSpringで行うことです。

Ted Youngが Spring:Expose @PathVariables To The Model で正しい方向に私を向けました。

7
alexmuller

モデルマップを作成し、パラメーターの名前と値のペアを追加します。

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET)
public String adminStudent(@PathVariable String username, @RequestParam String studentid, Model model) {
    model.put("username", username);
    model.put("studentid", studentid);

    return "student";
}
17
duffymo

@PathVariableは、アノテーション付きメソッドの引数を、呼び出されたURLのパスから抽出する必要があることを意味します。 @RequestParamは、注釈付きのメソッド引数をリクエストパラメータから抽出する必要があることを意味します。これらの注釈はどれも、注釈付きの引数を要求、セッション、またはアプリケーションのスコープに入れません。

${username}は、「ページ名、要求、セッション、またはアプリケーションスコープにある)ユーザー名属性の値を応答に書き込むことを意味します。これらのスコープのいずれにもユーザー名属性を含めなかったため、何も書き込まれません。

メソッドがModelAndViewオブジェクトを返し、モデルにusername属性とstudentid属性が含まれている場合、コードは機能します。

4
JB Nizet

このURLを想定http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013(今日のユーザー1234の請求書を取得するため)

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
      model.put("userId", user);
      model.put("date", dateOrNull);

}
2
Sudhakar