значение переменной принимается как нулевое, когда значение передается методу класса Action

В моем файле 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>

вот скелет метода getStatusString() в классе Action

public String getStatusString(Integer sendStatus) {
      ------------- 
      ------------- //code returning string value
      -------------         
}

Пожалуйста, помогите мне получить значение строки состояния, соответствующее statusNum, с помощью метода getStatusString().


person rajani chowdhary    schedule 14.12.2015    source источник
comment
Ваш statusNum в jsp, вероятно, является строкой.   -  person Aleksandr M    schedule 14.12.2015


Ответы (2)


Вы должны попробовать с тегом <s:property value="%{getStatusString(#statusNum)}"/>, чтобы вызвать метод действия.

Anwyay... На мой взгляд, это не очень хороший выбор... Почему вы должны вызывать метод действия внутри jsp и смешивать бизнес-уровень с уровнем представления?

Проще переместить все внутри вашего контроллера и использовать jsp только для рендеринга результатов.

Я имею в виду... Вы разделяете одну операцию на два разных этапа. Ваше действие создает Collection с именем emailList, затем вы повторяете свою коллекцию в jsp. Во время итерации вы вызываете метод для получения строки состояния.


Рабочий процесс: действие -> jsp -> итерация -> {метод 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. чтобы ваша страница всегда обновлялась и была гораздо более безопасной.

person IlGala    schedule 14.12.2015
comment
emailList имеет тип List‹EmailBizObj› EmailList . затем ‹s:property value=name› вызывает метод EmailBizObj. Итак, я должен подготовить метод statusString в классе EmalBizObj, чтобы я мог получить statusNum для подготовки statusString для этого statusNum - person rajani chowdhary; 14.12.2015

Я не уверен, почему это не работает, но поскольку это число, вы должны сделать

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

вместо

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

который использует его как HTML и, следовательно, как строку.

IlGala прав, вы должны сделать это на контроллере или на bean-компоненте emailList, но вы также можете использовать другой трюк, как описано в этот ответ :

Повторите объекты 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>

затем в методе действия извлеките текущий итерируемый объект из стека значений и получите оттуда нужный параметр:

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.
}
person Andrea Ligios    schedule 14.12.2015