在我的jsp文件中,我设置了变量statusNum的值。当我尝试将statusNum
的值传递给方法getStatusString()
时(此方法在Action类中定义),statusNum
的值为null。但是当我使用${statusNum}
显示时,我获得了价值。这是我的代码。
<table style="width: 100%;">
<s:iterator value="emailList">
<tr>
<td style="width:39%"><s:property value='name'/></td>
<td style="width:39%;"><s:property value='email'/></td>
<s:set var="statusNum"><s:property value="status"/></s:set>
${statusNum}
<s:set var="stringNum" value="%{getStatusString(#statusNum)}"/>
</tr>
</s:iterator>
</table>
这是Action类
中getStatusString()方法的框架public String getStatusString(Integer sendStatus) {
-------------
------------- //code returning string value
-------------
}
请通过方法statusNum
帮助我获取与getStatusString()
对应的状态字符串值。
答案 0 :(得分:1)
您应该尝试使用<s:property value="%{getStatusString(#statusNum)}"/>
标记来调用操作方法。
Anwyay ......在我看来,这不是一个好选择......为什么你应该在jsp中调用一个action方法并将业务层与表示层混合?
更容易移动控制器内的所有内容并使用jsp来渲染结果。
我的意思是......你在两个不同的阶段切换一个操作。您的操作是创建名为Collection
的{{1}},然后在jsp中迭代您的集合。在迭代时,调用方法来获取状态字符串。
工作流程:操作 - &gt; jsp - &gt;迭代 - &gt; {方法x n} - &gt;结果
为什么不在行动中准备该状态字符串?通过这种方式,您只需打印该值,您的堆栈将不会充满“垃圾”(如果我们可以这样说)。
工作流程:操作 - &gt; jsp - &gt;迭代 - &gt;结果
emailList
如果该字符串可能会随着时间的推移而改变,那么请使用Ajax。为了让您的页面始终以更加安全的方式进行刷新。
答案 1 :(得分:1)
我不确定为什么它不起作用,但因为它是一个数字,你应该做
<s:set var="statusNum" value="status"/>
而不是
<s:set var="statusNum"><s:property value="status"/></s:set>
将其用作HTML,因此用作String。
IlGala是对的,您应该在控制器或emailList
bean上执行此操作,但您也可以使用this answer中所述的其他技巧:
迭代emailList对象并调用action方法而不传递任何参数:
<s:iterator value="emailList">
<tr>
<td> <s:property value='name'/> </td>
<td> <s:property value='email'/> </td>
<td> <s:property value="status"/> </td>
<td> <s:property value="statusStringByStatusNum"/> </td>
</tr>
</s:iterator>
然后在action方法中从Value Stack中检索当前迭代的对象,并从那里获取所需的参数:
public String getStatusStringByStatusNum(){
EmailBizObj currentlyIteratedObj =
(EmailBizObj) ActionContext.getContext().getValueStack().peek();
Integer sendStatus = currentlyIteratedObj.getStatus();
return ...; // do here what you need with your sendStatus and your Email object.
}