【问题标题】:variable value is taking as null when the value is passed to the Action class method将值传递给 Action 类方法时,变量值被视为 null
【发布时间】:2015-12-14 07:57:17
【问题描述】:

在我的 jsp 文件中,我设置了变量 statusNum 的值。当我尝试将statusNum 的值传递给getStatusString() 方法(此方法在Action 类中定义)时,statusNum 的值为空。但是当我使用${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
      -------------         
}

请帮我通过getStatusString()方法获取statusNum对应的状态String值。

【问题讨论】:

  • 你在 jsp 中的statusNum 可能是一个字符串。

标签: java jsp struts2 ognl struts-tags


【解决方案1】:

您应该尝试使用&lt;s:property value="%{getStatusString(#statusNum)}"/&gt; 标签来调用操作方法。

Anwyay...在我看来这不是一个好的选择...为什么要在 jsp 中调用 action 方法并将业务层与表示层混合在一起?

在控制器中移动所有内容并使用 jsp 来呈现结果会更容易。

我的意思是...您在两个不同的阶段对单个操作进行切片。您的操作是创建一个名为 emailListCollection,然后在 jsp 中迭代您的集合。在迭代时,您调用一个方法来获取状态字符串。


工作流程:动作 -> jsp -> 迭代 -> {method x n} -> 结果


为什么不在你的操作中准备那个状态字符串呢?通过这种方式,您将只打印该值,并且您的堆栈不会充满“垃圾”(如果我们可以这么说的话)。


工作流程:动作 -> jsp -> 迭代 -> 结果


<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>
       <td style="width:39%;"><s:property value='statusString'/></td>
     </tr>
  </s:iterator>
</table>

如果该字符串可能随时间变化,请使用 Ajax。为了让您的页面始终保持刷新并以更安全的方式。

【讨论】:

  • emailList 属于 List EmailList 类型。然后 调用 EmailBizObj 的方法。那么我应该在 EmalBizObj 类中准备 statusString 方法,以便我可以获取 statusNum 来为该 statusNum 准备 statusString
【解决方案2】:

我不知道为什么它不起作用,但既然它是一个数字,你应该这样做

<s:set var="statusNum" value="status"/>

而不是

<s:set var="statusNum"><s:property value="status"/></s:set>

将其用作 HTML 并因此用作字符串。

IlGala 是对的,您应该在控制器或 emailList bean 上执行此操作,但您也可以使用 this answer 中描述的另一个技巧:

迭代 emailList 对象并调用操作方法而不传递任何参数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多