繁体   English   中英

Struts2 Action类验证方法

[英]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("")){

这只会在logonnull发生。


如果您在操作类中只有一个从提交的表单填充属性的操作,您可以通过 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM