Struts2 Класс действия метода проверки

Попытка использовать метод validate в Struts 2.3.4, но получила ошибку ниже:

java.lang.NullPointerException

на com.action.LogonAction.validate(LogonAction.java:66) подробнее......

Класс действий:

public class LogonAction extends ActionSupport{

private Logon logon;

public Logon getLogon() {
    return logon;
}

public void setLogon(Logon logon) {
    this.logon = logon;
}

public String execute(){
    return SUCCESS;
}

public void validate(){
    if(logon.getUserName() == null  || logon.getUserName().equals("")){
        addFieldError("logon.userName", "userName required");
    }

}

Logon.class:

public class Logon {

private String password;
private String userName;


public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}

public String getUserName() {
    return userName;
}
public void setUserName(String userName) {
    this.userName = userName;
}
}

struts.xml:

<struts>

<package name="struts2" namespace="/" extends="struts-default">

    <action name="login" class="com.action.LogonAction">
        <result name="input">Login.jsp</result>
        <result name="success">success.jsp</result>
    </action>

</package>

JSP:

<s:form action="login" method="post">
<table>
    <tr>
        <td>User name:<s:textfield name="userName"/>
    <tr>
        <td><s:submit type="button" value="submit" label="Submit" /></td>
    </tr>
</table>
</s:form>

Есть ли способ исправить это, кроме использования новой версии Struts2? Потому что я обнаружил, что в одном посте говорится, что в Struts 2.3.4 есть ошибка метода validate.

1 ответ

Решение

У тебя есть NullPointerException в коде ниже

if(logon.getUserName() == null  || logon.getUserName().equals("")){

это может произойти только если logon является null,


Если у вас есть только одно действие в классе действия, которое заполняет свойства из отправленной формы, вы можете просто привязать элементы управления вводом к свойствам класса действия через OGNL.

<s:form action="login" method="post">
<table>
    <tr>
        <td>User name:<s:textfield name="logon.userName" />
    <tr>
        <td><s:submit type="button" value="submit" label="Submit" /></td>
    </tr>
</table>


Вот, logon.userName является выражением OGNL, которое оценивает визуализацию value текстового поля. Если вы явно не укажете value Атрибут выражение называется.

Он использует вызов getLogon().getUserName() на экземпляре действия. Так как вы не инициализировали logon свойство, прежде чем результат будет выполнен, то он бросит другой NullPointerException но это ловится внутри и игнорируется. Тег texttfield в этом случае ничего не отображает. И вы можете почувствовать, что это работает!?

Потому что, когда вы отправляете форму, она использует значение из name атрибут текстового поля и передает его в качестве параметра запроса. Затем это имя параметра анализируется для OGNL. Это то же самое выражение OGNL logon.userName, но Struts будет использовать getLogon().setUserName() на экземпляре действия, чтобы установить значение параметра.

Резонный вопрос, почему он не выбрасывает исключение, т.е. почему вызов getLogon() возвращает Logon пример? Это волшебство Struts2. Может справиться null значения между вызовами getLogon() а также setUserName(), По умолчанию он создает объект, если он еще не создан. Вы можете контролировать это поведение, используя константу в struts.xml,

Но, на мой взгляд, вы должны создать его самостоятельно или с контейнером с DI, который обеспечивает конфигурацию бинов, как Spring.


Простое решение для фиксации:

private Logon logon = new Logon();

Struts2 в основном используется для отображения многих действий в одном классе действий, а не только в execute метод. Таким образом, инициализация bean-компонента будет надежно защищать вас от ошибок, воспроизводимых внутри или снаружи при вызове действий.

Другие вопросы по тегам