Struts 2 问题:通过超链接传递至Action的参数为null
我之前也踩过Struts2参数传递的坑,折腾了好几天才捋清楚,给你梳理几个最关键的排查方向,应该能帮你解决问题:
检查Action类的参数与getter/setter规范
首先要确保你的Action类里有和参数名pdfName完全一致的私有变量,比如:private String pdfName;重点!Struts2是通过JavaBean规范的getter/setter来注入参数的,所以必须严格按照规则写:
public String getPdfName() { return pdfName; } public void setPdfName(String pdfName) { this.pdfName = pdfName; }大小写绝对不能错,比如别写成
getPDFName或者setpdfName,这种小失误很容易导致参数注入失败。检查JSP中超链接的写法
如果你用的是普通HTML的<a>标签,要确保参数拼接的格式正确,比如在遍历pdfList时:<a href="yourTargetAction.action?pdfName=${pdfItem.pdfName}">${pdfItem.pdfName}</a>更推荐用Struts2的
<s:a>标签配合<s:param>,它会自动处理URL编码和OGNL表达式解析,避免很多坑:<s:a action="yourTargetAction"> <s:param name="pdfName" value="%{pdfItem.pdfName}" /> ${pdfItem.pdfName} </s:a>注意循环中的变量名要和你迭代的对象属性对应,别写错OGNL表达式。
确认Struts2配置文件的Action映射
打开struts.xml,检查你的Action配置是否包含了params拦截器——默认的defaultStack已经包含这个拦截器,但如果是自定义拦截器栈,一定要手动加上:<action name="yourTargetAction" class="com.yourpackage.YourActionClass"> <interceptor-ref name="defaultStack" /> <!-- 必须包含这个,否则参数无法注入 --> <result name="success">/yourResultPage.jsp</result> </action>同时要确认Action的类路径完全正确,包名、类名写错的话,Struts2找不到对应的Action,参数自然接收不到。
开启调试日志排查细节
在struts.xml里开启开发模式:<constant name="struts.devMode" value="true" />然后查看控制台日志,Struts2会详细输出参数接收的过程,比如有没有捕获到
pdfName参数,或者有没有报错提示“找不到getter方法”之类的信息,能帮你快速定位问题根源。排查参数的编码问题
如果pdfName包含中文、空格或特殊字符,普通<a>标签的手动拼接可能会导致编码错误,Struts2无法解析。这种情况一定要用<s:a>+<s:param>的组合,它会自动处理URL编码,避免乱码或参数丢失。
内容的提问来源于stack exchange,提问作者Ambidextrous

