Проблемы в обработке ошибок с использованием структуры проверки Struts - PullRequest
2 голосов
/ 26 апреля 2010

У меня есть следующие определения в

распорка-config.xml:

<struts-config>
<form-beans>
    <form-bean name="LoginForm" type="com.actionform.LoginForm"/>
      </form-beans>

        <action-mappings>

    <!-- action for login  -->
    <action input="/views/login.jsp" name="LoginForm" path="/Login" scope="session" type="com.actions.LoginAction"
    parameter="method" validate="true">
        <forward name="success" path="/views/Frameset.html" />

    </action>
       </action-mappings>

<message-resources parameter="/WEB-INF/ApplicationResources"/>
    <!-- ========================= Validator plugin ================================= -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property
        property="pathnames"
        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>

</struts-config>

Форма входа:

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
    ActionErrors errors = new ActionErrors();
    if (userName == null || userName.length() < 1) {
        System.out.println("in validate ---");
        errors.add("userName", new ActionMessage("error.userName.required"));
        // TODO: add 'error.name.required' key to your resources
    }
    if (password == null || password.length() < 1) {
        errors.add("password", new ActionMessage("error.password.required"));
        // TODO: add 'error.name.required' key to your resources
    }
    return errors;
}

login.jsp:

<html:form action="/Login?method=loginUser">

<html:errors/>

<html:text name="LoginForm" property="userName" /> 

<html:messages id="err_userName" property="userName">
            <bean:write name="err_userName" />
</html:messages>
</html:form>

Файл объекта:

error.userName.required = User Name is required.
error.password.required = Password is required.

Где я делаю не так? Я получаю следующую ошибку

javax.servlet.jsp.JspException: Cannot find bean error in any scope

Я просто хочу отобразить ошибку в том же JSP.

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Мне действительно все равно, как насчет распорок обрабатывает исключение. Используя старый сырой код из 1.2 обычно при переопределении RequestProcesor, я, вероятно, должен заменить два метода - process и processException. Первым делом рад поймать исключение из запроса после processValidation. Фрагмент кода может выглядеть как

Exception exception = null;
if (needValidation)
  try {
    if (! processValidate(request, response, form, mapping)) {
      return;
    }
    exception = (Exception)request.getAttribute(Globals.EXCEPTION_KEY);
  } catch (InvalidCancelException ex) {
    exception = ex;
  }
ActionForward forward;
// Check out if exception occurred

if (exception != null){
  forward = processException(request, response, exception, form, mapping);

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

exception.printStackTrace();
log.error(exception);
request.setAttribute("error", exception.getMessage());
return mapping.findForward("error");

Это было сделано, потому что метод validate из ActionForm или ValidatorForm не выдает никаких исключений, и я не мог корректно переопределить этот метод, не выбрасывая некоторые. Однажды брошенный, кто будет заботиться об этом ?!

2 голосов
/ 26 апреля 2010

После получения объекта ActionMessages / ActionErrors, который содержит сообщения или ошибки, которые вы хотите отобразить на странице ввода (используя теги <html:messages> или теги <html:errors>), вы должны вызвать один из следующих методов от вашего Action объекта, чтобы поместить результат вашей проверки в область:

addMessages(HttpServletRequest request, ActionMessages messages)

или

addErrors(HttpServletRequest request, ActionMessages errors)

Ты это делаешь?

...