一.总体概述
这篇文章是写基于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 = 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:[email protected]