idt -c 没变化 如果 () allow post 方式 定向
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 classForwardActionextends ActionSupport {
- privateString username="root";//上传参数:username
- privateString password="root";//上传参数:password
- privateString 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(){
- //开始--封装上传数据成jsonMap map=newHashMap();
- 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 要设置为单例:scope="singleton">
④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]
[email protected]��参数
来源: http://www.bubuko.com/infodetail-2028682.html