私は信じられないほど単純なコントローラー/ビューのセットアップを取得しようとしていますが、それを機能させることができません。私の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>
ああ!最後にそれを考え出した。
_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 で正しい方向に私を向けました。
モデルマップを作成し、パラメーターの名前と値のペアを追加します。
@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";
}
@PathVariable
は、アノテーション付きメソッドの引数を、呼び出されたURLのパスから抽出する必要があることを意味します。 @RequestParam
は、注釈付きのメソッド引数をリクエストパラメータから抽出する必要があることを意味します。これらの注釈はどれも、注釈付きの引数を要求、セッション、またはアプリケーションのスコープに入れません。
${username}
は、「ページ名、要求、セッション、またはアプリケーションスコープにある)ユーザー名属性の値を応答に書き込むことを意味します。これらのスコープのいずれにもユーザー名属性を含めなかったため、何も書き込まれません。
メソッドがModelAndViewオブジェクトを返し、モデルにusername
属性とstudentid
属性が含まれている場合、コードは機能します。
@PathVariable
は、uri(SpringをURIテンプレートと呼びます)からプレースホルダーを取得します—参照 Spring Reference Chapter 16.3.2.2 URIテンプレートパターン@RequestParam
はパラメータを取得することです— スプリングリファレンスの第16.3.3.3章@RequestParamを使用してリクエストパラメータをメソッドパラメータにバインドする を参照この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);
}