当值传递给Action类方法时,变量值为null

时间:2015-12-14 07:57:17

标签: java jsp struts2 ognl struts-tags

在我的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()对应的状态字符串值。

2 个答案:

答案 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.
}