UrlDecodeException异常:Struts2中Ajax读取div年份数据报错
Struts2中Div文本传参触发UrlDecodeException异常
问题场景
需求为从HTML获取年份信息,以此查询对应数据库数据。使用<s:select>选择年份时功能正常,但使用<div>中的文本年份作为参数请求时,抛出UrlDecodeException异常。
相关代码
URL定义
<s:url var="loaderURL" namespace="/myProject/myFolder" action="myAction" method="checkInformation"> </s:url>
正常工作的Select组件
<s:select id="year-select" data-url="%{#loaderURL}" name="years" list="items.years" listKey="value" listValue="label"/>
无法工作的Div组件
<div class="divClass" data-url="%{#loaderURL}"> <s:property value="items.year" /> </div>
jQuery代码
$("#year-select").each(function() { const url = $(this).attr('data-url'); fetchInformation(url, $(this).val()); $(this).change(function() { fetchInformation(url, $(this).val()); }); }); $(".divClass").each(function() { const url = $(this).attr('data-url'); fetchInformation(url, $(this).text()); });
异常信息
ERROR [io.undertow.request.io] (default I/O-22) UT005090: Unexpected failure: io.undertow.util.UrlDecodeException: UT000072: Failed to decode url /myProject/myFolder/%%7B to charset UTF-8
问题原因
<div>是原生HTML标签,Struts2不会自动解析其属性中的OGNL表达式。因此data-url="%{#loaderURL}"并未被替换为实际生成的URL,而是以原始字符串形式传递到前端。当jQuery获取该值并拼接参数时,%{被URL编码为%7B,又因场景触发双重编码变为%%7B,最终触发URL解码异常。
而<s:select>是Struts2内置标签,框架会自动解析%{#loaderURL}为实际请求URL,因此不会出现编码问题。
解决方案
方案1:用Struts2标签存URL,再通过EL表达式赋值
先通过<s:set>将URL变量存入页面上下文,再用EL表达式给div的data-url赋值:
<s:set var="loaderURLValue" value="#loaderURL" /> <div class="divClass" data-url="${loaderURLValue}"> <s:property value="items.year" /> </div>
方案2:直接在div属性中用<s:property>输出URL
利用Struts2的<s:property>标签直接输出URL值,替代OGNL表达式:
<div class="divClass" data-url="<s:property value='#loaderURL' />"> <s:property value="items.year" /> </div>
额外优化:清理文本多余空格
div的文本可能包含换行、空格等空白字符,建议在jQuery中添加trim()处理,避免无效参数:
$(".divClass").each(function() { const url = $(this).attr('data-url'); fetchInformation(url, $(this).text().trim()); });
内容的提问来源于stack exchange,提问作者LadySylwia
相关产品推荐
相关产品推荐

