<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"/>
In this code questions
is a list which contain questions object with
String question,ans1,ans2,ans3;
In my program, I will make it appears in browser like
Question 1 (RadioButton) Answer 1 (RadioButton) Answer 2 (RadioButton) Answer 3 Question 2 (RadioButton) Answer 1 (RadioButton) Answer 2 (RadioButton) Answer 3 . . .
The list may contain multiple question objects so I made it to show 5 question per page. My problem is (for example) the user may go from page 4 to page 2 and I want to refill the answers the user have clicked in page 2. So in the action class, I create a HashMap
and put question id (qid
) and answered question (eg. ans2
) into the map, then put this map into the session called map
.
In above code, I use
<s:if test="%{(#session.map.get(1)).equals('ans1')}">checked</s:if>
in the HTML radio tag. I hard coded the question id (qid
) as 1
and it works as planned.
But the number in the get()
must be variable. That must be real question id like I used in
name="$(questions.qid)"
I tried put the parameter as
#session.map.get(#attr.questions.qid)
but it doesn’t work. How to make the parameter variable?
Advertisement
Answer
To populate your question you need to use the s:iterator
tag.
<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>
in the action use map questions by name (equivalent your qid
)
Map<String, String> map = new HashMap<String, String>();
the question class created from your description.
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
make sure you initialize the questions before return result.
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);
In this example the first radio will be checked and second unchecked due to the session map values.
The input elements of the form are bound to the action by their names. If you need to get values when you submit the form you need to use indexed property names.