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和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"})