這里整理一下Spring框架下,如何獲取頁面參數,以及如何將后台數據傳到頁面,最后是了解重定向的使用。前期的配置參考文末第一篇博文,這里添加一個登陸的界面,用於測試向頁面傳遞參數,以及登陸完成后結果界面兩個(成功界面和失敗界面),其他就是添加一個控制器,往里面添加方法進行測試了。
測試頁面准備
登陸界面
1 <%@page pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 2 <!-- 通過httpServletRequest的方式獲取頁面參數 --> 3 <!-- <form action="loginOK.do" method="GET" />--> 4 <!-- 測試通過注解方式提交 --> 5 <!-- <form action="loginOK_annotation.do" method="GET"> --> 6 <!-- 通過javabean的方式 --> 7 <!-- <form action="loginOK_javabean.do" method="GET"> --> 8 <!-- 向頁面傳值測試 --> 9 <!-- <form action="loginOK_param.do" method="GET">--> 10 <!-- 使用ModelAndView向頁面傳值 --> 11 <!-- form action="loginOK_ModelAndView.do" method="GET">--> 12 <!-- 使用ModelMap向頁面傳值 --> 13 <!-- <form action="loginOK_ModelMap.do" method="GET">--> 14 <!-- 使用session向頁面傳值 --> 15 <!-- <form action="loginOK_session.do" method="GET">--> 16 <!-- 如果方法的返回值是String,重定向寫法 --> 17 <!-- form action="loginOK_redirect_str.do" method="GET">--> 18 <!-- 如果方法的返回值是ModelAndView,則需要先創建RedirectView,然后創建ModelAndView --> 19 <!-- <form action="loginOK_redirect_mm.do" method="GET"> --> 20 <input type="text" name="user"/>用戶名 <br/> 21 <input type="password" name="pwd" />密碼 <br/> 22 <button>登錄</button> 23 </form>
登陸成功界面
1 <%@page pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 2 <h1>歡迎登陸</h1><br/> 3 <!-- 得到服務器返回的user參數,采用el表達式獲取 --> 4 ${user }
登陸失敗界面
1 <%@page pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 2 <h1>登陸失敗</h1>
獲取頁面參數
方式1:通過request來獲得,在前端控制器方法里添加HttpServletRequest類型的參數request,通過java反射機制,在調用方法前會檢查參數類型,從而將request傳入到服務器,可以獲取request里面的參數
1 /** 2 *登錄檢查 3 * @return 4 */ 5 @RequestMapping("/login.do") 6 public String login() { 7 System.out.println("跳轉到登陸頁面"); 8 return "login"; 9 10 } 11 /** 12 * 獲取頁面參數值,進行登陸檢查 13 * 登錄時如何獲取瀏覽器發送給服務器的參數呢,可以在logincheck里加參數HttpServletRequest 14 * DispatcherServlet前端控制器在調用處理器方法之前,會利用java反射機制分析方法的結構,如下方法 15 * 會通過分析,將request對象傳過來 16 * @return 17 */ 18 @RequestMapping("/loginOK.do") 19 public String logincheck(HttpServletRequest request) { 20 System.out.println("使用httpServletRequest的方式獲取"); 21 String name=request.getParameter("user"); 22 String pwd=request.getParameter("pwd"); 23 System.out.println("name是:"+name); 24 System.out.println("pwd是:"+pwd); 25 //模擬DAO檢查數據庫 26 loginDAO DAO=new loginDAO(); 27 int result=DAO.loginCheck(); 28 if(result>0) { 29 return "loginOK"; 30 }else { 31 return "loginNG"; 32 } 33 }
測試結果

控制台

方式2:通過@RequestParam注解的方式,適合少量請求參數
1 /** 2 * 通過注解方式獲取參數,適合少量參數 3 * @return 4 */ 5 @RequestMapping("/loginOK_annotation.do") 6 /* 7 * JSP表單提交給服務器時,DispatherServlet在方法執行之前掃描里面的參數,發現有和JSP表單中同名的 8 * user和pwd,這樣會調用request.getParameter("user")和request.getParameter("pwd")方法 9 * 得到參數。如果user和pwd和JSP表單中寫的不一樣怎么辦?可以通過加注解@RequestParam("")來解決 10 * 如下,表單中提交的是pwd對應的參數,在注解里加上pwd即可 11 * 12 * 建議參數前加上注解@RequestParam 13 */ 14 public String login_annotation(String user,@RequestParam("pwd") String password) { 15 System.out.println("通過注解的方式獲取參數"); 16 System.out.println("用戶名是:"+user); 17 System.out.println("密碼是:"+password); 18 return "loginOK"; 19 }
測試結果

控制台

方式3:將要請求的參數封裝成javabean,適合大量請求參數,這里寫一個javabean。
javabean
1 package Controller; 2 /** 3 * 用於封裝請求參數值的類,屬性名和請求參數名一致,類型要匹配,並提供參數get set方法 4 * (如果類型不一樣,會自動做類型轉換,比如將string類型自動轉化為int類型) 5 * 6 * @author yangchaolin 7 * 8 */ 9 public class userParam { 10 private String user; 11 private String pwd; 12 private int age; 13 //get set方法 14 public int getAge() { 15 return age; 16 } 17 public void setAge(int age) { 18 this.age = age; 19 } 20 public String getUser() { 21 return user; 22 } 23 public void setUser(String user) { 24 this.user = user; 25 } 26 public String getPwd() { 27 return pwd; 28 } 29 public void setPwd(String pwd) { 30 this.pwd = pwd; 31 } 32 }
1 /** 2 * 通過javabean的方式獲取參數,適合大量參數 3 * DispatcherServlet在方法執行之前會檢查userParam類型的參數,發現里面有和JSP提交name相同的屬性名 4 * 則會將參數set到userParam對象中,然后通過類的get方法可以得到用戶名和密碼 5 * @return 6 */ 7 @RequestMapping("/loginOK_javabean.do") 8 public String login_javabean(userParam up) { 9 System.out.println("通過javabean的方式獲取參數"); 10 System.out.println("用戶名是:"+up.getUser()); 11 System.out.println("密碼是:"+up.getPwd()); 12 System.out.println("年齡是:"+up.getAge()); 13 return "loginOK"; 14 }
測試結果

控制台

向頁面傳值
方式1 將數據綁定在request里,默認情況下DispatcherServlet會使用轉發。
1 /** 2 * 通過httpServletRequst向頁面傳值 3 * @param up 4 * @param request 5 * @return 6 */ 7 @RequestMapping("/loginOK_param.do") 8 public String login_param(userParam up,HttpServletRequest request) { 9 System.out.println("使用Request向頁面傳遞參數"); 10 System.out.println("用戶名是:"+up.getUser()); 11 System.out.println("密碼是:"+up.getPwd()); 12 //將數據綁定到request,再轉發JSP 13 request.setAttribute("user", up.getUser()); 14 //默認情況下DispatcherServlet會使用轉發 15 return "loginOK"; 16 }
測試結果

控制台

方式2 返回ModleAndView對象,里面可以有包含數據的Map
1 /** 2 * 使用ModelAndView的方式給頁面傳值 3 * @return 4 */ 5 @RequestMapping("/loginOK_ModelAndView.do") 6 public ModelAndView login_modelAndView(userParam up) { 7 System.out.println("使用ModelAndView向頁面傳遞參數"); 8 String user=up.getUser(); 9 System.out.println("用戶名是:"+user); 10 //1 將數據添加到map對象 11 Map<String,Object> map=new HashMap<String,Object>(); 12 //map中數據會綁定到請求request中,相當於執行了request.setAttribute("user",user) 13 map.put("user", user); 14 //2 將數據對象map放到ModelAndView中 ,並返回 15 return new ModelAndView("loginOK",map); 16 }
測試結果

控制台

方式3 將數據添加到ModelMap里
1 /** 2 * 使用ModelMap向頁面傳值 3 * @return 4 */ 5 @RequestMapping("/loginOK_ModelMap") 6 public String login_modelMap(userParam up,ModelMap mm) { 7 System.out.println("使用ModelMap向頁面傳遞參數"); 8 String user=up.getUser();System.out.println("user為:"+user); 9 mm.addAttribute("user", user); 10 return "loginOK"; 11 }
測試結果

控制台

方式4 將數據綁定到session里
1 /** 2 * 測試使用session向頁面傳值,使用反射,將HttpSession放到方法里 3 * 前端控制前在調用這個方法之前會檢查方法里的參數,發現有session 4 * 會把session對象傳進來,會提前執行request.getSession()得到session然后傳入到參數里 5 * @param up 6 * @param session 7 * @return 8 */ 9 @RequestMapping("loginOK_session.do") 10 public String login_session(userParam up,HttpSession session) { 11 System.out.println("使用session向頁面傳遞參數"); 12 session.setAttribute("user", up.getUser()); 13 return "loginOK"; 14 }
測試結果

在滿足使用條件的情況下,優先使用生命周期短的,如request,可以節省內存資源,session的生命周期最長,最后考慮。
重定向
重定向執行了兩次請求,最后面看到的是重定向后的地址。
case1 如果方法的返回值是String,方法return "redirect:login.do"
1 /** 2 * 重定向,返回值是string的情況 3 * @param up 4 * @return 5 */ 6 @RequestMapping("loginOK_redirect_str.do") 7 public String login_redirect_str(userParam up) { 8 System.out.println(up.getUser()); 9 System.out.println("頁面提交后重定向到登錄頁面"); 10 //重定向 11 return "redirect:login.do"; 12 }
控制台

case2 如果方法的返回值是ModelAndView,首先創建RedirectView rv=new RedirectView("login.do"),再創建ModelAndView mm=new ModelAndView(rv)返回到前端控制器;
1 /** 2 * 重定向,返回值是ModelAndView的情況 3 * @return 4 */ 5 @RequestMapping("loginOK_redirect_mm.do") 6 public ModelAndView login_redirect_mm() { 7 System.out.println("頁面提交后重定向到登錄頁面-ModelAndView"); 8 //先創建RedirectView,再創建ModelAndView 9 RedirectView rv=new RedirectView("login.do"); 10 ModelAndView mm=new ModelAndView(rv); 11 return mm; 12 }
控制台

參考博文:
