display:table调用Struts Action结果显示无记录,Action实际有30条数据求排查
我来帮你分析下这个问题——后台Action日志明明显示有30条数据,但DisplayTag却一直提示“no records to display”,大概率是数据访问路径或者属性配置的问题,给你几个具体的排查方向:
1. 先检查availableItems的Getter方法是否存在
Struts的OGNL表达式(就是你用的#passageAction.availableItems)不能直接访问Action的成员变量,必须通过公共的getter方法才能获取属性值。你需要确认PassageAction类里有没有写这个方法:
public List<?> getAvailableItems() { return availableItems; }
要是没这个getter,DisplayTag根本拿不到你存在availableItems里的数据,这是最常见的坑。
2. 验证<s:action>的参数传递是否真的正确
虽然你说后台日志有30条数据,但还是得确认JSP里传的参数是不是真的到了Action里:
- 可以在JSP页面临时加一行代码,打印下要传递的参数值:
<%= request.getParameter("itemBankID") %>和<%= request.getParameter("standardGuid") %>,看看这两个值是不是你预期的 - 另外也要检查Action类里有没有
setItemBankID()和setStandardGuid()这两个setter方法,不然参数传不进去,要是DAO是默认查全量数据那还好,但如果是依赖参数过滤的话,就会影响结果
3. 确认DisplayTag的name表达式能不能正确拿到数据
你可以在JSP里加个Struts标签,直接打印availableItems的数量,验证表达式是否正确:
<s:property value="#passageAction.availableItems.size()"/>
如果这个标签能输出30,说明表达式没问题;要是输出0或者空,那要么是passageAction变量没存到Action的结果,要么是availableItems没被正确赋值。
4. 看看<s:action>的executeResult属性有没有设错
默认情况下<s:action>的executeResult是false,这是对的——你只是要执行Action方法拿数据,不需要渲染它的result页面。但如果不小心设成了executeResult="true",Action的result页面可能会覆盖当前JSP的内容,间接导致DisplayTag拿不到数据。确保你的<s:action>标签没加这个属性,或者明确设为false。
5. 确认availableItems的类型符合DisplayTag要求
DisplayTag要求数据源得是List、Set这类Iterable集合,或者数组、Map,如果你的availableItems是自定义的集合类,可能识别不了。检查下passageDAO.list()返回的是不是标准的List类型。
按照上面的步骤一步步排查,应该很快能找到问题所在。
内容的提问来源于stack exchange,提问作者bryanforst

