Struts2无URL参数时文本框显示DefaultTextProvider异常如何解决
问题原因
- 标签语法混用错误:
- 代码中混淆了JSTL标签和Struts2标签的用法:
<c:set>属于JSTL核心标签,但闭合标签误写为</html:set>,语法错误导致变量赋值逻辑完全失效; textfield是Struts2标签库提供的组件,不属于JSTL标签,代码误写为<c:textfield>会导致标签属性解析逻辑异常。
- 代码中混淆了JSTL标签和Struts2标签的用法:
- OGNL表达式空值解析逻辑问题:Struts2标签中
%{}格式的OGNL表达式在对应变量不存在、求值为空时,会默认查找值栈中的TextProvider实例,匹配不到对应属性就会直接输出com.opensymphony.xwork2.DefaultTextProvider类名。 - 你在JSP脚本中为
user设置的空字符串默认值,因为前面的标签语法错误,根本没有正确存入页面上下文变量,导致表达式求值时找不到对应值。
修复方案
方案1:修正标签写法,保留原有赋值逻辑
修正标签使用错误,同时给OGNL表达式增加空值判断即可:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <%@ taglib prefix="html" uri="/struts-tags"%> <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%> <% String user = request.getParameter("user"); if(user == null) user = ""; %> <!-- 修正set标签语法,正确给user变量赋值 --> <c:set var="user" value="<%=user%>" /> <!-- 改用Struts2的textfield标签,增加空值判断 --> <html:textfield id="user" name="user" value="%{#user == null ? '' : #user}" />
方案2:简化实现逻辑,无需额外变量
直接通过Struts2原生的参数获取逻辑直接读取请求参数,自动处理空值,不需要写JSP脚本和JSTL赋值:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <%@ taglib prefix="html" uri="/struts-tags"%> <html:textfield id="user" name="user" value="%{#parameters.user[0] == null ? '' : #parameters.user[0]}" />
内容的提问来源于stack exchange,提问作者ice
相关产品推荐
相关产品推荐

