Spring入門-獲取頁面參數&向頁面傳值&重定向


這里整理一下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 }
View Code
 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     }

控制台

 

參考博文:

(1)https://www.cnblogs.com/youngchaolin/p/11349493.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM