如何将变量放入OGNL标签中

时间:2013-04-27 13:10:33

标签: java java-ee struts2 session-variables ognl

<input type="radio" name="${questions.qid}" value="${questions.ans1}" <s:if test="%{(#session.map.get(1)).equals(\'ans1\')}">checked</s:if>><s:property value="#attr.questions.ans1"/>

在此代码中,'questions'是一个列表,其中包含带有字符串问题的问题对象ans1,ans2,ans3。在我的程序中,我会在浏览器中显示

Question 1
(RadioButton) Answer 1
(RadioButton) Answer 2
(RadioButton) Answer 3

Question 2
(RadioButton) Answer 1
(RadioButton) Answer 2
(RadioButton) Answer 3

.
.
.

该列表可能包含多个问题对象,因此我将其显示为每页显示5个问题。我的问题是(例如)用户可能从第4页到第2页,我想重新填写用户在第2页中点击的答案。因此在动作类中,我创建了一个HashMap并放入了问题ID(qid)和将问题(例如,ans2)回答到地图中,然后将此地图放入名为“地图”的会话中。

在上面的代码中,我使用

<s:if test="%{(#session.map.get(1)).equals(\'ans1\')}">checked</s:if>

在html radio标签中。我把问题id(qid)硬编码为'1',它按计划工作。 但是get()中的数字必须是可变的。这必须是我在

中使用的真实问题ID
name="$(questions.qid)"

我尝试将参数设为

#session.map.get(#attr.questions.qid)

但它不起作用。请指导我如何制作参数变量。

1 个答案:

答案 0 :(得分:1)

要填充您的问题,您需要使用iterator标记。

<s:iterator value = "myQuestions" status="key">
  <s:textfield name = "myQuestions[%{#key.index}].name" /><br>
  <input type="radio" name="myQuestions[<s:property value="%{#key.index}"/>].ans1" value="<s:property value="%{myQuestions[#key.index].ans1}"/>" <s:if test="%{(#session.map.get(myQuestions[#key.index].name)).equals(myQuestions[#key.index].ans1)}">checked</s:if>><s:property value="%{myQuestions[#key.index].ans1}"/><br>
</s:iterator>

在操作中按名称使用地图问题(相当于您的qid

Map<String, String> map = new HashMap<String, String>();

根据您的描述创建的问题类。

public class Question {
    private  String name;
    private  String ans1;
    private  String ans2;
    private  String ans3;

    //getters setters here
}

private List<Question> myQuestions;
//getters setters here for questions

确保在返回结果之前初始化问题。

public String execute(){
  myQuestions = new ArrayList<Question>();
  myQuestions.add(new Question("Question1", "ans1", "ans2","ans3"));
  myQuestions.add(new Question("Question2","ans1", "ans2","ans3"));

  //test results, map should not be empty
  map.put("Question1", "ans1");
  map.put("Question2", "ans2");
  session.put("map", map);

在此示例中,将检查第一个无线电,并且由于会话映射值而未选中第二个无线电。

表单的输入元素通过其名称绑定到操作。如果您在提交表单时需要获取值,则需要使用索引属性名称。