如何在没有浏览器要求重新发送数据的情况下刷新网页 - Struts 2

时间:2014-04-26 18:02:24

标签: post struts2 page-refresh

我从浏览器收到以下错误“当显示此页面时,Firefox将重复之前执行的任何操作”,当用户单击F5并再次提交表单时。我尝试使用POST REDIRECT GET但面临问题。

以下是我的代码:    我的原始代码是

  <action name="update-test" class="testAction" method="test">
  <result name="success">/test/xyz/test-result.jsp</result>
  </action>

 <action name="update-test" class="testAction" method="test">
<result name="success" type="redirectAction">forward-test</result>
 </action>
 <action name="forward-test" class="testAction" method="forward">
 <result name="success">/test/xyz/test-result.jsp</result>
  </action>


Apr 26, 2014 4:12:02 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
 java.lang.NullPointerException   at                                                                       org.apache.jsp.portal.tiles.tickets.tests_002test_002dresult_002dv1_jsp._jspService(tests_0    02dtest_002dresult_002dv1_jsp.java:196)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)

当我在第196行做了一个观察源时,我看到了以下内容。

<div id="tabXYZ" class="panel">
<img src="/images/arrow_mainmenu.jpg" width="25" height="31" alt="" class="floatingleft"> 

这是我的整个文件。 test_result.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ page import="com.ubizen.og.reportcenter.site.StandardCollectionKeys"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<tiles:insertTemplate template="/test/templates/testTemplate.jsp">
    <% pageContext.setAttribute("selectedModule", session.getAttribute(StandardCollectionKeys.SELECTED_MODULE)); %>
    <tiles:putAttribute name="header" type="string"><s:property value="#attr.selectedModule.label"/></tiles:putAttribute>
    <tiles:putAttribute name="body" value="/test/tiles/test/test-inspect-result-v1.jsp"/>
    <tiles:putAttribute name="showTopLink" value="true" type="string"/>
</tiles:insertTemplate>

1 个答案:

答案 0 :(得分:2)

在Struts2中防止在刷新时重新提交表单的最佳方法是使用token拦截器或tokenSession拦截器。

使用token拦截器在表单中添加<s:token>标记,如下所示。

<s:form action="yourAction" method="post">
    <s:token/>
    //your parameters or form fields
</s:form>

在重新提交表单时使用token拦截器,您可以将用户重定向到您想要的页面(例如/invalid_token.jsp),如下所示。

struts.xml token拦截器的

配置如下

<action name="yourAction" class="com.YourActionClass">
    <interceptor-ref name="token"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <result name="success">/success.jsp</result>
    <result name="input">/update.jsp</result>
    <result name="invalid.token">/invalid_token.jsp</result>
</action> 

如果您希望在刷新或重新提交表单时向用户显示上一个操作的结果页面而不再次调用操作,则可以使用tokenSession拦截器。

struts.xml tokenSession拦截器的

配置如下

<action name="yourAction" class="com.YourActionClass">
    <interceptor-ref name="tokenSession"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <result name="success">/success.jsp</result>
    <result name="input">/update.jsp</result>
</action>

希望这会对你有所帮助。