Struts2 操作 class 验证方法

Struts2 Action class validate method

尝试在 Struts 2.3.4 上使用验证方法但出现以下错误:

java.lang.NullPointerException

at com.action.LogonAction.validate(LogonAction.java:66) more......

动作class:

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 之外,还有什么方法可以解决这个问题吗? 因为我发现一个 post 说 Struts 2.3.4 有验证方法错误。

您在下面的代码中有 NullPointerException

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

这只有在 logonnull 时才会发生。


如果您在操作 class 中只有一个操作从提交的表单中填充属性,您可以通过 OGNL 将输入控件绑定到操作 class 属性。

<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() returns 一个 Logon 实例?这是 Struts2 魔法。它可以处理调用 getLogon()setUserName() 之间的 null 个值。默认情况下,如果尚未创建对象,它会创建一个对象。您可以使用 struts.xml 中的常量来控制此行为。

但是,在我看来,您应该自己创建它,或者使用具有 DI 的容器创建它,它提供像 Spring 这样的 bean 配置。


简单的解决方案:

private Logon logon = new Logon();

Struts2 主要用于将许多动作映射到同一动作 class 而不仅仅是映射到 execute 方法。因此,初始化一个 bean 将安全地避免在调用操作时在内部或外部重现的错误。