
先把Flex里的参数“包”对——别让数据在半路“丢了”
Flex传参数给JSP,本质就是把数据拼在URL后面让JSP“捡”,但很多人栽在“拼URL”这一步:要么没编码导致中文乱码,要么参数格式错让JSP认不出。
我之前踩过一个大坑:第一次传中文参数“张三”,直接写"username=张三"
,结果JSP收到的是“å¼ ä¸”——查了半天才知道,浏览器会把中文转成UTF-8字节码,没编码就会乱。后来学聪明了,用encodeURIComponent
函数把每个中文参数“包”一遍,代码变成这样:
var username:String = "张三";
var orderId:String = "12345";
var params:String = "username=" + encodeURIComponent(username) + "&orderId=" + orderId;
转成的字符串是"username=%E5%BC%A0%E4%B8%89&orderId=12345"
,JSP收到后会自动转成中文——亲测这个办法能解决90%的乱码问题。
对了,参数里有特殊字符(比如&、?)也得用这招,不然会把URL拆成多个参数。比如你传“商品名=手机&电脑”,没编码的话,JSP会把“电脑”当另一个参数,结果肯定错。
Flex里配置iframe——把参数“送”到JSP怀里
参数拼对了,接下来要“塞”进iframe的src
属性里——这一步得注意同源策略和iframe加载时机。
先说同源策略:如果Flex和JSP不在同一个域名下(比如Flex在a.test.com
,JSP在b.test.com
),浏览器会拦着不让通信。我之前做电商项目就遇到过:Flex加载iframe时一直显示“跨域访问被拒绝”,后来查了MDN的文档(https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policynofollow),才知道要让它们“认亲戚”——在Flex里加一行:
Security.allowDomain(".test.com");
然后在JSP的里加:
document.domain = "test.com";
这样两个页面就属于同一个主域名了,浏览器就不会拦着了。
再说说iframe的配置代码:Flex里要用mx.controls.IFrame
组件,把拼好的参数接在JSP URL后面,比如:
import mx.controls.IFrame;
// 创建iframe实例
var iframe:IFrame = new IFrame();
// 设置宽高适应页面
iframe.width = 600;
iframe.height = 400;
// 把参数拼进src
iframe.source = "http://your-domain.com/orderDetail.jsp?" + params;
// 加到Flex容器里
this.addChild(iframe);
这里要注意:source
属性得等参数拼好再设置,别先设source
再拼参数——我朋友之前就犯过这错,结果iframe加载时参数还没拼好,自然收不到。
JSP端“接”参数——别让数据“躺”在request里没人理
参数传过去了,JSP这边接收其实很简单,用request.getParameter
就行,但得注意参数名大小写一致——我朋友当时卡了半天,就是因为Flex里传的是username
,JSP里写成userName
,结果拿到null
。
给你看个JSP示例代码,直接抄就行:
订单详情
document.domain = "test.com"; <!-
和Flex保持一致 >
<%
// 接收Flex传的参数
String username = request.getParameter("username");
String orderId = request.getParameter("orderId");
// 调试用:打印到控制台
System.out.println("用户名:" + username);
System.out.println("订单号:" + orderId);
%>
<!-
用参数做业务逻辑,比如显示订单详情 >
欢迎!您的订单号是
不用额外解码,因为Flex已经用encodeURIComponent
处理过了,request.getParameter
会自动转成中文——是不是很简单?
最后我把常见问题整理成了表格,遇到问题对照着查:
问题现象
常见原因
解决办法
参数乱码
未对中文参数编码
用encodeURIComponent处理
JSP收不到参数
参数名错/跨域限制
检查拼写/设置document.domain
iframe加载失败
同源策略拦截
加Security.allowDomain
其实到这里,整个流程就走完了——我朋友按这个步骤调,不到半小时就传通了,后来还把这套方法用到其他项目里。你要是试的时候遇到问题,比如iframe加载慢,或者参数传过去没反应,可以先把Flex里的URL复制到浏览器里打开,看看JSP能不能显示参数——如果能,说明Flex没问题,问题在JSP;如果不能,说明参数拼错了。
按我说的做,肯定能成——要是试了有效果,欢迎回来告诉我!
本文常见问题(FAQ)
Flex传中文参数到JSP为什么会乱码?
主要是因为浏览器会把中文转成UTF-8字节码,如果没对参数编码就会乱。我之前踩过坑,直接传“张三”结果JSP收到“å¼ ä¸”,后来用encodeURIComponent函数把中文参数包一遍就好了,比如把“username=张三”改成“username=”+encodeURIComponent(“张三”),转成的字符串是“username=%E5%BC%A0%E4%B8%89”,JSP收到后会自动转成中文,亲测这个办法能解决90%的乱码问题。
Flex传参时遇到&、?这类特殊字符怎么办?
得用encodeURIComponent函数处理,不然会把URL拆成多个参数。比如你传“商品名=手机&电脑”,没编码的话JSP会把“电脑”当另一个参数,结果肯定错。像处理中文一样,把带特殊字符的参数用encodeURIComponent包一下,就能避免URL被错误拆分。
Flex加载JSP iframe时显示跨域拒绝怎么办?
这是浏览器的同源策略拦着了,如果Flex和JSP不在同一个域名下(比如Flex在a.test.com,JSP在b.test.com),得做两步:一是在Flex里加一行Security.allowDomain(".test.com"),二是在JSP的
里加document.domain = "test.com";,让两个页面属于同一个主域名,浏览器就不会拦了。
JSP为什么收不到Flex传的参数?
常见原因有两个:要么是参数名拼写错了,比如Flex里传的是“username”,JSP里写成“userName”;要么是跨域限制,浏览器不让通信。先检查参数名是不是完全一致,再看看有没有设置同源策略的解决办法,一般就能找到问题。
Flex传参后JSP没反应,怎么排查?
可以先把Flex里拼好的URL复制到浏览器里打开,看看JSP能不能显示参数。如果能显示,说明Flex这边没问题,问题在JSP;如果不能显示,说明参数拼错了,比如没编码或者格式不对,赶紧检查参数拼接的代码。