如何更改Java servlet中的请求属性以重定向页面?

时间:2014-03-04 21:29:24

标签: java servlets

我正在使用JSP和Java servlet创建调查。在JSP中,我有一个表单,“下一步”按钮指定要进入的下一个问题:“/ survey?q = 2”其中“q”是指定要显示的问题的参数。但是,根据答案(或缺少),我可能想要重定向到错误页面,或者回到同一个问题。

我尝试了一个简化版本,如果“answer”为null(回答是允许我获取值的控件的名称),我会使用request.setAttribute()将“q”parm设置为相同的问题编号。然而,这似乎没有覆盖“q”的值,因为下一个问题会加载而不是重定向到同一个问题。

我也尝试使用response.sendRedirect()并传递所需的网址,但是这引发了一个例外“在提交了repsonse后无法转发”。

以下是servlet的摘录:

    // At this point, the URL is /survey?q={SOME#} where SOME# is the next question to
    // go to after the submit.  So if the user was on Question 1, the submit location
    // would be /survey?q=2
    try {
        nextQuestion = Integer.parseInt(request.getParameter("q"));
    } catch (Exception e) {
        System.out.println("Inside the catch");
    }

    // The question we came from, obviously, is nextQuestion - 1        
    currQuestion = nextQuestion - 1;

    // This IF is just because I'm handling the first question differently
    if (currQuestion > 1) {
        answer = request.getParameter("answer");
        System.out.println("Answer = " + answer);

        //This function checkAnswer() returns "invalid" if no answer was selected"
        checkStr = checkAnswer(currQuestion, answer);
        if (checkStr == "invalid") {
            dispatcher = "survey-template.jsp";
            request.setAttribute("q", String.format("%d", currQuestion));
        } else {
            dispatcher = "survey-template.jsp";
        }
    } else {
        dispatcher = "survey-template.jsp";         
    }

    request.getRequestDispatcher(dispatcher).forward(request, response);

所以最大的问题是:如何从servlet重定向页面?如果进入的请求是转到/survey?q=2,而我想回到/survey?q=1,我需要做些什么来实现这一目标?

希望这足够详细。如果需要,我可以提供更多。 谢谢!

2 个答案:

答案 0 :(得分:2)

  

我也尝试使用response.sendRedirect()并传递所需的网址,但是这引发了一个异常“在提交了repsonse之后无法转发”

看起来你试图重定向到一个新的URL,它会根据URL内容写一个新的响应并关闭这个流,但保留了试图写入响应的转发代码,这是不允许的,因为响应已经写好并且流已关闭。在代码中:

//having both is not allowed
//you should only use one of these approaches
response.sendRedirect(<someUrl>);
request.getRequestDispatcher(dispatcher).forward(request, response);

如果您只想重定向到其他网址,请使用response.sendRedirect(<someUrl>);并确保没有进一步的重定向或转发。所以,你的代码可能是:

response.sendRedirect(<someUrl>);
//request.getRequestDispatcher(dispatcher).forward(request, response);

请注意,发送重定向意味着在URL上调用新的GET请求,因此所有请求属性都将丢失。

答案 1 :(得分:0)

使用response.sendRedirect()后,您应退出该方法。

您可以尝试:

response.sendRedirect("url");
return;