如何在JSP中从变量传参调用Struts2 Action方法?
解决Struts2中<s:property>调用带参数Action方法时变量传值为NULL的问题
问题核心
你遇到的问题根源是OGNL表达式没有正确引用<s:set>定义的变量——Struts2的OGNL默认会从Action的属性中查找变量,而<s:set>定义的变量默认存储在ValueStack的context中,需要特殊的引用方式。
正确写法
直接在OGNL表达式中用#前缀引用<s:set>的变量即可:
写法1(带get前缀)
<s:set var="myvar" value="..." /> <!-- 正确调用方式 --> <s:property value="%{getActionCategory(#myvar)}" />
写法2(省略get前缀,Struts2支持这种属性式方法调用)
<s:set var="myvar" value="..." /> <s:property value="%{actionCategory(#myvar)}" />
错误原因解析
- 直接写
myvar导致NULL:OGNL会去当前Action中寻找名为myvar的属性,而非你用<s:set>定义的页面变量,因此传值为NULL。 - 嵌套
${myvar}报错:%{}本身就是OGNL表达式容器,不能在其中嵌套EL表达式${},这违反了标签语法规则,所以会抛出“属性不接受表达式”的错误。 - 省略get的写法仍传NULL:和第一个错误原因一致,未用
#引用context中的变量,OGNL依旧去Action里查找属性,自然找不到对应值。
特殊情况:指定了scope的<s:set>
如果你的<s:set>指定了scope(比如scope="page"、scope="request"),需要用#attr.变量名来引用:
<s:set var="myvar" value="..." scope="page" /> <s:property value="%{getActionCategory(#attr.myvar)}" />
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

