1. 程式人生 > >SSM in Action——重溫註釋

SSM in Action——重溫註釋

再臨註解

@RequestMapping 在這裡插入圖片描述

  • value屬性是預設屬性,因此如果只有唯一屬性,則可以省略屬性名。
  • method如果不寫,則能處理所有方式的請求。
  • consumes屬性用來指定請求的提交內容型別,如 @RequestMapping(value="/hello",method=RequestMethod.Post,consumes="application/json") 上句表示方法處理"application/json"型別的請求。
  • produces表示返回內容型別。(不是很清楚)
  • params表示request必須包含某些引數,才讓該方法處理。如: @RequestMapping(value="/",params={"name","age!=10"})
    <a href="testParams?name=zhoutk&age=11">Test Params</a>
  • headers表示必須包含的請求頭和對應的請求。

請求方法引數型別 除了常見的Model,還可以使用Map、ModelMap、HttpServletRequest、HttpServletResponse、HttpSession、Reader、Writer、Locale、Errors等等以及註解@PathVariable、@MatrixVariable、@RequestParam、@RequestHeader、@RequestBody、@RequestPart等註解。 請求處理方法可返回的型別

包括Model、Map、ModelandView、View、String、void等等。

Model和ModelAndView 在請求處理方法出現和返回的引數型別中,最重要的就是Model和ModelAndView了。 使用Model能夠比其他的類很好的解耦合。 觀察如下的程式碼:

@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"; } }

以及:

@Controller
public class User3Controller{
	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;
	}
}

@RequestParam註解 在這裡插入圖片描述 它有點像一種自動繫結,把url中攜帶的引數傳遞給請求引數: url:http://localhost:8080/context/login?loginame=lee&password=123456

@RequestMapping("/login")
public ModelandView login(
	@RequestParam("loginname") String loginname,
	@RequestParam("password") String password){
	...
}

@RequestParam還有如下寫法: @RequestParam(value="loginname",required=true,defaultValue="admin")

@PathVariable註解 在這裡插入圖片描述 @RequestHeader註解 暫時用不上。 @CookieValue註解 該註解用於將請求的Cookie資料對映到引數上:

@RquestMapping("/cookietest")
public void cookieTest(
	@CookieValue(value="JSESSIONID",defaultValue="") String sessionid){
...
}

以上配置會自動將cookie中名為JSESSIONID值賦值給sessionid,defaultValue表示如果沒有JSESSIONID則預設為空。

@SessionAttribute註解 在這裡插入圖片描述 這個註解允許我們指定Model中的哪些屬性需要轉存到HttpSession物件中。

// Controller註解用於指示該類是一個控制器,可以同時處理多個請求動作
@Controller
// 將Model中的屬性名為user的放入HttpSession物件當中
@SessionAttributes("user")
public class SessionAttributesController{

	// 靜態的日誌類LogFactory
	private static final Log logger = LogFactory
            .getLog(SessionAttributesController.class);
	
	// 該方法對映的請求為http://localhost:8080/DataBindingTest/{formName}
	@RequestMapping(value="/{formName}")
	 public String loginForm(@PathVariable String formName){
		// 動態跳轉頁面
		return formName;
	}

	// 該方法對映的請求為http://localhost:8080/DataBindingTest/login
	@RequestMapping(value="/login")
	 public String login(
			 @RequestParam("loginname") String loginname,
			 @RequestParam("password") String password,
			 Model model ) {
		 // 建立User物件,裝載使用者資訊
		 User user = new User();
		 user.setLoginname(loginname);
		 user.setPassword(password);
		 user.setUsername("admin");
		 // 將user物件新增到Model當中
		 model.addAttribute("user",user);
		 return "welcome";
	 }
}

我們可以使用以下程式碼使用session的值: ${requestScope.user.username}//訪問request作用範圍域中的user物件 ${sessionScope.user.username}//訪問session作用範圍域中的user物件 另外@SessionAttributes還有如下說法: @SessionAttibutes(types={User.class,Dept.class},value={"user","dept"})