Struts2:将参数传递给动作类不起作用

Posted

技术标签:

【中文标题】Struts2:将参数传递给动作类不起作用【英文标题】:Struts2: Pass parameter to the action class does not work 【发布时间】:2016-03-23 15:44:57 【问题描述】:

我正在使用 struts 2.3.24

我想将一些参数传递给动作类。这是我的链接。

<a id = "errorOid" 
 type = "submit"
 href = "<s:url action="SortIssue"><s:param name="sortField" value="ISSUE_OID"/></s:url>">
    Error Oid
</a>

当我点击链接时,它会转到 action 方法,但 sortField 总是为空。

这是我的行动:

<action name="SortIssue" method="sortIssue" class="foo.bar.IssueAction">
    <result name="success">/WEB-INF/issue.jsp</result>
    <result name="input">/WEB-INF/issue.jsp</result>
    <result name="login" type="redirectAction">Login</result>
    <interceptor-ref name="user-submit" />
</action>

这是点击链接时调用的方法。

public String sortIssue() throws ServiceFatalException,ServiceExpectedException
        Log.error(this,"################## inside sort ###################"+sortField);
        return SUCCESS;
    

我的问题是:

如何获取jsp传过来的参数?

也可以点击链接后获取隐藏参数吗?

注意:当我在迭代器中使用它时,传递参数的东西可以正常工作。

【问题讨论】:

尝试在文本已经用双引号括起来的地方使用单引号。通常struts 2框架会自动获取一个字段的值(仅由struts 2标签呈现),如果在属性的action类中定义了可访问的setter和getter 而且我认为如果您单击链接,则不会传递隐藏字段值。仅当您提交表单时才会传递此类字段 用引号表示这是一个字符串。 @SacJn:是的。我需要将提交按钮的 css 更改为看起来像命令链接(锚),以使其工作。 @Andrea Ligios :我有一个表格,我为每个标题放置了排序功能。我需要获取旧的排序(sortBy 和 sortOrder)以及新的 sortBy。通过传递参数,我可以获得新的 sortBy。因此,如果我想要旧的排序,我需要将其隐藏并通过提交按钮更改锚标记。我更改了提交按钮的 css 使其看起来类似于锚标记。 【参考方案1】:

这样试试

<s:url id="errorOid" action="sortIssue">
   <s:param name="sortField">ISSUE_OID</s:param>
</s:url>
<s:a href="%errorOid">Error Oid</s:a>

更多了解param,见下文

案例1

<s:param name="sortField">ISSUE_OID</s:param>

该值作为 java.lang.String 对象评估为值堆栈

案例2

<s:param name="sortField" value="ISSUE_OID"></s:param>

该值作为 java.lang.Object 对象评估为值堆栈。 详情请查看here。

【讨论】:

不不不。编辑毁了一切。 @Sai Ye Yan Naing Aye:你能不能改成 @SaiYeYanNaingAye:你能解释一下为什么它在 OP 案例中不起作用吗? @AleksandrM 当然。但现在我从办公室回来了。稍后我有时间,我会编辑我的答案。如果您有时间,请解释 OP 并发布您的答案。谢谢老兄。 看起来像是在黑暗中拍摄的。没有给你 cookie。【参考方案2】:

正如Tag Syntax documentation中解释的那样:

值是一个对象!

大多数情况下,value 属性是自动设置的,因为 name 属性通常告诉框架调用哪个属性来设置 价值。但是,如果有理由直接设置值,则 建议 value 是 Object 而不是 String

(警告) 由于 value 不是字符串,因此传递给 value 的内容是 评估为表达式 - NOT 字符串文字。

可能错了!

<s:textfield key="state.label" name="state" value="ca"/>

如果向文本字段传递值属性“ca”,框架将 查找名为 getCa() 的属性。一般来说,这不是我们的意思。 我们的意思是传递一个文字字符串。在表达式中 语言,文字放在引号内

以正确的方式传递文字值

<s:textfield key="state.label" name="state" value="%'ca'" />

另一种方法是使用成语value="'ca'",但是,在 在这种情况下,建议使用表达式表示法。

[...]

这意味着当您编写value="ISSUE_OID" 时,Struts 在值堆栈中搜索名为ISSUE_OID 的对象,在操作中搜索方法getISSUE_OID() 等等...

如果你想传递一个字符串字面量,你可以使用value="%'ISSUE_OID'",或者 将您的值放在标签的 html 正文中,因为不会评估 HTML 正文,并且您放入的所有内容都会变成字符串。

那么在你的情况下:

<s:param name="sortField" value="%'ISSUE_OID'"/>

<s:param name="sortField">ISSUE_OID</param>

【讨论】:

% 在这里并不真正需要,因为它已经被评估过。 +1 引用官方文档。 我几乎从不使用它,但是... :) @AndreaLigios:点击链接后是否可以获取隐藏参数? @AndreaLigios 你节省了我的时间:) +1 @Andrea Ligios:没错。天空是极限:)

以上是关于Struts2:将参数传递给动作类不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 AJAX 以绑定 DataTable 不起作用

将参数传递给 symfony 5.4 表单测试不起作用

将参数传递给可执行文件在 C++ 中不起作用

在运行时将参数传递给晶体报告不起作用

将过程参数传递给 SELECT INTO where 子句不起作用

当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?