【SpringMVC】@Controller和@RequestMapping註解說明
一、@Controller註解
1、說明:
用於指示Spring類的例項是一個控制器,控制器可以支援同時處理多個請求動作。
2、保證Spring能找到控制器:
(1)在SpringMVC的配置檔案的標頭檔案中引入spring-context
(2)使用<context:component-scan/>元素,啟動包掃描功能。
注:<context:component-scan base-package="com.lwt.controller"/>可指定掃描包。
二、@RequestMapping註解
1、說明:
該註解用來對映一個請求。指示
Spring用哪一個類或非法來處理請求動作。不屬於引數繫結註解。例如:@RequestMapping(value="/hello")
2、支援的屬性:
3、常用屬性示例:
(1)value屬性:將URL對映到方法上。
@RequestMapping(value="/hello")
public ModelAndView hello(){
return ..;
}
注:value屬性是@RequestMapping註釋的預設屬性,如果只有唯一的屬性,則可以省略該屬性名。
value屬性的值也可以是一個空字串。
(2)
@RequestMapping(value="/hello",method=RequestMethod.POST)
表示該方法只支援POST請求。
也可以同時支援多個HTTP請求方式:
@RequestMapping(value="/hello",method={RequestMethod.POST,RequestMethod.GET})
注:如果沒有指定method屬性值,則請求處理方法可以處理任意的HTTP請求方式。
(3)consumes屬性:指定處理請求的提交內容型別(Content-Type
@RequestMapping(value="/hello",method=RequestMethod.POST,consumes="application/json")
表示該方法僅處理request Content-Type為"application/json"型別的請求。
(4)produces屬性:指定返回的內容型別,返回的內容型別必須是request請求頭(Accept)中所包含的型別。
@RequestMapping(value="/hello" , method=RequestMethod.POST,produces="application/json")
表示該方法僅處理Request請求中請求頭中包含了"application/json"的請求,同時指明瞭返回的內容型別為application/json
(5)params屬性:指定request中必須包含某些引數值時,才讓該方法處理。
@RequestMapping(value="/hello",method=RequestMethod.POST,params="myParam = myValue")
表示該方法僅處理其中名為"myParam",值為myValue的請求。
(6)hearders屬性:該屬性指定request中必須包含某些指定的header值,才能讓該方法處理請求。
@RequestMapping(value="/hello" , method=RequestMethod.POST,headers="Referer=http://www.lwt.org/")
表示該方法僅處理request的header中包含了指定"Referer"請求頭和對應值為"http://www.lwt.org/"的請求。
4、Model和ModelAndView
說明:控制器(Controller)執行業務邏輯,用於產生模型資料(Model),而檢視(View),則用於渲染模型資料。
Spring提供了多種途徑輸出模型資料:
· Model和ModelMap
· ModelAndView
· @ModelAttribute
· @SessionAttributes
(1)Model和 ModelMap
SpringMVC使用了Model介面儲存模型資料,ModelMap介面實現了Map介面。
說明:SpringMVC呼叫處理方法之前會建立一個隱含的模型物件,作為模型資料的儲存容器。
如果處理方法為Model或ModelMap型別,則SpringMVC會將資料引用傳遞給這些引數。
新增模型資料方法:
addObject(String attributeName , Object attributeValue);
例項一:Model和ModelMap的使用
// Controller註解用於指示該類是一個控制器,可以同時處理多個請求動作
@Controller
public class User1Controller {
private static final Log logger = LogFactory.getLog(User1Controller.class);
// @ModelAttribute修飾的方法會先於login呼叫,該方法用於接收前臺jsp頁面傳入的引數
@ModelAttribute
public void userModel(String loginname, String password, Model model) {
logger.info("userModel");
// 建立User物件儲存jsp頁面傳入的引數
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
// 將User物件新增到Model當中
model.addAttribute("user", user);
}
@RequestMapping(value = "/login1")
public String login(Model model) {
logger.info("login");
// 從Model當中取出之前存入的名為user的物件
User user = (User) model.asMap().get("user");
System.out.println(user);
// 設定user物件的username屬性
user.setUsername("測試");
return "result1";
}
}
注意:@ModelAttribute修飾的方法會先於login呼叫
@ModelAttribute
public void userMode2(String loginname,String password,
ModelMap modelMap){
logger.info("userMode2");
// 建立User物件儲存jsp頁面傳入的引數
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
// 將User物件新增到ModelMap當中
modelMap.addAttribute("user", user);
}
@RequestMapping(value="/login2")
public String login2(ModelMap modelMap){
logger.info("login2");
// 從ModelMap當中取出之前存入的名為user的物件
User user = (User) modelMap.get("user");
System.out.println(user);
// 設定user物件的username屬性
user.setUsername("測試");
return "result2";
}
注:將儲存物件改為ModelMap
(2)ModelAndView:既包含模型資料資訊,也包含檢視資訊。
新增模型資料:
addObject(String attributeName , Object attributeValue);
設定檢視:
setViewName(String viewName);
例項二:ModelAndView的使用
private static final Log logger = LogFactory.getLog(User3Controller.class);
@ModelAttribute
public void userMode3(String loginname,String password,
ModelAndView mv){
logger.info("userMode3");
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
// 將User物件新增到ModelAndView的Model當中
mv.addObject("user", user);
}
@RequestMapping(value="/login3")
public ModelAndView login3(ModelAndView mv){
logger.info("login3");
// 從ModelAndView的Model當中取出之前存入的名為user的物件
User user = (User) mv.getModel().get("user");
System.out.println(user);
// 設定user物件的username屬性
user.setUsername("測試");
// 設定返回的檢視名稱
mv.setViewName("result3");
return mv;
}