Spring MVC コントローラ
今回はコントローラをやります。以前のサンプルの説明
package spring.test;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping(value = "/", method = GET)
public String show() {
return "test";
}
}
クラスの頭に@Controllerを付け、Spring定義ファイルのcomponent-scanでパッケージを指定すると、そのクラスはコントローラとして動作します。
コントローラはブラウザなどクライアントからのリクエストを受付け、サービスを呼び出し、結果をクライアントに返します。
コントローラは複数作成されますが、どのコントローラが呼ばれるかは@RequestMappingで指定した条件と一致したものになります。
@RequestMappingが指定されたメソッドの戻り値がJspファイルまたはダウンロードデータになります。
@RequestMappingについて
@RequestMappingはクラスまたはメソッドの頭に付けます。@RequestMappingには色々な条件を付けられますが、今回はvalue、method、paramasをやります。value
URLの指定になります。以下はそれぞれhttp://localhost:8080/springMVC/
http://localhost:8080/springMVC/test/
http://localhost:8080/springMVC/test/test.html
でアクセスされます。
@RequestMapping(value = "/", method = GET)
public String show() {
System.out.println("スラッシュのみ");
return "test";
}
@RequestMapping(value = "/test/", method = GET)
public String showGet() {
System.out.println("ディレクトリ指定");
return "test";
}
@RequestMapping(value = "/test/test.html", method = GET)
public String showHtml() {
System.out.println("html指定");
return "test";
}
method
クライアントからGET、POSTのどちらで呼ばれたの指定です。下の例ではクラスでURLを指定し、メソッドでGET、POSTを指定しています。
package spring.test;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "/test")
public class TestController {
@RequestMapping(method = GET)
public String showGet() {
System.out.println("GETで呼ばれた");
return "test";
}
@RequestMapping(method = POST)
public String showPost() {
System.out.println("POSTで呼ばれた");
return "test";
}
}
params
GET、POSTに渡すパラメータでも振り分けられます。以下のURLでアクセスすると以下のメソッドが呼び出されます(今回はGETで例を書きますが、POSTでも動作します)。
URL | 呼び出されるメソッド |
---|---|
http://localhost:8080/springMVC/test?xxx | showGet0() |
http://localhost:8080/springMVC/test?xxx=123 | |
http://localhost:8080/springMVC/test?args=abc | showGet1() |
http://localhost:8080/springMVC/test?args=123 | showGet2() |
http://localhost:8080/springMVC/test | showGet3() |
package spring.test;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "/test", method = GET)
public class TestController {
@RequestMapping(params = "xxx")
public String showGet0() {
System.out.println("GET0が呼ばれた");
return "test";
}
@RequestMapping(params = "args=abc")
public String showGet1() {
System.out.println("GET1が呼ばれた");
return "test";
}
@RequestMapping(params = "args=123")
public String showGet2() {
System.out.println("GET2が呼ばれた");
return "test";
}
@RequestMapping()
public String showGet3() {
System.out.println("GET3が呼ばれた");
return "test";
}
}
値の受け取り
コントローラはクライアントから色々な方式で値を受け取ることができます。URLの指定位置を値として取得(@PathVariable)
package spring.test;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(method = GET)
public class TestController {
@RequestMapping(value = "/test/{arg}")
public String showArg(@PathVariable("arg") String id) {
System.out.println("引数:" + id);
return "test";
}
@RequestMapping(value = "/test/{arg1}/{arg2}")
public String showArg2(@PathVariable("arg1") String id1, @PathVariable("arg2") String id2) {
System.out.println("引数:" + id1 + "," + id2);
return "test";
}
}
URLの指定位置を値として受け取ることが出来ます。{・・・}で位置を指定し、@PathVariableアノテーションで値を受け取ります。
上の例では http//localhost:8080/springMVC/test/abc でアクセスしたときにshowArgメソッドが呼ばれ、引数idに abc がセットされます。
http//localhost:8080/springMVC/test/abc/def でアクセスしたときにshowArg2メソッドが呼ばれ、引数id1に abc、引数id2に def がセットされます。
パラメータの取得(@RequestParam)
package spring.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class TestController {
@RequestMapping(value = "/test")
public String showArg(@RequestParam("arg1") String id1,
@RequestParam(value = "arg2", required = false, defaultValue = "aaa") String id2) {
System.out.println("引数:" + id1 + "," + id2);
return "test";
}
}
パラメータ名を指定して受け取ります。Getの場合、URLパラメータから受け取り、Postの場合、フォームの項目名から受け取ります。 arg1のようにパラメータだけ指定することやarg2のように必須/任意やデフォルト値を設定することもできます。arg1のようにパラメータだけ
指定した場合は、必須になるので、指定されない可能性がある場合、arg2のように任意かデフォルト値をセットさせて下さい。
HttpServletRequestの使用
package spring.test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping(value = "/test")
public String showArg(HttpServletRequest request, HttpServletResponse response) {
System.out.println("引数:" + request.getParameter("arg"));
HttpSession session = request.getSession(true);
return "test";
}
}
通常のServletと同じようにHttpServletRequestからパラメータを取得することもできます。
ページのトップへ戻る