尝试在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。
答案 0 :(得分:2)
您在下面的代码中有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
。除非您明确指定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将安全地保留在调用操作时内部或外部再现的错误。