содержащийся в теге итератора struts2

У меня есть следующий код, который, похоже, не работает. Я не понимаю, почему это не сработает.

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

В приведенном выше коде в основном у меня есть метод getQuestions в классе действий. Этот список содержит объекты класса Exam, у которых есть get/set questionId. У меня также есть список correctQs, который содержит строки. Я проверяю, содержит ли correctQs идентификатор вопроса. если это так, я хочу напечатать текст. Несмотря на то, что приведенный выше код не работает, приведенный ниже код работает нормально в случайном порядке. Иногда работает, а иногда нет... :(

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

может ли кто-нибудь дать некоторое представление об этом?


person Omnipresent    schedule 06.08.2009    source источник
comment
Является ли свойство questionId объекта Exam строкой? Если это не так, то, вероятно, это проблема преобразования типов. Метод String equals (который будет вызываться методом List contains) не вернет true, если вы передадите Integer (или любое другое значение, отличное от String), даже если значение строки равно значению toString() функции Целое.   -  person Brian Yarger    schedule 06.08.2009
comment
есть ли способ проверить тип??   -  person Omnipresent    schedule 06.08.2009
comment
Вы должны иметь возможность установить точку останова в методе getQuestionId() в вашем классе Exam и следовать ей оттуда.   -  person Brian Yarger    schedule 06.08.2009
comment
это помогает принять ответ - или, если вы сами ответили на него, ввести его для будущих посетителей   -  person CrackerJack9    schedule 25.08.2011
comment
Синтаксис Struts2 — полный бардак! Попробуйте преобразовать в переменные JSP с помощью <s:set var="myQuestion" value="%{question}"/><jsp:useBean id="myQuestion"/> и используйте скриптлеты. По крайней мере, вы будете знать, что происходит. Самое меньшее, что вы можете сделать, это заключить value=%{questions} в кавычки, например value="%{questions}".   -  person Chloe    schedule 07.11.2013


Ответы (1)


Я не уверен, как выглядит ваш класс Action, но вы можете попробовать что-то вроде этого. Когда вы находитесь внутри тега s:iterator, я думаю, что каждое выражение %{foo} будет пытаться получить доступ к конкретному экземпляру, который вы повторяете (вопрос, а не список вопросов).

Примечание. Можно использовать # для ссылки на родительский объект из тега 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>
person CrackerJack9    schedule 06.08.2011