Проверка Struts 2 с использованием перехватчика хранилища сообщений

У меня есть действие, в котором я пытаюсь войти в систему.

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;
    }
}

Как видите, если имя пользователя или пароль недействительны, я выбрасываю CredentialException, а затем заполняю это сообщение об исключении в моем поле Error. Я даже пытался добавить ошибку действия.

С некоторыми советами и поиском в Интернете мне удалось использовать перехватчик хранилища сообщений, используя аннотации в RegisteredUserAction.action и MainAction.action, соответственно сохраняя и извлекая.

import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
    @InterceptorRef(value = "store", params = {"operationMode", "STORE"}),
    @InterceptorRef("defaultStack"),})

А ТАКЖЕ

import org.apache.struts2.convention.annotation.InterceptorRefs;

@InterceptorRefs({
    @InterceptorRef(value = "store", params = {"operationMode", "RETRIEVE"}),
    @InterceptorRef("defaultStack"),})

Это содержимое файла struts.xml, которое имеет значение:

<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>

Я использую подход, основанный на шаблонах, в котором средний контент (в моем случае LoginPage.jsp) динамически включается в главную страницу.

Моя страница.jsp (которая включает в себя mainContent):

<s:include value="../%{mainContent}.jsp" ></s:include>

Мой login.jsp (который включен):

<%@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>

Редирект работает правильно, и форма входа появляется, но без ошибок. Я даже безуспешно пытался использовать перехватчик хранилища сообщений в struts.xml. :(


person Colenso Castellino    schedule 16.11.2012    source источник
comment
Если вы используете convention plugin, почему вы все еще используете xml?   -  person Jaiwo99    schedule 16.11.2012
comment
Куда вы поместили @InterceptorRefs аннотации?   -  person Aleksandr M    schedule 16.11.2012


Ответы (1)


Используйте результат redirectAction вместо redirect. И попробуйте использовать конфигурацию в файле struts.xml вместо аннотаций.

<action name="userLogin" class="actions.RegisteredUserAction" method="login">
   <interceptor-ref name="store">
      <param name="operationMode">STORE</param>
   </interceptor-ref>
   <interceptor-ref name="defaultStack" />
   <result type="redirectAction" name="input">loginPage</result>
   <result type="redirectAction" name="success">homePage</result>
</action>
person Aleksandr M    schedule 16.11.2012
comment
можешь объяснить, почему redirectAction - person Jaiwo99; 16.11.2012
comment
Почему обычный редирект? Из документации Struts2 о результате действия перенаправления It is strongly recommended that if you are redirecting to another action, you use this result rather than the standard redirect result. - person Aleksandr M; 16.11.2012