<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()中的数字必须是可变的。这必须是我在
中使用的真实问题IDname="$(questions.qid)"
我尝试将参数设为
#session.map.get(#attr.questions.qid)
但它不起作用。请指导我如何制作参数变量。
答案 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);
在此示例中,将检查第一个无线电,并且由于会话映射值而未选中第二个无线电。
表单的输入元素通过其名称绑定到操作。如果您在提交表单时需要获取值,则需要使用索引属性名称。