Struts2 Action类验证方法

时间:2016-04-01 00:17:56

标签: java validation jsp struts2 ognl

尝试在Struts 2.3.4上使用验证方法,但得到以下错误:

  

显示java.lang.NullPointerException

     

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

行动类:

<head>
<script>
function ----() { 
var username = prompt("Please enter your username.");
if (username.toLowerCase() == "-----"){
    var password = prompt("Please enter your password.");
    if (password.toLowerCase() == "-----"){
   window.open('http://example.com',"_self")
}
else{
alert('Incorrect password. Please try again.')
}
}
else{
alert('Incorrect username. Please try again.')
}
}
</script>
</head>  

<body>
<p><a onclick="----()" href="javascript:void(0);">------</a></p>
</body>

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

}

struts.xml中:

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

JSP:

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

除了使用新版本的Struts2之外,还有什么方法可以解决这个问题吗? 因为我发现有一篇帖子说Struts 2.3.4有验证方法bug。

1 个答案:

答案 0 :(得分:2)

您在下面的代码中有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的魔力。它可以处理调用nullgetLogon()之间的setUserName()值。默认情况下,它会创建一个尚未创建的对象。您可以使用struts.xml中的常量来控制此行为。

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

简易固定解决方案:

private Logon logon = new Logon();

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