struts错误转到input视图
2015-10-15 17:42
483 查看
先贴代码:
applicationContext.xml:
[html] view
plaincopyprint?
<bean id="loginAction" class="jk.action.LoginAction">
<property name="userService" ref="userService"/>
</bean>
struts.xml:
[html] view
plaincopyprint?
<action name="login" class="loginAction" >
<result name="success">/index.jsp</result>
<result name="login">/login.jsp</result>
</action>
LoginAction.java:
[html] view
plaincopyprint?
@Override
public String execute() throws Exception {
User user = userService.userLogin(username, password);
if (user == null) {
addFieldError("login_error", getText("用户名或密码错误。。。"));
return LOGIN;
} else {
return SUCCESS;
}
}
login.jsp:
[html] view
plaincopyprint?
<s:form action="login" method="post" onsubmit="return checkLogin();">
<s:textfield id="username" name="username" />
<s:password id="password" name="password" />
<s:fielderror/>
<input type="submit" value="登陆" id="submitLogin">
</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
plaincopyprint?
<bean id="loginAction" class="jk.action.LoginAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
除此之外还有一种方法,就是在action验证的时候把fieldError信息清理了
LoginAction.java:
[html] view
plaincopyprint?
@Override
public void validate() {
super.validate();
clearFieldErrors();
}
applicationContext.xml:
[html] view
plaincopyprint?
<bean id="loginAction" class="jk.action.LoginAction">
<property name="userService" ref="userService"/>
</bean>
struts.xml:
[html] view
plaincopyprint?
<action name="login" class="loginAction" >
<result name="success">/index.jsp</result>
<result name="login">/login.jsp</result>
</action>
LoginAction.java:
[html] view
plaincopyprint?
@Override
public String execute() throws Exception {
User user = userService.userLogin(username, password);
if (user == null) {
addFieldError("login_error", getText("用户名或密码错误。。。"));
return LOGIN;
} else {
return SUCCESS;
}
}
login.jsp:
[html] view
plaincopyprint?
<s:form action="login" method="post" onsubmit="return checkLogin();">
<s:textfield id="username" name="username" />
<s:password id="password" name="password" />
<s:fielderror/>
<input type="submit" value="登陆" id="submitLogin">
</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
plaincopyprint?
<bean id="loginAction" class="jk.action.LoginAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
除此之外还有一种方法,就是在action验证的时候把fieldError信息清理了
LoginAction.java:
[html] view
plaincopyprint?
@Override
public void validate() {
super.validate();
clearFieldErrors();
}
相关文章推荐
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- 肯特·贝克:改变人生的代码整理魔法
- 网页恶意代码的预防
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- Lua中编译执行代码相关的函数详解
- 更有效率的css代码编写第1/3页
- 代码中到底应不应当写注释?
- SQL语言查询基础:连接查询 联合查询 代码
- 论坛头像随机变换代码
- .NET 常用功能和代码小结
- C#实现压缩HTML代码的方法
- asp编程中常用的javascript辅助代码第1/2页
- C#超实用代码段合集
- Javascript代码在页面加载时的执行顺序介绍
- JS实现图片无间断滚动代码汇总
- 我的论坛源代码(二)