Struts2 Action类的验证方法

安迪

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

}

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

罗马C

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文本字段的a。除非您明确指定一个value属性,否则将调用该表达式。

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

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

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

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


简易解决方案:

private Logon logon = new Logon();

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Struts2 Bean验证

来自分类Dev

Struts2验证中的短路

来自分类Dev

Struts2中的表单验证

来自分类Dev

如何避免Struts2验证

来自分类Dev

Struts2验证中的短路

来自分类Dev

Jsp Struts2中Action类的调用函数

来自分类Dev

Struts2从applicationContext忽略Action类的值属性

来自分类Dev

Struts2将列表数据从JSP发送到Action类:替代方法

来自分类Dev

从ajax请求在Struts2 Action获取空值

来自分类Dev

struts2 tokensession 未在 Action excludeMethod 中设置请求

来自分类Dev

将 bean 从 action 映射到 struts2 中的表单

来自分类Dev

使用注释在struts2中进行验证

来自分类Dev

在Struts2中验证整数值吗?

来自分类Dev

Struts2模型驱动的验证不起作用

来自分类Dev

如何突出显示未通过Struts2验证的字段?

来自分类Dev

Struts2验证消息出现两次

来自分类Dev

无法在struts2框架中加载验证xml文件

来自分类Dev

跳过对Struts2中某些字段的验证

来自分类Dev

将变量从操作类(struts2)传递到JSP

来自分类Dev

Java Struts2(未找到操作类)

来自分类Dev

将变量从操作类(struts2)传递到JSP

来自分类Dev

Java Struts2(未找到操作类)

来自分类Dev

Struts2 Fileupload在操作类中提供空文件

来自分类Dev

Struts2将列表数据从JSP发送到Action类:另一种方法

来自分类Dev

调用struts2动作的简单方法

来自分类Dev

Struts2不能正确地将文本字段从JSP映射到Action类

来自分类Dev

Struts2 <s:select list=mylist"/> 通过请求对象而不是在 Action 类中

来自分类Dev

如何使用JavaScript调用Struts2 Action Class方法中的方法

来自分类Dev

在动作类中执行CRUD操作以及Struts2中的prepare()方法