Вопрос

To avoid the form resubmission I used POST-Redirect-GET pattern and it is working fine. Now on my registration page(success page) it is showing the ActionMessage "Review Inserted successfully!". When user refreshes the page I want to remove this message.

My code on JSP page:

<s:if test="hasActionMessages()">
    <div class="success-mesg" id="success-mesg">
        <s:iterator value="actionMessages">
            <s:property value="top" />
        </s:iterator>
    </div>
</s:if>

On struts.xml:

<action name="insertReview" class = "com.tenkinfo.streamlinedmapnsav.ui.action.WriteReviewAction" method="insertReview" >
    <result name="insertReviewDone" type="redirect" >insertReviewDone</result>
    <result name="input" type="tiles">display.writeReview.page</result>
</action>

<action name="insertReviewDone" class = "com.tenkinfo.streamlinedmapnsav.ui.action.WriteReviewAction" method="insertReviewDone" >
    <result name="success" type="tiles" >display.writeReview.page</result>
</action>

In Action class:

public String insertReviewDone(){
    addActionMessage("Write review is successful");
    return "success";
}

Edit :

After implementing the answer suggested by Aleksandr M, I am having below problem:

<s:form name="insertReview" action="insertReview" id="insertReview"
            theme="simple" enctype="multipart/form-data">
        <div class="content-area">
            <h1>
            Review
            <s:property value="businessName" />
            </h1>
            <s:if test="hasActionMessages()">
            <div class="success-mesg" id="success-mesg">
            <s:iterator value="actionMessages">
        <s:property value="top" />
    </s:iterator>
   </div>
</s:if>

After refreshing the page in above code businessName is removed and not displaying. Any help will be appreciated.

Это было полезно?

Решение

Use Message Store Interceptor to store action message in your insertReview and retrieve it in your insertReviewDone action. Add action message in insertReview method when you are returning insertReviewDone result.

Also use redirectAction result to redirect to action instead of redirect.

<action name="insertReview" class = "com.tenkinfo.streamlinedmapnsav.ui.action.WriteReviewAction" method="insertReview">
  <interceptor-ref name="store">
    <param name="operationMode">STORE</param>
  </interceptor-ref>
  <interceptor-ref name="defaultStack" />

  <result name="insertReviewDone" type="redirectAction">insertReviewDone</result>
  <result name="input" type="tiles">display.writeReview.page</result>
</action>

<action name="insertReviewDone" class = "com.tenkinfo.streamlinedmapnsav.ui.action.WriteReviewAction" method="insertReviewDone" >
  <interceptor-ref name="store">
    <param name="operationMode">RETRIEVE</param>
  </interceptor-ref>
  <interceptor-ref name="defaultStack" />

  <result name="success" type="tiles">display.writeReview.page</result>
</action>

Другие советы

Another way, less technical than the (good) one proposed by @AleksandrM, but suitable for every framework out there, not only Struts2, is to place this

<script>
    $(document).ready(function() {
        window.history.pushState("","", location.href);
    });
</script>

in your <head> section. It won't work on old browser with no HTML5 capabilities, though.

Note: jQuery part is not mandatory, it is used just to ensure it is run after the page is loaded, you can run HTML5 pushState() without it.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top