Petstore源码追踪记(3)-商业逻辑处理(四)
http://www.rdxx.com 01年11月18日 11:08 互联网 我要投稿
User
EJB.java
,它是Local Entity Bean,对应数据库中实际资料表-
UserEJBTable在约88列可看到SignOnEJB所呼叫的函数,请读者顺便加
上侦察程序代码:
public boolean matchPassword(String password) {
//请加入侦察程序代码,方便稍候程序验证
System.out.println("UserEJB执行matchPassword()进行密码比对");
return password.equals(getPassword());
}
图17 UserEJB为Entity Bean
点选图17右下角”Deployment Settings”钮,可见到图18画面,
选择左下角”Method Implementation Queries”之”Container Methods”
之”createRow”,即可看到图18之SQL Query:
图18 UserEJB对应资料表为UserEJBTable
由上述所列程序代码及图,读者应该可以了解使用者登入在EJBz tier的运作情形,在UserEJB也看到一个不一样的用法,就是在Entity Bean上使用商业逻辑-matchPassword() 函数,在大部份的EJB书籍或文件都告诉我们商业逻辑应该用Session Bean去实作,资料则用Entity Bean来实作,但在这里密码比较的商业逻辑是非常简单的,只用了一行程序就解决了,所以也不需为了它另外再做一个Session Bean,
也许读者会问为什么不将此函数写在SignOnEJB?笔者认为密码比对不只在登入流程上会使用,在使用者基本资料编辑时也可能会用到,所以还是放在UserEJB比较适合:) 我们能够知道使用者基本资料是存于UserEJBTable,我们要如何知道此资料表所存内容是什么?请参阅注4。
现在请重复第一阶段验证步骤将程序重新编辑及部署,可发现程序如我们所预期般执行!
图19 第二阶段程序验证结果
第三阶段
大家还记得在SignOnFilter之validateSignOn()函数,验证成功会将
SIGNED_ON_USER变量(对应实际变量为j_signon)的值设为真值(true):
hreq.getSession().setAttribute(SIGNED_ON_USER, new Boolean(true));
当我们再次从首页进入使用者基本资料浏览页,会再度给SignOnFilter拦截,从Session取出SIGNED_ON_USER变量(对应实际变量为j_signon),经判断为真值(true),SignOnFilter则会放行转导至使用者基本资料浏览画面(customer.do),读者可参考下列程序代码加入侦察码,在约125列doFilter()函数:
boolean signedOn = false;
if (hreq.getSession().getAttribute(SIGNED_ON_USER) != null) {
signedOn
=((Boolean)hreq.getSession().getAttribute(SIGNED_ON_USER)).booleanValue();
//加入侦察码
System.out.println("signedOn="+signedOn);
} else {
hreq.getSession().setAttribute(SIGNED_ON_USER, new Boolean(false));
}
// jump to the resource if signed on
//若已登入过,则结束此Filter工作,进入Filter chain,以本例来说,它为
Filter chain中最后一个Filter,所以就是不做任何事,让使用者进入他的目的画面
if (signedOn) {
//加入侦察码
System.out.println("使用者已登入过!");
chain.doFilter(request,response);
return;
}
