You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)}" />

错误原因解析

  1. 直接写myvar导致NULL:OGNL会去当前Action中寻找名为myvar的属性,而非你用<s:set>定义的页面变量,因此传值为NULL。
  2. 嵌套${myvar}报错:%{}本身就是OGNL表达式容器,不能在其中嵌套EL表达式${},这违反了标签语法规则,所以会抛出“属性不接受表达式”的错误。
  3. 省略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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:48:22