0

I'm using Struts2 (version 2.5.14.1) with the Spring and Tiles plug-ins.

This is my (relevant) struts.xml configuration:

<package name="enrollment" namespace="/enrollment" extends="struts-bean-validation">
  <result-types>
    <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
  </result-types>

  <action name="start" class="io.shido.struts.action.enrollment.StartAction">
    <result name="success" type="tiles">enrollment.start.tiles</result>
  </action>
  <action name="personal-info" class="io.shido.struts.action.enrollment.PersonalInfoAction">
    <result name="input" type="tiles">enrollment.personal-info.tiles</result>
    <result name="success" type="tiles">enrollment.billing-info.tiles</result>
  </action>
  <action name="billing-info" class="io.shido.struts.action.enrollment.BillingInfoAction">
    <result name="input" type="tiles">enrollment.billing-info.tiles</result>
    <result name="success" type="tiles">enrollment.finish.tiles</result>
  </action>
  <action name="finish" class="io.shido.struts.action.enrollment.FinishAction">
    <result name="success" type="tiles">enrollment.finish.tiles</result>
  </action>
</package>

...the JSP file that holds one of the forms:

<%@ taglib prefix="s" uri="/struts-tags" %>

<link rel="stylesheet" href="<s:url value='/resources/styles/enrollment.styles.css' />">

<s:form cssClass="form-input-info" action="personal-info" method="post">
  <legend><s:text name="legend.text" /></legend>
  <hr>
  <s:textfield cssClass="form-control" key="textfield.first-name" name="personalInfo.firstName" />
  <s:textfield cssClass="form-control" key="textfield.last-name" name="personalInfo.lastName" />
  <s:textfield cssClass="form-control" key="textfield.email" name="personalInfo.email" />
  <s:textfield cssClass="form-control" key="textfield.phone-number" name="personalInfo.phoneNumber" />
  <s:textfield cssClass="form-control" key="textfield.age" name="personalInfo.age" />
  <s:submit class="btn btn-primary btn-lg btn-block" key="submit.continue" />
</s:form>

...and finally the (super simple) Action class:

package io.shido.struts.action.enrollment;

// imports

public final class PersonalInfoAction extends ActionSupport {
  private static final long serialVersionUID = 3560814234131884357L;

  private final Logger logger = LogManager.getLogger(this.getClass());

  private PersonalInfoHandler handler;

  @Valid
  private PersonalInfo personalInfo;

  @Override
  public String execute() {
    // If personalInfo is not null is guaranteed to be valid due to Bean Validation contraints
    if (null != personalInfo) {
      logger.debug("Processing personal info...");
      handler.save(personalInfo);
      return Action.SUCCESS;
    }
    logger.info("Collecting personal info...");
    return Action.INPUT;
  }

  public PersonalInfoHandler getHandler() { return handler; }

  public void setHandler(final PersonalInfoHandler handler) { this.handler = handler; }

  public PersonalInfo getPersonalInfo() { return personalInfo; }

  public void setPersonalInfo(final PersonalInfo personalInfo) {
    this.personalInfo = personalInfo;
    this.personalInfo.normalize();
  }
}

The issue is, whenever I submit that form, I'm expecting the Bean Validation to kick out and check all the annotated fields (check, this is happening) and when everything is fine, send the flow to /WEB-INF/content/enrollment/billing-info.jsp (defined in Tiles by enrollment.billing-info.tiles)...but all I see is (almost) the "billing info" form with the wrong labels. See the below picture:

enter image description here

The URL should have changed, as well as the labels. To put the cherry on top, if I click the Continue button again, the form is displayed then correctly.

Any clues?

x80486
  • 6,627
  • 5
  • 52
  • 111

1 Answers1

1

I have no direct answer but you could try to use a redirect action instead of using the tiles several times.

So you could try this here:

 <action name="personal-info" class="io.shido.struts.action.enrollment.PersonalInfoAction">
    <result name="input" type="tiles">enrollment.personal-info.tiles</result>
    <result name="success" type="redirectAction">
        <param name="actionName">billing-info</param>
    </result>
 </action>

And if you need to transfer some kind of id to show the data you can use additional params in the struts.xml like this:

<!-- rest as above -->
<result>
<param name="param1">${value1}</param>
</result> 

The param1 must have valid getter/setter-methods in both actions to transfer the information.

beendr
  • 654
  • 7
  • 21
  • That's exactly what I was looking! I ended up doing `billing-info`, it works either way. – x80486 Jun 29 '18 at 11:50
  • Happy I could help you, just a side note: With `redirect` you are using the internal struts chaining which the struts developer advise not to use anymore (https://struts.apache.org/core-developers/action-chaining.html). I had a typo in my example it's `redirectAction`, see here: https://struts.apache.org/core-developers/redirect-action-result.html – beendr Jun 29 '18 at 12:41
  • Ah! Good point...I didn't know that. I will use the recommended way then! – x80486 Jun 30 '18 at 01:36