1. 程式人生 > >【SpringMVC】@Controller和@RequestMapping註解說明

【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、常用屬性示例:

1value屬性:將URL對映到方法上。

@RequestMapping(value="/hello")

public  ModelAndView  hello(){

return ..;

}

注:value屬性是@RequestMapping註釋的預設屬性,如果只有唯一的屬性,則可以省略該屬性名。

     value屬性的值也可以是一個空字串。

2

method屬性:該屬性用來指示該方法僅僅處理哪些HTTP請求方式。

     @RequestMapping(value="/hello",method=RequestMethod.POST)

表示該方法只支援POST請求。

也可以同時支援多個HTTP請求方式:

     @RequestMapping(value="/hello",method={RequestMethod.POST,RequestMethod.GET})

注:如果沒有指定method屬性值,則請求處理方法可以處理任意的HTTP請求方式。

3consumes屬性:指定處理請求的提交內容型別(Content-Type

      @RequestMapping(value="/hello",method=RequestMethod.POST,consumes="application/json")

表示該方法僅處理request Content-Type"application/json"型別的請求。

4produces屬性:指定返回的內容型別,返回的內容型別必須是request請求頭(Accept)中所包含的型別。

     @RequestMapping(value="/hello" , method=RequestMethod.POST,produces="application/json")

表示該方法僅處理Request請求中請求頭中包含了"application/json"的請求,同時指明瞭返回的內容型別為application/json

5params屬性:指定request中必須包含某些引數值時,才讓該方法處理。

     @RequestMapping(value="/hello",method=RequestMethod.POST,params="myParam = myValue")

表示該方法僅處理其中名為"myParam",值為myValue的請求。

6hearders屬性:該屬性指定request中必須包含某些指定的header值,才能讓該方法處理請求。

   @RequestMapping(value="/hello" , method=RequestMethod.POST,headers="Referer=http://www.lwt.org/")

表示該方法僅處理requestheader中包含了指定"Referer"請求頭和對應值為"http://www.lwt.org/"的請求。

4ModelModelAndView

說明:控制器(Controller)執行業務邏輯,用於產生模型資料(Model),而檢視(View),則用於渲染模型資料。

Spring提供了多種途徑輸出模型資料:

· Model和ModelMap

· ModelAndView

· @ModelAttribute

· @SessionAttributes

1Model ModelMap

    SpringMVC使用了Model介面儲存模型資料,ModelMap介面實現了Map介面。

說明:SpringMVC呼叫處理方法之前會建立一個隱含的模型物件,作為模型資料的儲存容器。

如果處理方法為ModelModelMap型別,則SpringMVC會將資料引用傳遞給這些引數。

新增模型資料方法:

addObject(String attributeName , Object  attributeValue);

例項一:ModelModelMap的使用

		// 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

2ModelAndView:既包含模型資料資訊,也包含檢視資訊。

新增模型資料:

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;

}