[英]Struts2 Action class validate method
尝试在 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");
}
}
登录.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
。 除非您明确指定value
属性,否则将调用表达式。
它在操作实例上使用getLogon().getUserName()
调用。 由于您没有在执行结果之前初始化logon
属性,因此它会抛出另一个NullPointerException
但它在内部被捕获并被忽略。 在这种情况下, texttfield 标记不呈现任何内容。 你可能会觉得它有效!?
因为当您提交表单时,它使用来自文本字段的name
属性的值并将其作为请求参数传递。 此参数名称然后解析为 OGNL。 它与 OGNL 表达式logon.userName
相同,但 Struts 将在操作实例上使用getLogon().setUserName()
来设置参数的值。
合理的问题为什么它不抛出异常,即为什么对getLogon()
的调用返回一个Logon
实例? 这就是 Struts2 的魔法。 它可以处理调用getLogon()
和setUserName()
之间的null
值。 默认情况下,它会创建一个尚未创建的对象。 您可以使用struts.xml
的常量来控制此行为。
但是,在我看来,您应该自己创建它或使用具有 DI 的容器创建它,该容器提供像 Spring 一样的 bean 配置。
private Logon logon = new Logon();
Struts2 主要用于将许多动作映射到同一个动作类,而不仅仅是execute
方法。 因此,初始化 bean 可以安全地避免在调用操作时在内部或外部重现错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.