我使用spring mvc創建了一個非常簡單的測驗應用程序。它工作正常。但是現在,如果用戶遇到第三個問題,而另一個瀏覽器(另一個用戶)發出另一個請求,則會向第三個用戶提出第四個問題。我不希望發生這種情況。每個新的請求都應該從第一個問題開始測驗。如何在不爲每個用戶提供登錄表單的情況下實現這一目標,並將來自不同瀏覽器的每個新請求標識爲不同的用戶?我知道這可以通過會話來實現。春季MVC中的Http會話
有人可以解釋如何做到這一點?
package dmv2.spring.controller;
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import dmv2.form.QuestionForm;
import dmv2.model.Exam;
import dmv2.model.Question;
@Controller
@SessionAttributes
@RequestMapping("/Exam")
public class ExamController
{
private List<Question> questions = (new Exam()).getQuestions();
private int index = 0;
private int score = 0;
@RequestMapping(method = RequestMethod.GET)
public ModelAndView showQuestionForm()
{
Question q = questions.get(index);
return new ModelAndView("exam", "questionForm", new QuestionForm()).addObject("q", q);
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView showQuestionForm2(@ModelAttribute("questionForm") QuestionForm questionForm, BindingResult result)
{
Question q = questions.get(index);
if(q.getAnswer().getRightChoiceIndex() == Integer.parseInt(questionForm.getChoice()))
score = score + 1;
index = index + 1;
if(index < questions.size())
{
q = questions.get(index);
}
else
return new ModelAndView("result").addObject("score", score);
return new ModelAndView("exam", "questionForm", new QuestionForm()).addObject("q", q);
}
}
很好的答案!感謝您的回答。我自動編寫了@Scope(「session」),它爲每個不同的會話創建了不同的狀態,並且一切正常。你是否還建議我創建一個類或接口來存儲狀態,就像你所做的那樣,而不是將整個控制器連接到一個會話範圍內?是的,我瞭解將業務邏輯遠離控制器的重要性。這只是一個旨在瞭解spring mvc的簡單應用程序。 – SerotoninChase