在我的项目中,我有以下文件:


pole.jsp包含一个表单和一个提交
results.jsp,其中显示结果(仅包含标题)
一个PollServlet,在其中我同时在pole.jsp和results.jsp中设置标题


这是文件:
poll.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Poll Page</title>
    </head>
    <body>
        <form action="/poll?action=pole" method="POST">
            <div>
                <a><h2><% out.print(request.getAttribute("oldTitle").toString());%>
                </h2></a><br>
            </div>
           <br><br>
           <input type="submit" name = "submit"value="submit">
        </form>
    </body


results.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Results</title>
    </head>
    <body >
        <form action="/poll?action=results" method="POST">
            <a><%  out.print(request.getAttribute("title"));%></a>
        </form>
    </body>
</html>


PollServlet.java

@WebServlet(name = "PollServlet", urlPatterns = {"/poll"})
public class PollServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {

        }
    }

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String action = request.getParameter("action");
    if (action.equals("pole")) {
        request.setAttribute("oldTitle","new tile for poll.jsp ");
        getServletConfig().getServletContext().getRequestDispatcher(
            "/poll.jsp").forward(request, response);
    } else if (action.equals("results")) {

    /* set the title for results.jsp */
        request.setAttribute("title","title for results.jsp");
        getServletConfig().getServletContext().getRequestDispatcher(
            "/results.jsp").forward(request, response);

        }
}
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request,
}


该问题似乎出现在servlet的doGet()方法中。我只能为第一项(poll.jsp)标题设置值,而不能为第二项(results.jsp)设置值,这是我做错了什么,如何正确实现?谢谢!

最佳答案

您不能多次转发相同的请求,因为一旦转发了请求,便已提供响应。
请参阅this问题。

但是,在forward()之后编写的代码仍将被执行,但这是出于其他目的(例如记录...),但是您无法再次转发该请求。



编辑

您可以向网址/poll?action=pole/poll?action=results发送一个参数,这将帮助您确定此页面是poll.jsp还是results.jsp,类似这样

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        String action = request.getParameter("action");

        if(action.equals("pole")) {

            /* set the title for pole.jsp */

            request.setAttribute("oldTitle","new tile for poll.jsp ");
            getServletConfig().getServletContext().getRequestDispatcher(
                    "/poll.jsp").forward(request, response);

        } else if(action.equals("results")){

            /* set the title for results.jsp */
            request.setAttribute("title","title for results.jsp");
            getServletConfig().getServletContext().getRequestDispatcher(
                "/results.jsp").forward(request, response);

        }
}

10-07 19:27
查看更多