2009-08-06 79 views
3

我有下面的代碼似乎不工作。我不明白爲什麼這不會工作。包含在struts2中迭代器標記

<s:iterator value=%{questions} id="question"> 
    <s:if test='%{incorrectQs.contains("#question.questionId")}'> 
     Print something here 
    </s:if> 
</s:iterator> 

在上面的代碼中,基本上我在action類中有一個名爲getQuestions的方法。該列表包含具有get/set questionId的Exam類的對象。我也有錯誤的Qs列表包含字符串。我正在檢查如果incorrectQs包含questionId。如果是這樣,我想打印一些文字。儘管如此,上面的代碼不起作用,下面的代碼可以很好地隨機工作。有時工作,有時不... :(

<s:iterator value=%{questions}> 
    <s:if test='%{incorrectQs.contains("${questionId}")}'> 
     Print something here 
    </s:if> 
</s:iterator> 

任何人都可以提供一些這方面的見解?

+0

是考試的questionId屬性的字符串?如果不是,那麼這可能是一個類型轉換問題。即使字符串的值等於字符串的toString()值,那麼String equals方法(將由List contains方法調用)將不會返回true,如果您傳遞Integer(或任何其他非String)整數。 – 2009-08-06 02:19:47

+0

是的,它是一個字符串... – Omnipresent 2009-08-06 02:26:11

+0

有沒有一種方法來實際檢查類型? – Omnipresent 2009-08-06 02:30:26

回答

0

我不知道你Action類是什麼樣,但你可以嘗試類似這當你的s:iterator標籤裏面,我覺得每一個%{foo}表達將試圖訪問你迭代的具體實例(的問題,而不是問題的列表)

注:有可能是使用方法#來引用機智的父對象hin s:iterator標籤。我只是沒有做到這一點,所以不能確定它是否會幫助你。

public class ActionClass ... { 

    private List<Question> mQuestions; 
    private Set<Integer> mIncorrectQuestions; 

    public String execute() { 
     // build/read questions, populate incorrect questions, etc... 
     return SUCCESS; 
    } 

    public List<Question> getQuestions() { 
     return mQuestions; 
    } 

    // does not need to be an inner class 
    public class Questions { 

     private int mQuestionId; 

     public int getQuestionId() { 
      return mQuestionId; 
     } 

     public boolean getIsIncorrect() { 
      return mIncorrectQuestions.contains(mQuestionId); 
     } 
} 

然後在你的JSP:

<s:iterator value='%{questions}'> 
    <s:if test='%{isIncorrect}'> 
     Question <s:property value='${questionId}'/> is Incorrect! 
    </s:if> 
</s:iterator> 
0
#question.questionId.toString()