2014年3月22日 星期六

SpringMVC Request Mapping

透過dispatcher-sevlet.xml,

利用context:component-scan去掃描package以下的所有@Controller,

那要如何將USER傳送的request對應到符合的控制器,

便是依賴@RequestMapping,

有以下幾種方式可以使用:

1.利用URL對應

可以在function前利用@RequestMapping來對應傳送的URL,

假設你的webapp名稱為springmvc,

那當你呼叫/springmvc/account/create時,

便會執行下列AccountController的create(),
package com.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class AccountController {

 @RequestMapping("/account/create")
 public String create() {
  return "account/create";
 }
}

除此之外,你也可以在class的地方設定@RequestMapping,

以下面UserController為例,

當你呼叫/springmvc/user/login,

就會執行login(),
package com.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {

 @RequestMapping("/login")
 public String login() {
  return "user/login";
 }
}

通常建議在@Controller的class增加設定@RequestMapping,

這樣在URL對應時,

便可以很快知道要對應User的@Controller,

然後尋找底下的login()。

2.透過RequestMethod、param、header來對應

可以透過HTTP的請求方法,

如GET、POST、DELETE、PUT、TRACE....等等,

或者是參數和標頭來尋找對應@Controller及@RequestMapping,

可參考下面的例子:
package com.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/car")
public class CarController {

 @RequestMapping(value = "/create", method = RequestMethod.POST)
 public String create() {
  return "/car/create";
 }

 @RequestMapping(value = "/update", params = "carNo")
 public String update() {
  return "/car/update";
 }
 
 @RequestMapping(value = "/delete", headers="Content-Type=text/plain")
 public String delete() {
  return "/car/delete";
 }
}

其中關於params參數及headers的設定,

有一些可以使用的方式如下:

params="carNo":請求參數必須包含名為carNo的參數

params="!carNo":請求參數不能有包含名為carNo的參數

params="carNo!=123":請求參數必須包含名為carNo的參數,但值不可為123

params={"carNo=123","carBand"}:請求參數必須包含名為carNo及carBand的參數,

其中carNo的值必須為123

headers的使用方式如同上述params。

沒有留言:

張貼留言