Struts 2-Validierung mit Message Store Interceptor
Ich habe eine Aktion, bei der ich versuche, den Benutzer anzumelden.
public class RegisteredUserAction extends ActionSupport implements SessionAware {
..
..
public String login() throws Exception {
DBLogic dBLogic = new DBLogic();
RegisteredUser user = null;
try {
user = dBLogic.getRegisteredUser(getUserUsername(), getUserPassword());
} catch (CredentialException e) {
addFieldError("userUsername", e.getMessage());
addActionError(e.getMessage());
return INPUT;
}
if (user != null) {
session.put("user", user);
return SUCCESS;
}
return ERROR;
}
}
Wie Sie sehen können, löse ich eine CredentialException aus, wenn der Benutzername oder das Passwort ungültig sind, und fülle diese Ausnahmebedingungsnachricht in meinem fieldError aus. Ich habe sogar versucht, einen Aktionsfehler hinzuzufügen.
Mit einigen Ratschlägen und Online-Recherchen gelang es mir, den Message Store Interceptor mithilfe von Anmerkungen in der RegisteredUserAction.action und der MainAction.action zu verwenden, die gespeichert und abgerufen wurden.
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
@InterceptorRef(value = "store", params = {"operationMode", "STORE"}),
@InterceptorRef("defaultStack"),})
UND
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
@InterceptorRef(value = "store", params = {"operationMode", "RETRIEVE"}),
@InterceptorRef("defaultStack"),})
Dies ist der Inhalt der Datei struts.xml, der relevant ist:
<package name="pages" extends="struts-default" namespace="/">
<global-results>
<result name="displayPage">/WEB-INF/template/page.jsp</result>
<result name="input">/WEB-INF/template/page.jsp</result>
</global-results>
<action name="registrationPage" class="actions.MainAction"
method="loadRegistrationPage"></action>
<action name="loginPage" class="actions.MainAction"
method="loadLoginPage"></action>
</package>
<package name="operations" extends="struts-default" namespace="/">
<action name="userLogin" class="actions.RegisteredUserAction" method="login">
<result type="redirect" name="input">loginPage.action</result>
<result type="redirect" name="success">homePage.action</result>
</action>
</package>
Ich verwende einen vorlagenbasierten Ansatz, bei dem der mittlere Inhalt (in meinem Fall die LoginPage.jsp) dynamisch in die Hauptseite aufgenommen wird.
Meine page.jsp (die den Hauptinhalt enthält):
<s:include value="../%{mainContent}.jsp" ></s:include>
Meine login.jsp (wird mitgeliefert):
<%@taglib prefix="s" uri="/struts-tags"%>
<s:form action="userLogin" method="POST">
<s:textfield name="userUsername" />Error:<s:fielderror name="userUsername" />
<s:password name="userPassword" />
<s:submit />
</s:form>
Die Umleitung funktioniert ordnungsgemäß und das Anmeldeformular wird angezeigt, es treten jedoch keine Fehler auf. Ich habe sogar versucht, den Message Store Interceptor in der struts.xml zu verwenden, ohne Erfolg. :(