struts错误转到input视图

先贴代码:

applicationContext.xml:

[html]  view plain copy print ?
  1. <bean id="loginAction" class="jk.action.LoginAction">  
  2.     <property name="userService" ref="userService"/>  
  3. </bean>  

struts.xml:

[html]  view plain copy print ?
  1. <action name="login" class="loginAction" >  
  2.     <result name="success">/index.jsp</result>  
  3.     <result name="login">/login.jsp</result>  
  4. </action>  

LoginAction.java:

[html]  view plain copy print ?
  1. @Override  
  2. public String execute() throws Exception {  
  3.     User user = userService.userLogin(username, password);  
  4.     if (user == null) {  
  5.         addFieldError("login_error", getText("用户名或密码错误。。。"));  
  6.         return LOGIN;  
  7.     } else {  
  8.         return SUCCESS;  
  9.     }  
  10. }  


login.jsp:


[html]  view plain copy print ?
  1. <s:form action="login" method="post" onsubmit="return checkLogin();">  
  2.     <s:textfield id="username" name="username" />  
  3.     <s:password id="password" name="password" />  
  4.     <s:fielderror/>  
  5.     <input type="submit" value="登陆" id="submitLogin">  
  6. </s:form>  


这是一段简单的登陆验证的代码,但是这样写代码会出现一个问题,那就是当你第一次登陆验证失败后,以后无论你在怎么输账号验证,它都会跳转到input视图,而不是login视图。

其实原因很简单,那就是action执行的时候会先执行validate方法对参数进行一些列的验证,如果他发现当前对象包含fieldError信息,就会直接给你跳转到input视图,由于我们在execute()方法中使用了addFieidError方法给对象添加了fieldErrod信息,所以当第一次验证失败再进行第二次验证的时候,action发现自己有fieldEorr信息,就直接跳转到input视图了。

如果我们上面所说的成立,那么就证明我们两次访问的是同一个action对象,但是为什么会是同一个action对象呢,我们知道struts2是线程安全的,每次请求都会创建一个新的action对象,但是为什么这里不新建了呢?这主要是因为spring的Ioc容器,我们在srping中配置struts2的时候,在bean里面有一个选项scope,这个选项是用来配置bean的作用域的。其默认值是singleton,当bean的作用域是singleton时,Ioc容器只会为该bean创建一个实例对象,以后所有对该bean的请求都是访问的这一个对象。因此我们可以将bean的作用域配置为prototype,当bean的作用域为prototype时,每次访问该bean都会创建一个新的对象。更改后的代码:

applicationContext.xml:

[html]  view plain copy print ?
  1. <bean id="loginAction" class="jk.action.LoginAction" scope="prototype">  
  2.     <property name="userService" ref="userService"/>  
  3. </bean>  

除此之外还有一种方法,就是在action验证的时候把fieldError信息清理了

LoginAction.java:

[html]  view plain copy print ?
  1. @Override  
  2. public void validate() {  
  3.     super.validate();  
  4.     clearFieldErrors();  
  5. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值