I am trying to fake some question / answer pairs in my controller-class and send them into the view-class via using the playframework.
I have the following structure for questions / answers:
- Question 1
-- Answer 1.1
-- Answer 1.2
- Question 2
-- Answer 2.1
- Question 3
-- Answer 3.1
-- Answer 3.2
...
I have those in my Application.java class. For the moment they are hardcoded in, later I want to use a database.
Then I have a index.scala.html (the view class), in there I iterate over the questions and answers and show them like in my structure - which does not work!
But how can I send them from the java class to the scala class?
So far I have tried using a Google Guava Multimap:
// Needed, as the view-class gets a List[String]
static List<String> questionList = new ArrayList<String>();
static List<String> answerList = new ArrayList<String>();
// Create the Multimap, one for questions, one for answers
Multimap<String, String> questionMap = ArrayListMultimap.create();
Multimap<String, String> answerMap = ArrayListMultimap.create();
// Question 1, in the format Questiontext (used as key here) / ID, votescore, Userid
questionMap.put("What happens if I use a break here?", "e77dccbc-fd8d-4641-b9ca-17528e5d56b2");
questionMap.put("What happens if I use a break here?", "150");
questionMap.put("What happens if I use a break here?", "345");
// Answer 1.1 in the format: Answertext / ID / Question-ID (Answer needs to be linked to a question) / votescore / Userid
answerMap.put("The loop will just fall through!", "b8756ff5-ff8a-4a17-9517-811b91639fdf");
answerMap.put("The loop will just fall through!", "e77dccbc-fd8d-4641-b9ca-17528e5d56b2");
answerMap.put("The loop will just fall through!", "46");
answerMap.put("The loop will just fall through!", "567");
// The Lists get the keySets (contains the questiontext / answertext)
questionList.addAll(questionMap.keySet());
answerList.addAll(answerMap.keySet());
// returns the 2 lists to the view-class
public static Result index() {
return ok(index.render(questionList, answerList));
}
index.scala.html:
// first line, gets the q/a lists as parameters
@(questions: List[String], answers: List[String])
// iterate over the question-list and show the questiontext (works)
@for(index <- 0 until questions.size){
@questions(index)
// iterate over the answers and show them as well, I know I am iterating wrong somehow here!
@for(index <- 0 until answers.size){
@answers(index)
}
I know I am iterating wrongly over the answers, so the structure shown now is:
- Question 1
-- Answer 1.1
-- Answer 1.2
-- Answer 2.1
-- Answer 3.1
-- Answer 3.2
- Question 2
-- Answer 1.1
-- Answer 1.2
-- Answer 2.1
-- Answer 3.1
-- Answer 3.2
- Question 3
-- Answer 1.1
-- Answer 1.2
-- Answer 2.1
-- Answer 3.1
-- Answer 3.2
...
So I am showing every answer in every question. This stems from the problem that I dont know how to link the answers to the corresponding question! I have IDs in the questions and answers, but I dont know how I can get those (together with the q/a text!) into the view class and how to iterate over the IDs.
Maybe I can use another data-structure that makes my approach easier?
[EDIT1]====================================================[EDIT1]
I have changed my approach now and use a normal Map with 2 classes (Question.java and Answer.java):
Question.java (Answer.java is similar):
public class Question {
public String ID;
public String questionText;
public Integer voteScore;
public String userID;
public Question(String inputID, String inputQuestionText, Integer inputVoteScore, String inputUserID){
this.ID = inputID;
this.questionText = inputQuestionText;
this.voteScore = inputVoteScore;
this.userID = inputUserID;
}
}
In my Application.java (Controller class) I use a Map and have some fake questions / answers:
static Map<Question, List<Answer>> myMap = new HashMap<Question, List<Answer>>();
Question question1 = new Question("xyz", "Do Androids dream?", 127, "Marcus");
Answer answer11 = new Answer("zab", "xyz", "Only of electric sheep!", 70, "Tibor");
Answer answer12 = new Answer("qwert", "xyz", "No, they dont!", 10, "Sarah");
Question question2 = new Question("fgh", "Why is the sky blue?", 76, "Frank");
Answer answer21 = new Answer("xcv", "fgh", "Frequency filtered sunlight!", 45, "Oliver");
Answer answer22 = new Answer("tzu", "fgh", "Light reflects from the blue sea water!", 3, "Tom");
List<Answer> answerList1 = new ArrayList<Answer>();
answerList1.add(answer11);
answerList1.add(answer12);
List<Answer> answerList2 = new ArrayList<Answer>();
answerList2.add(answer21);
answerList2.add(answer22);
myMap.put(question1, answerList1);
myMap.put(question2, answerList2);
return ok(views.html.index.render(myMap));
In my index.scala.html:
@import model.Question
@import model.Answer
@(myMap: Map[Question, List[Answer]])
@for((key, value) <- myMap){
@key.questionText - @value <br>
}
The output is now:
Why is the sky blue? -
[ID = xcv questionID = fgh answerText = Frequency filtered sunlight! voteScore = 45 userID = Oliver, ID = tzu questionID = fgh answerText = Light reflects from the blue sea water! voteScore = 3 userID = Tom]
Do Androids dream? -
[ID = zab questionID = xyz answerText = Only of electric sheep! voteScore = 70 userID = Tibor, ID = qwert questionID = xyz answerText = No, they dont! voteScore = 10 userID = Sarah]
So how do I iterate over the answerTexts and show them in my view-class? I dont know how to access into the list.
Just use an inner loop to iterate over the answers (because the value variable will hold the answers to the question of the loop iteration):
index.scala.html
@import model.Question
@import model.Answer
@(myMap: Map[Question, List[Answer]])
@for((key, value) <- myMap){
@key.questionText<br>
@for(ans <- value){
<p>Possible answer: @ans.answerText</p>
}
}