Tapestry中ZoneUpdater传递特殊字符字符串异常的解决求助
解决Tapestry ZoneUpdater传递特殊字符时的截断/转义问题
这个问题我刚接触Tapestry做AJAX交互时也踩过坑!核心原因是ZoneUpdater默认使用GET请求传递参数,而URL里的#、&、+这些字符有特殊含义:
#是URL锚点分隔符,浏览器不会把#及后面的内容发送给服务器;&是URL参数分隔符,会把你的参数拆成多个片段,导致服务器只收到&之前的内容;+在URL编码规则里代表空格,所以会被自动转义成空格。
解决方案:改用POST请求传递参数
只需要给ZoneUpdater添加method="post"配置,让参数通过请求体传递,避开URL解析的干扰。
修改后的前端代码:
<t:if test="needsSetName"> <label for="userfunction">${message:setname}</label> <t:textfield t:mixins="zoneUpdater" tabindex="-1" autofocus="false" ZoneUpdater.clientEvent="keyup" ZoneUpdater.event="valueChangedSetName" ZoneUpdater.zone="transferZone" ZoneUpdater.timeout="3000" ZoneUpdater.method="post" <!-- 新增这行,指定用POST请求 --> t:id="setName" value="setName"/> </t:if>
后端代码无需修改(保持你的原代码即可):
@OnEvent(value = "valueChangedSetName") protected void onValueChangedSetName(@RequestParameter(value = "param", allowBlank = true) String setName) { TransferOrder to = baskets.getTransferOrder(); this.setName = setName; to.setComment("Rename from " + this.setName + " to " + setName); nextSetName = setName; zoneHubService.updatePendingTransfer(); zoneHubService.addCallback(new JavaScriptCallback() { @Override public void run(JavaScriptSupport javascriptSupport) { javascriptSupport.addScript( String.format("var thing=jQuery('#%s'); thing.focus();thing[0].setSelectionRange(10000, 10000);", setNameField.getClientId())); } }); }
为什么这样有效?
POST请求会把参数放在请求体里,而不是URL的查询字符串中:
#、&这些字符不再被当作URL的特殊分隔符,会完整发送到服务器;- Tapestry会自动解析请求体中的参数,正确解码
+等字符,还原你输入的原始内容。
如果之后还遇到其他特殊字符的编码问题,可以确认ZoneUpdater的客户端代码是否用encodeURIComponent对参数进行了编码(Tapestry的默认实现已经做了这件事),确保参数在传输过程中不会被破坏。
内容的提问来源于stack exchange,提问作者Yupp
相关产品推荐
相关产品推荐

