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 条评论
登录 后参与评论

相关文章

Struts2 Bean验证

Struts2验证中的短路

验证期间Struts2超时

Struts2:如何监视SERVER SIDE Action流的进度?

struts2 tokensession 未在 Action excludeMethod 中设置请求

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

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

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

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

Struts2验证消息出现两次

Java类中的Struts2 i18n

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

Java Struts2(未找到操作类)

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

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

调用struts2动作的简单方法

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

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

Struts2 + Spring Security 2.06:尝试在Action方法上使用@Secured时,Valuestack为null

在struts.xml中配置操作类时,请求的资源在struts2中不可用

Struts2 Only Use specific Variable Object for JSON Result(不是所有的Action变量)

struts2将HTML文本发送回actionerror或action消息中

过滤器映射网址模式* .action不起作用struts2

Struts2 INPUT结果:如何工作?如何处理转换/验证错误?

使用消息存储拦截器进行struts2验证

Struts2:在上传验证消息中指定最大文件大小

如何在Struts2中的if标签中验证HashSet的大小大于零?

在Struts2中进行xml验证后无法重新填充值

我正在发送json数据并尝试进入struts2动作类