一.總體概述
這篇文章是寫基於struts2(整合了ssh)的2個頁面之間的跳轉傳參。突然這天想到,struts2的result有很多的type類型(跳轉,重定向,。。。),於是就回憶起,跳轉和重定向的不同(跳轉地址欄不變,共享參數;重定向地址欄改變,不再共享參數)。心里好奇,struts2里頁面跳轉的時候,get的方式提交時怎么再第二個頁面獲取參數的,post是怎么在第二個頁面獲取參數的。重定向又是怎么樣的呢?真的抱歉,我今天花了一天時間,只弄清楚了頁面跳轉,關於頁面重定向傳參明天再搞。本來這篇博客都沒有的,因為我寫了一半了,把get方式的寫好了,搞post方式的時候太久了。回到這個頁面不小心把前面的寫的刪了,寫了新的話,一瞬間反應過來,晚了,自動保存了。。。時間寶貴者,可以直接看正文的第2部分
二.正文
1.get方式提交,頁面跳轉后,在后者頁面獲取參數。
(1)先是在start.hml頁面,用get方式提交數據(username,password)到ForwardAction,然后這個action返回SUCCESS(execute方法里沒有處理任何東西,只是返回SUCCESS),然后根據定義的result(name為success)采用type=dispatcher(即頁面跳轉)的方式,跳轉到后者頁面end.html。在end.html很簡單就能取到start.html頁面上傳的參數,因為頁面跳轉地址欄沒變化,而且get方式還是顯示上傳參數和值的,這樣我們只要用js去解析地址欄,獲取其中的上傳參數就行了。思路說道這里很多人應該就懂了,其實get方式的提交就變成了怎么用js去解析地址欄獲取上傳參數。由於之前寫的不小心覆蓋了,現在也很晚了,這個也簡單,沒辦法明天有時間補上來。
(2)代碼:
①:start.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="forget" method="get"> <table style="width:300px;height:150px;border:1px solid red;"> <tr><td>username:</td><td><input name="username"></td></tr> <tr><td>password:</td><td><input name="password"></td></tr> <tr><td colspan="2"><input type="submit" value="get方式跳轉頁面"></td></tr> </table> </form> </body> </html>
②:ForwardAction
package com.st.action; import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.ActionSupport; import net.sf.json.JSONObject; public class ForwardAction extends ActionSupport { private String username;//上傳參數:username private String password;//上傳參數:password public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //下面這個方法是處理start提交的請求的,其實沒有處理任何事,因為它的業務只是要跳轉到end頁面 public String execute(){ System.out.println("I have entered execute"); return SUCCESS; } }
③struts.xml
<!-- 對應的就是ForwardAction,bean的實例化是交由spring管理的 --> <package name="mytest" extends="struts-default"> <action name="forget" class="forwardaction" method="execute"> <result name="success">end.html</result> </action> </package>
④end.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script src="js/jquery-3.1.1.js"></script> </head> <body> <table style="width:400px;height:200px;border:1px solid red;"> <tr><td>接收的參數username:</td><td><div id="username" style="color:red;"></div></td></tr> <tr><td>接收的參數password:</td><td><div id="password" style="color:red;"></div></td></tr> <tr><td><input type="submit" value="點我接收get方式跳轉過來的參數" onclick="me()"></td></tr> </table> <script> //用正則表達式的方式從地址欄獲取參數值 function getQueryString(name){ var reg=new RegExp("(^|&)"+name+"=([^&]*)(&|$)"); var r=window.location.search.substring(1).match(reg); if(r!=null){ return unescape(r[2]); }else{ return null; } } //簡單的調用上面的函數,並且顯示下參數值 function me(){ $('#username').html(getQueryString('username')); $('#password').html(getQueryString('password')); } </script> </body> </html>
(3)相關截圖
2.post方式提交,頁面跳轉后,在后者頁面獲取post方式上傳的參數
(1)概述:這個我也是覺得get方式能獲取,post是地址欄看不見的,那該怎么獲取呢,能獲取嗎?我去百度搜了,很多“不能”“不知道,沒試過”“通過ajax”,但是說實話,說的很模糊。於是我開始想,我肯定是不可能僅僅再通過js來獲取post方式上傳的參數了,因為地址欄看不見。於是我第一時間也是想到ajax,通過ajax去后台拿到我想要的數據嘛(真是說的容易,一步步實現也是要小心翼翼)。
①:teststart.html頁面通過post的方式提交2個參數(username,password)到ForwardAction(之前的已經被改寫)
②在ForwardAction中,需要寫2個方法(execute和myexecute),execute方法是用來讓teststart.html這個前者頁面跳轉到testend.html頁面的。而myexecute方法是用來處理tesstart.html上傳的參數的(把那些請求參數封裝成json字符串,因為后面我們要在后者頁面通過調用ajax的方式來獲取這些請求參數)。還有就是execute方法返回的是默認的SUCCESS,畢竟它只是跳轉頁面不用干什么事,而myexecute是返回一個“me”(我自定義的result的名字)。這個action里還好沒什么很需要注意的地方。
③重點在這個struts.xml文件里。這里很需要注意一些地方。先說一個東西,就是一個頁面上傳了參數到一個action,想讓第二個頁面得到上傳的action,所以我們只能用一個同一個Action,並且這個Action必須是單例(singleton)。這樣才能保證我們每次開始請求,並且在跳轉了頁面再次請求action時,我們能過獲取的是同一個實例,而不是新的實例(如果是新的實例,相當於new了一個對象,這個對象怎么可能還有你之前存的值嘛)。回來,繼續說,由於我們要調用同一個action里的不同的方法,所以有涉及了新的知識點--struts動態調用。我這里采用的是通配符動態調用方法,我剛好用的是2.5,很不幸有版本問題,遇到了很多問題,我會抽空寫博客再記錄過程中要注意的細節。最后一點了,就是我們ajax要調用action並且返回json數據,那個name為me的result的type要為json,這個我已經寫過博客了(鏈接:http://www.cnblogs.com/horsen/p/6714952.html)。
④在testend.html通過ajax方式從action返回需要的上傳參數。我頁面里是寫了個按鈕去點擊觸發函數,具體跳轉過程中可以自動加載后調用,或者用到的時候調用那個函數,就能拿到我們需要的請求參數。
⑤總結下,就是2個html頁面(跳轉前和跳轉后),1個Action2個方法(一個處理前者頁面請求,一個處理后者頁面ajax請求),1個配置文件(配置那個action和它的2個result{一個類型是dispatcher,一個類型是json})。
(2)代碼:
①teststart.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/jquery-3.1.1.js"></script> </head> <body> <h3 style="color:red">提交數據部分</h3> <form action="test_execute" method="post"> <table style="border:1px solid black;width:300px;height:150px;"> <tr> <td>username:</td> <td><input type="text" id="username" name="username"></td> </tr> <tr> <td>password:</td> <td><input type="password" id="password" name="password"></td> </tr> <tr> <td colspan="2"><input type="submit" value="將request轉發到end頁面" style="width:250px;height:30px;display:block;border: none;background:blue;color:white;" ></td> </tr> </table> </form> </body> </html>
②ForwardAction
package com.st.action; import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.ActionSupport; import net.sf.json.JSONObject; public class ForwardAction extends ActionSupport { private String username="root";//上傳參數:username private String password="root";//上傳參數:password private String returndata;//這個json字符串用於存儲post上傳參數的 public String getReturndata() { return returndata; } public void setReturndata(String returndata) { this.returndata = returndata; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //下面這個方法是處理teststart提交的請求的,其實沒有處理任何事,因為它的業務只是要跳轉到testend頁面 public String execute(){ System.out.println("I have entered execute"); return SUCCESS; } //下面這個方法是處理testend頁面ajax調用的,把之前teststart上傳的參數封裝成json字符串,然后返回一個result public String myexecute(){ //開始--封裝上傳數據成json Map<String,String> map=new HashMap<String,String>(); map.put("backusername", username); map.put("backpassword", password); //上面的map不是json對象當然是不可以用於返回的,於是呢我們要把它搞成json字符串,你也可以自己去拼json字符串。 JSONObject json=JSONObject.fromObject(map); returndata=json.toString(); //結束--封裝上傳數據成json //返回一個自定義的字符串作為第二個result的name return "me"; } }
③struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 注意上面的頭聲明,文檔類型里,對應版本號改好。 --> <!-- 關聯spring,讓spring去實例化並管理bean --> <constant name="struts.objectFactory" value="spring"></constant> <!-- 開啟!動態調用方法 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 測試專用package-start --> <!-- 下面這句注意:要多繼承一個包“json-default",后面返回json數據要用到 --> <package name="mytest" extends="struts-default,json-default"> <!-- 下面這句:action的通配符設置,自己去查去搜怎么用,要注意2.3版本以上的設置 --> <action name="test_*" class="forwardaction" method="{1}"> <!-- 下面這句:這個result是對應teststart頁面請求的結果,僅僅是跳轉到testend頁面 --> <result name="success" type="dispatcher">testend.html</result> <!-- 下面這句注意:這個result是響應testend頁面ajax請求的結果,name可以自定義(和action里一樣就行),type要注意設置為json --> <result name="me" type="json"> <!-- 下面這句注意:name要設置為root,不要弄自定義,這里有很多東西,不一一說了,有時間寫博客。然后這個“returndata”對應action里那個存數據的json字符串變量名 --> <param name="root">returndata</param> </result> <!-- 下面這句注意:2.3版本以上的千萬注意這里,要寫這一句話,標簽內寫允許訪問的方法名。最上面文檔類型里版本號也要改好 --> <allowed-methods>myexecute,execute</allowed-methods> </action> </package> <!-- 測試專用package-end --> </struts>
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-----注意spring里那個bean的scope要設置為單例:<bean id="forwardaction" class="com.st.action.ForwardAction" scope="singleton"></bean>
④testend.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script src="js/jquery-3.1.1.js"></script> </head> <body> <table style="border:1px solid black;width:500px;height:200px;"> <tr> <td>接收從teststart傳過來的username:</td><td><div id='username' style="color:red;"></div></td> </tr> <tr> <td>接收從teststart傳過來的password:</td><td><div id='password' style="color:red;"></div></td> </tr> </table> <input onclick="me()" value="點我獲取teststart傳過來的參數" type="button"> <script> function me(){ $.ajax({ url:'test_myexecute.action', type:'post', dataType:"json", success:function(data){ //有時候感覺接受的數據總是顯示各種亂七八糟的錯誤,你可以先alert看下,傳回的是什么東西 alert(data); //隨便的顯示一下傳回的數據嘍 var backdata=JSON.parse(data); //傳回的是json字符串,要先把它轉換成js中的類對象,對於json字符串和json對象自己去百度 $('#username').html(backdata.backusername);//將json字符串轉換成json對象后,就可以這樣獲取其中的值。 $('#password').html(backdata.backpassword); } }); } </script> </body> </html>
三.相關截圖:
四.一點話
很晚了,不過寫完了還是很舒服的。唯一遺憾的是不小心把寫好的get方式跳轉覆蓋了,真的煩,有時間補吧。然后我很多東西,也不懂時間工作中怎么操作的,只是自己思考的,盡自己所能的看看怎么實現,能不能實現。所以有前輩路過的話,不對的地方請指正。我一則是記錄下,更多的是為了和我一樣搜了好幾頁,也得不到解惑的人。謝謝大家了。