在用注解對配置 處理器時,一般是一個方法處理一個請求,不同方法的返回類型有着不同的意義。
返回值為 ModelAndView 類型
ModelAndView 是Model 和 View 的一個集合類型,其中Model 是一個Map類型的空間,其主要用來存儲頁面請求的返回數據
而view 則一般是用來存儲 請求數據 將要被 接收的 頁面(一般為頁面名稱),也是服務器響應的頁面(即前端得到響應后要顯示的頁面)
@RequestMapping("/find.action") public ModelAndView findUser(){ List<User> users = us.findAllUsers(); ModelAndView mav = new ModelAndView(); mav.addObject("users", users); mav.setViewName("showUser");//使用轉發 return mav; }
返回值 為 String 類型(比較常用)
如果controller方法返回string,
1、表示返回邏輯視圖名。
真正視圖(jsp路徑)=前綴+邏輯視圖名+后綴 return "index"
2、redirect重定向
redirect重定向特點:瀏覽器地址欄中的url會變化。修改提交的request數據無法傳到重定向的地址。因為重定向后重新進行request(request無法共享)
return "redirect:xxx.action" 重定向到另一個Action 請求中
3、forward頁面轉發
通過forward進行頁面轉發,瀏覽器地址欄url不變,request可以共享。
return "forward:xxx.action"
返回值為void 時
在controller方法形參上可以定義request和response,使用request或response指定響應結果:
1、使用request轉向頁面,如下:
request.getRequestDispatcher("頁面路徑").forward(request, response);
2、也可以通過response頁面重定向:
response.sendRedirect("url")
3、也可以通過response指定響應結果,例如響應json數據如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
@RequestMapping("/find.action") public void findUser(HttpServletRequest request,HttpServletResponse response){ //使用原始servlet的形式進行數據和頁面的處理 }
請求參數:
客戶端的請求參數一般是k/v的結構 key=value 如 id=1&name="zhangsan";
springmvc中,接收頁面提交的數據是通過方法形參來接收的;
//前台頁面發送xxxx?name=zhangsan&pwd=123的請求,springmvc將 //name設為參數user的name屬性值 //pwd設為參數user的pwd屬性值 //如果請求參數名和參數對象的屬性名不一致,不會注入 @RequestMapping(value="/save.action",method=RequestMethod.POST) public String saveUser(User user){ // User user = new User(); // user.setName(name); // user.setPwd(pwd); us.saveUser(user); return "redirect:find.action"; }
一般類型的參數是可以直接被直接注入進對象的同名屬性的,對日期數據綁定需要自定義converter(轉換器)
進行參數綁定時的注解:
1、@requestParam()
該注釋可以將請求的字符串轉換為簡單的數據類型 如:test(@requestParam("id") int id)
也可以匹配不是同名的參數 如:test(@requestParam("username") String name)
也可以設置參數的必需屬性 如:test(int id ,@requestParam("username" , required=true) String name) 此時,如果請求參數中沒有username這個值是,就會報錯
三種寫法,test(String name),
test(@RequestParam String name),
test(@RequestParam("userName") String name),
第一種如果沒有name 參數不會報錯,
第二種沒有name 參數會報錯,(也可以設置required = false),
第三種跟第二種的區別是 請求的參數名userName轉換成方法的參數name
2、@ModelAttribute 該注解有兩個用法,一個是用於方法上,一個是用於參數上;
用於方法上時: 通常用來在處理@RequestMapping之前,為請求綁定需要從后台查詢的model;即在執行@RequestMapping 的方法之前 執行 @ModelAttribute的方法 將相關參數放到請求域中(默認都是存放在請求域中的)
//這個方法找到了一個User,並且把這個User放入到ModelAttribute中的user屬性 //@ModelAttribute修飾的方法一定會在@RequestMapping方法前執行 @ModelAttribute("user") public User findUser(){ User user = us.findUserById(9); return user; }
用於參數上時: 用來通過名稱對應,把相應名稱參數的值綁定到注解的參數bean上;要綁定的值來源於:
A) @SessionAttributes("name") 啟用的session域的attribute 對象上;(即方法的形參的值來源於session域中的 name 的值)
B) @ModelAttribute(“name”) 用於方法上時指定的model對象;(即方法的形參的值來源於請求域中的 name 的值)
C) 上述兩種情況都沒有時,new一個需要綁定的bean對象,然后把request中按名稱對應的方式把值綁定到bean中(默認)
@SessionAttributes
該注解用來綁定HttpSession中的attribute對象的值,便於在方法中的參數里使用。
該注解有value、types兩個屬性,可以通過名字和類型指定要使用的attribute 對象;