首页 > 代码库 > Struts2--result页面跳转forward--get方式和post方式的获取参数

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)代码:后面补上

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 =http://www.mamicode.com/ 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方式跳转覆盖了,真的烦,有时间补吧。然后我很多东西,也不懂时间工作中怎么操作的,只是自己思考的,尽自己所能的看看怎么实现,能不能实现。所以有前辈路过的话,不对的地方请指正。我一则是记录下,更多的是为了和我一样搜了好几页,也得不到解惑的人。谢谢大家了。

qq:2656062151  email:2656062151@qq.com

Struts2--result页面跳转forward--get方式和post方式的获取参数