Struts2--result頁面跳轉forward--get方式和post方式的獲取參數


一.總體概述

這篇文章是寫基於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方式跳轉覆蓋了,真的煩,有時間補吧。然后我很多東西,也不懂時間工作中怎么操作的,只是自己思考的,盡自己所能的看看怎么實現,能不能實現。所以有前輩路過的話,不對的地方請指正。我一則是記錄下,更多的是為了和我一樣搜了好幾頁,也得不到解惑的人。謝謝大家了。

 


免責聲明!

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



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