尝试在Struts 2.3.4上使用validate方法,但出现以下错误:
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有验证方法的错误。
您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
文本字段的a。除非您明确指定一个value
属性,否则将调用该表达式。
它使用getLogon().getUserName()
对动作实例的调用。由于您没有logon
在执行结果之前初始化该属性,因此它将引发另一个属性,NullPointerException
但会在内部捕获它并忽略它。在这种情况下,texttfield标记不呈现任何内容。您可能会觉得它有用!?
因为当您提交表单时,它使用name
文本字段属性中的值并将其作为请求参数传递。然后,此参数名称将解析为OGNL。这是相同的OGNL表达式logon.userName
,但是Struts将getLogon().setUserName()
在操作实例上使用以设置参数的值。
合理的问题,为什么它不引发异常,即为什么调用getLogon()
返回Logon
实例?这是Struts2的魔力。它可以处理null
介于getLogon()
和之间的值setUserName()
。默认情况下,如果尚未创建对象,它将创建一个对象。您可以使用中的常量来控制此行为struts.xml
。
但是,以我的观点,您应该自己创建它,或者使用具有DI的容器来创建它,该容器提供像Spring这样的bean配置。
private Logon logon = new Logon();
Struts2主要用于将许多动作映射到同一动作类,而不仅是execute
方法。因此,初始化一个bean可以安全地使您避免调用操作时在内部或外部重现的错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句