忙了几天,终于把这次的项目结构和流程弄清楚了,整理了一下。
1. 目录结构:
a. C:\scm\CSZ\config放置的是本次系统的配置文件。
1. application-config.xml系统流程控制文件(*)
2. app-message-JP.xml消息文件
3. document-merge-dictionary.xml标签与入出力助手映射文件
4. fault-action-config.xml出错流程控制文件
5. lookup-service-config.xml 生成EJB JNDI树的配置文件
6. startup.xml服务器启动时,由控制器Servlet读入的用来关联其它配置文件。
7. message-file-mapping.xml英日文消息输入映射文件。
8. sys-message-EN.xml英文消息文件。
9. sys-message-JP.xml日文消息文件。
10. system-config.xml系统共通配置的定义。如:系统的情报,EJB type的映射,Log的出力设置等。
b. C:\scm\properties\CSZ放置的是property文件。注:这次项目要求SQL语句与程序分离,所以我们的SQL语句都写在property文件里,由程序读入。
c. C:\IBM\WebSphere Studio\项目名\META-INF放置的是WEB和EJB的配置文件。(在WSAD中建立项目时自动生成的)
d. C:\IBM\WebSphere Studio\CSZEPSample放置的是EJB相关的东东。
e. C:\IBM\WebSphere Studio\CSZEPSample\ejbModule\jp\co\tepco\CSZ\ap\web\cmp放置的是处理帐票和一些检查的类逻辑处理的类。
f. C:\IBM\WebSphere Studio\CSZEPSample\ejbModule\jp\co\tepco\CSZ\ap\web\com放置共通和VO的地方。(View Object Value Object 这次项目中没有VO和PO的概念)
g. C:\IBM\WebSphere Studio\CSZEPSample\ejbModule\jp\co\tepco\CSZ\ap\web\ctl放置EJB Session Bean用来进行流程控制。
h. C:\IBM\WebSphere Studio\CSZEPSample\ejbModule\jp\co\tepco\CSZ\ap\web\dao放置业务处理BEAN数据查询删除等操作的类。
i. C:\IBM\WebSphere Studio\CSZEPSample\ejbModule\META-INF放置EJB部署文件和EJB JNDI在绑定文件。
j. C:\IBM\WebSphere Studio\CSZWPSample放置的是WEB相关的东东。
k. C:\IBM\WebSphere Studio\CSZWPSample\Web Content\CSZ\JSP放置JSP文件。
l. C:\IBM\WebSphere Studio\CSZWPSample\Web Content\CSZ\JS放置JS文件。
m. C:\IBM\WebSphere Studio\CSZWPSample\Web Content\WEB-INF放置服务器配置文件。
n. C:\IBM\WebSphere Studio\CSZWPSample\Web Content\WEB-INF\lib\tlds放置标签文件。
2. 该项目包装后的EJB结构
大家可以看一下业务FrameWork的帮助文档,在CSASRFwkEJBAppControllerBase中公开了所有的业务方法。看一下就好不必研究:)
Home接口:jp.co.tepco.ifit.fw.business.controller.EJBAppControllerHome这个接口是由容器实现的,我们不用管它J
远程接口:jp.co.tepco.ifit.fw.business.controller.EJBAppController这个接口也是由容器自己实现的,我们还是不用管它J
SessionBean:根据上图,我们每一个EnterpriseBean都必须继承自CSASRFwkEJBAppControllerBase这个Bean是由我们来实现的。
在Sample中,我没有看到本地Home接口和远程对象接口。好象在将近400页的环境说明文档中有看到说这个项目都使用远程的,但找不到了L
除了EnterpriseBean外,我们还要写Dao层Bean(也说是业务层Bean)还有vo(View Object就是一些get和set的东东),它们之间的关系是,Dao层包装vo返回给EnterpriseBean在由EnterpriseBean分发回客户端。(JSP)
3. JSP页面提交流程
a.每个JSP页面FROM的ACTION都要这样写:
ACTION = ""
意思是动态得到URL, URL的格式是: *.act,如CSZSRCtlMenu.act。这个URL是由中央控制器FrontController通过传入的ID在Application-config.xml中查找并返回的(pathname)。当提交FROM时,FrontController就可以通过URL在Application-config.xml中查找到相应的节点,并进行下一步动作。
2.FrontController根据你的URL在Application-config.xml文件中找到相对应的pathname,
根据pathname找到业务服务节点 business-service,这里相当于一个中转,所有的处理有在这里,input-action-id对应了input-action(图中没有标出),input-action的作用是将页面上的数据包装成InputHelper传入服务器端(不必去研究)。最重要的是app-controller-proxy-id对应了app-controller-proxy,然后通过name找到上面提到过的JNDI树中对应的NAME,就可以找到JNDI名了。然后在lookup EJB。(有个EJB绑定文件,大家可以看看)
3. 这里必须注意的是每个JSP页面上都要写一个Hidden,名字是PO,如下:
它的作用是告诉你的enterpriseBean中应该执行哪个业务方法方法。
另外,在提交按钮处必须给出onclick事件,并且要像下面这样写:
ONCLICK = "submitForm('previousPage')
SubmitForm是导入的JS文件中的方法.( IBM\WebSphere Studio\CSZWPSample\Web Content\CSZ\JS\ CSZ_Common.js)它有一个参数.这个方法的作用是将你的参数赋值给JSP页面上定义的那个OP,然后提交页面.
4. 返回JSP流程.
理解了JSP提交流程后,这里就比较简单了.如下.
1. 首先从CSASRFwkCommonObject中get一个CSASRFwkResponse.然后声明一个CSASRFwkOutputHelper(用来存放要传到JSP页面数据的对象)然后将CSASRFwkOutputHelper置入CSASRFwkResponse中.
2. 比较重要的一步:
利用CSASRFwkResponse.setResultCode(参数),这里的参数对应application-config.xml中定义result-code-map的result-code: