【问题标题】:Redisplaying JSP after post to Servlet发布到 Servlet 后重新显示 JSP
【发布时间】:2014-09-13 08:37:21
【问题描述】:

我有一个名为 CampaignMaint.java 的 Servlet,带有一个 doGet 和一个 doPost 以及一个名为 JCampaignMaint.jsp 的 JSP。 在输入 URL /CampaignMaint?campaign=Treasury 时,doGet 将数据构建到一个数组中并执行:

Request.setAttribute("OrgContacts", contacts);
RequestDispatcher rd = request.getRequestDispatcher("JCampaignMaint.jsp");
rd.forward(request,response);  

JCampaignMaint.jsp 然后构建一个包含一些可修改字段的表,如下所示:

<form action="CampaignMaint" method="post">
<c:forEach var="OrgContact" items="${OrgContacts}">
<tr>
<td>${OrgContact.orgName}</td>
<td>${OrgContact.orgTitle}</td>
<td><input type="number" name=${OrgContact.orgJoinName} value=${OrgContact.orgInfluence} min="1" max="5"</td>
<td><input type="number" name=${OrgContact.orgJoinName}  value=${OrgContact.orgSupport} min="1" max="5"</td>
<td><input type="number" name=${OrgContact.orgJoinName}  value=${OrgContact.orgEngagement} min="1" max="5"</td>
</tr>
</c:forEach>

<input type="submit" value="Submit">
</form>

点击提交按钮后,一个 HTTP Post 被发送到服务器并由 CampaignMaints goPost 方法处理,在该方法中读取表单并更新数据库。屏幕现在是空白的,带有一个 URL /SalesPoliticalMapping/CampaignMaint。

我想要的是,在提交时 doPost 会更新数据库,但我的屏幕与显示的表(或重建/重新显示)以及 /CampaignMaint?campaign=Treasury 的原始 URL 保持不变。然后我希望能够进行进一步的更新和提交。

添加时的 GlassFish 堆栈跟踪

response.sendRedirect("/CampaignMaint?campaign=Treasury"); 

警告:StandardWrapperValve[CampaignMaint]: Servlet.service() for servlet CampaignMaint 抛出异常 java.lang.IllegalStateException 在 org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:518) 在 com.mycompany.salespoliticalmapping.controller.CampaignMaint.doPost(CampaignMaint.java:196) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) 在 org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 在 org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 在 org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 在 org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 在 org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 在 org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 在 org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    您的 doPost 方法可以重定向到生成视图的方法,而不是转发到 jsp:

    response.sendRedirect("/yourwebappname/CampaignMaint?campaign=Treasury");
    

    这样您就不必在 post 方法中重复显示逻辑,您将看到随着提交结果更新的视图。 (您会看到屏幕刷新,因为这是一个新的 GET 请求。)

    这种技术还可以避免重复提交表单,它被称为Post/redirect/get pattern

    【讨论】:

    • 这个POST redirect GET 模式避免了当用户在发布后立即调用刷新(或按下返回按钮)时重复提交表单的问题......
    • @Serge:是的,这是使用它的另一个优势。
    • 我尝试实现但不断收到 HTTP 状态 500 - 内部服务器错误。我将 sendRedirect 放入 CampaignMaint.java 的 doPost 方法中,该方法应该重定向到同一个 servlet 的 doGet 方法。我已经尝试了所有我能想到的 URI 组合?
    • @user3718259:将堆栈跟踪添加到您的问题中。
    • 输入带有项目名称的 URL,即 response.sendRedirect("/SalesPoliticalMapping/CampaignMaint?campaign=Treasury");现在它可以工作了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多