Java Struts2动作类验证方法
试图在Struts 2.3.4上使用validate方法,但出现以下错误: java.lang.NullPointerException 位于com.action.LogonAction.validate(LogonAction.java:66) 更多 动作类:Java Struts2动作类验证方法,java,validation,jsp,struts2,ognl,Java,Validation,Jsp,Struts2,Ognl,试图在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 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");
}
}
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;
}
}
登录。类:
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");
}
}
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:
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");
}
}
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;
}
}
Login.jsp
success.jsp
jsp:
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");
}
}
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;
}
}
用户名:
除了使用新版本的Struts2之外,还有其他方法可以解决这个问题吗?
因为我发现一篇帖子说Struts 2.3.4有validate方法错误。下面的代码中有
NullPointerException
if(logon.getUserName()==null | | logon.getUserName().equals(“”){
只有当logon
为null
时,才会发生这种情况
如果action类中只有一个action填充提交表单中的属性,则可以通过OGNL将输入控件绑定到action类属性
用户名:
此处,
logon.userName
是OGNL表达式,其计算结果为呈现文本字段的值。除非明确指定值
属性,否则将调用该表达式
它使用一个调用getLogon().getUserName()
在操作实例上。由于在执行结果之前没有初始化logon
属性,因此它将抛出另一个NullPointerException
,但它在内部被捕获并被忽略。在这种情况下,texttfield标记不会呈现任何内容。您可能会觉得它可以工作
因为当您提交表单时,它会使用textfield的name
属性中的一个值,并将其作为请求参数传递。然后,该参数名称会解析为OGNL。它与OGNL表达式logon.userName
相同,但Struts将使用getLogon().setUserName()
在操作实例上设置参数值
合理的问题是为什么它不抛出异常,即为什么调用getLogon()
返回一个Logon
实例?这是Struts2魔术。它可以处理调用getLogon()
和setUserName()之间的null
值
。默认情况下,它会创建一个尚未创建的对象。您可以使用struts.xml
中的常量来控制此行为
但是,在我看来,您应该自己创建它,或者使用具有DI的容器创建它,该容器提供类似Spring的Bean配置
简易固定解决方案:
private Logon=new Logon();
Struts2主要用于将多个动作映射到同一动作类,而不仅仅映射到执行
方法。因此,初始化bean可以安全地防止在调用动作时在内部或外部复制错误。您应该使用Struts2模型驱动的arch,请参见此处&因为参数为null,所以它的抛出error@goodyzai不。不应该。您有logon.getUserName()
正在运行,但在jsp中只有用户名
。您看到区别了吗?谢谢,这解决了问题。但是现在在我提交表单之前显示错误消息。知道为什么会发生这种情况吗?您应该有两个操作,一个显示登录页面,另一个处理提交,显示的一个应该从验证中排除。请参阅