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-компонента будет надежно защищать вас от ошибок, воспроизводимых внутри или снаружи при вызове действий.