上一篇文章中,那种数据验证的方法不正规。
一般来说,两种验证方式,一是客户端的验证,例如JavaScript;另外一种,服务端的验证,Action中的validation方法。
客户端的数据安全性就比较低,因为客户可以跳过验证。validation的就相对严谨些。
同样,我用UserManager类来管理验证也行。
------------------UserManager.java
因为有了一个实体类,User.java 所以,这儿用一个UserManager 来管理它,该类中采用了Singleton(单例模式),提供一个没有返回值的Login方法,用以相关的业务判断。
抛出的错误,有两个:
一个是 UserNotFoundException,找不到用户,
package com.wgy.struts;
public class UserNotFoundException extends RuntimeException {
}
一个是 PasswordErrorException 密码错误
package com.wgy.struts;
public class PasswordErrorException extends RuntimeException {
}
------------------------------------------------------------------
LoginActionForm.java 在这个ActionForm 中添加了 reset 和 validation 的方法。打印出来,证明程序时可以执行到这两个方法。
原因在于这儿,struts-config.xml 文件中,
- <action path="/login"
- type="com.wgy.struts.LoginAction"
- name="loginForm"
- scope="request"
- validation="true"
- >
validation="true" 这是默认值。 设置为FALSE之后这两个方法就不可以执行了。
ActionForm 的生命周期可以设置为session(默认) 和 request,当设置为session 时,要记得在reset方法中将所有的属性重新设置为初始值。
如:
public void reset(){
username = null;
password = null;
}
而validation 方法中就可以写上判断业务逻辑的code。
LoginActionForm.java
------------------------------------------------------------------------
如果在UserManager.java 或者 validation方法中设置了判断逻辑,那在Action中就可以不用重复写了。
因为考虑到有异常,所以要捕获。成功通过验证,就通过 return mapping.findForward("success"); 定义到成功页面
错误 则 return mapping.findForward("error");
login_error.jsp 页面中要获得错误信息: <%=request.getAttribute("errorInfo") %>
login_success.jsp中要获得username
(LoginActionForm)request.getAttribute("loginForm");
- <action-mappings>
- <action path="/login"
- type="com.wgy.struts.LoginAction"
- name="loginForm"
- scope="request"
- >
中的name 相同。
==============================
小结一下:
牢记原则,不要再Action中进行业务逻辑处理,业务逻辑应该交给专门的model层去处理
在业务逻辑层抛出异常,在Action 中捕捉并且处理。