Java Struts2动作类验证方法

Java Struts2动作类验证方法,java,validation,jsp,struts2,ognl,Java,Validation,Jsp,Struts2,Ognl,试图在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; }

试图在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");
    }

}
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;
}
}
登录。类:

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");
    }

}
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:

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");
    }

}
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;
}
}

Login.jsp
success.jsp

jsp:

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");
    }

}
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;
}
}

用户名:
除了使用新版本的Struts2之外,还有其他方法可以解决这个问题吗?
因为我发现一篇帖子说Struts 2.3.4有validate方法错误。

下面的代码中有
NullPointerException

if(logon.getUserName()==null | | logon.getUserName().equals(“”){
只有当
logon
null
时,才会发生这种情况


如果action类中只有一个action填充提交表单中的属性,则可以通过OGNL将输入控件绑定到action类属性


用户名:


此处,
logon.userName
是OGNL表达式,其计算结果为呈现文本字段的
值。除非明确指定
属性,否则将调用该表达式

它使用一个调用
getLogon().getUserName()
在操作实例上。由于在执行结果之前没有初始化
logon
属性,因此它将抛出另一个
NullPointerException
,但它在内部被捕获并被忽略。在这种情况下,texttfield标记不会呈现任何内容。您可能会觉得它可以工作

因为当您提交表单时,它会使用textfield的
name
属性中的一个值,并将其作为请求参数传递。然后,该参数名称会解析为OGNL。它与OGNL表达式
logon.userName
相同,但Struts将使用
getLogon().setUserName()
在操作实例上设置参数值

合理的问题是为什么它不抛出异常,即为什么调用
getLogon()
返回一个
Logon
实例?这是Struts2魔术。它可以处理调用
getLogon()
setUserName()之间的
null
。默认情况下,它会创建一个尚未创建的对象。您可以使用
struts.xml
中的常量来控制此行为

但是,在我看来,您应该自己创建它,或者使用具有DI的容器创建它,该容器提供类似Spring的Bean配置


简易固定解决方案:
private Logon=new Logon();

Struts2主要用于将多个动作映射到同一动作类,而不仅仅映射到执行
方法。因此,初始化bean可以安全地防止在调用动作时在内部或外部复制错误。

您应该使用Struts2模型驱动的arch,请参见此处&因为参数为null,所以它的抛出error@goodyzai不。不应该。您有
logon.getUserName()
正在运行,但在jsp中只有
用户名
。您看到区别了吗?谢谢,这解决了问题。但是现在在我提交表单之前显示错误消息。知道为什么会发生这种情况吗?您应该有两个操作,一个显示登录页面,另一个处理提交,显示的一个应该从验证中排除。请参阅