现在把,没有一种共通的方法来用程序创建一个jee系统用户,各个容器厂家实现的方 法不同,你要是非要这么作,你就只能用这个平台了,不过,这就看你程序写的活不活 了,你写活点,尽量让这部分可以拔插,以便以后的更改平台时变化。(题外话,据说最 新的j2ee的jas提出了一套登陆和验证的规范,哥几个可以研究1下去) 看图把,这是一个用户登陆和注册的活动图(题外话,啥叫活动图,说白了就是一个实 例的一个动作周期),页面有两种,受保护的,不受保护的。访问受保护的页面需要登陆 Store roquest Show [User Signed On Create User request signon creato Create User Customer [Failed) [Falled] Show Invalid Creation Error 当一个用户请求保护页面的时候,应用系统判断用户是否登陆了。如果用户没有登陆, 应用系统先保存这个请求地址,然后导向到登陆界面 登陆界面提供两个功能 已经注册的用户可以登陆 页面验证客户的用户名和保密字,如果fai了,显示错误页 注册一个新用户 如果客户要创建一个新的用户,让他填写各种注册信息。然后创建,如果创建 成功,回显这些信息,否则,跳转到错误页。 如果登陆注册成功后,应用系统会把保存在 session中的信息和URL取出,跳转到那个 URL中,让用户继续购物。 用户登陆和客户登记模块实 用户的登陆处理时通过WAF组件, SignonFilter,实现的。它探测到哪些请求是导向受 保护页面的。 SignOnFilter组件是一个 servlet过虑器,它可以捕获任何的请求,在请求之前作一些预 理,也可以被挂在被请求被相应之后,作一些善后处理 宠物店应用中,一些页面,只有登陆才能看,那,到底是哪些页面呢,呵呵,别着急
现在把,没有一种共通的方法来用程序创建一个 j2ee 系统用户,各个容器厂家实现的方 法不同,你要是非要这么作,你就只能用这个平台了,不过,这就看你程序写的活不活 了,你写活点,尽量让这部分可以拔插,以便以后的更改平台时变化。(题外话,据说最 新的 j2ee 的 jaas 提出了一套登陆和验证的规范,哥几个可以研究 1 下去)。 看图把,这是一个用户登陆和注册的活动图(题外话,啥叫活动图,说白了就是一个实 例的一个动作周期),页面有两种,受保护的,不受保护的。访问受保护的页面需要登陆: 《图 15》 当一个用户请求保护页面的时候,应用系统判断用户是否登陆了。如果用户没有登陆, 应用系统先保存这个请求地址,然后导向到登陆界面。 登陆界面提供两个功能: ⚫ 已经注册的用户可以登陆: 页面验证客户的用户名和保密字,如果 fail 了,显示错误页。 ⚫ 注册一个新用户 如果客户要创建一个新的用户,让他填写各种注册信息。然后创建,如果创建 成功,回显这些信息,否则,跳转到错误页。 如果登陆/注册成功后,应用系统会把保存在 session 中的信息和 URL 取出,跳转到那个 URL 中,让用户继续购物。 用户登陆和客户登记模块实现 用户的登陆处理时通过 WAF 组件,SignOnFilter,实现的。它探测到哪些请求是导向受 保护页面的。 SignOnFilter 组件是一个 servlet 过虑器,它可以捕获任何的请求,在请求之前作一些预处 理,也可以被挂在被请求被相应之后,作一些善后处理。 宠物店应用中,一些页面,只有登陆才能看,那,到底是哪些页面呢,呵呵,别着急
都在 signon- config. xml文件中定义了, SignOnFilter会看你请求的是不是 signon-config xml 中规定的保护页面。 看图把 《图16》 SignOn Filter page [not signed on protected] protected] 与 [|[ n form SignonFilter捕获到一个请求,无非就三种情况 是个登录请求,好,那我就去读取请求传过来参数:用户名,保密字。然后使用无状 态 SignOnEJE到User实体EB去核实用户名和保密字是否匹酯 b.如果是个普通的不受保护的页面,那么直接导向 c如果是个手保护的页面,而且,用户没有登陆, Signon Filter先把请 求得URL保存起来,并且导向到 Signon页面 当然, SignOnFilter只处理己经注册得用户,对于没有注册得用户得创建,下面讲,呵呵 用户和客户的创建的实现 个客户是由好几个实体EJB组成的。User的EJB代表了客户的用户名和保密字。其他 的实体Eb代表了客户, profile,帐户,联系信息,地址和信用卡。(这几句不太会翻译) 用户创建 宠物店使用WAF来创建一个新用户,你可以看到一个很好的waf被扩展功能的好方法 下图展示了创建一个宠物店用户用到的所有的WAF相关的类和接口。一个URL请求一 来, RequestProcessor创建和执行一个 HTML Action(这里是 CreateUserHTMLAction), 来执行所有的web层的处理。由于真正的创建的处理在EJB层, CreateUserhTMlAction 仅仅返回一个事件( CreateUser event, RequestProcess会把这个事件传递给web端的控制 器( WebClientcontroller),Web端的控制器然后传递给EJB端的控制器(有状态的EJB: EJBClient Con trollerEjB)。EJB端的控制器然后,找到相应的 EJBAction来完成真正的商 业处理。这个流程是由WAF框架类来处理的,而业务相关的处理是由开发者自己编写的 代码完成
都在 signon-config.xml文件中定义了,SignOnFilter 会看你请求的是不是 signon-config.xml 中规定的保护页面。 看图把, 《图 16》 SignOnFilter 捕获到一个请求,无非就三种情况贝: a.是个登录请求,好,那我就去读取请求传过来参数:用户名,保密字。然后使用无状 态 SignOnEJB 到 User 实体 EJB 去核实用户名和保密字是否匹配。 b.如果是个普通的不受保护的页面,那么直接导向 c.如果是个手保护的页面,而且,用户没有登陆,SignOnFilter 先把请 求得 URL 保存起来,并且导向到 SignOn 页面。 当然,SignOnFilter 只处理已经注册得用户,对于没有注册得用户得创建,下面讲,呵呵。 用户和客户的创建的实现 一个客户是由好几个实体 EJB 组成的。User 的 EJB 代表了客户的用户名和保密字。其他 的实体 Ejb 代表了客户,profile,帐户,联系信息,地址和信用卡。(这几句不太会翻译) 用户创建 宠物店使用 WAF 来创建一个新用户,你可以看到一个很好的 waf 被扩展功能的好方法。 下图展示了创建一个宠物店用户用到的所有的 WAF 相关的类和接口。一个 URL 请求一 来,RequestProcessor 创建和执行一个 HTML Action(这里是 CreateUserHTMLAction), 来执行所有的 web 层的处理。由于真正的创建的处理在 EJB 层,CreateUserHTMLAction 仅仅返回一个事件(CreateUserEvent),RequestProcess 会把这个事件传递给 Web 端的控制 器(WebClientController),Web 端的控制器然后传递给 EJB 端的控制器(有状态的 EJB: EJBClientControllerEJB)。EJB 端的控制器,然后,找到相应的 EJBAction 来完成真正的商 业处理。这个流程是由 WAF 框架类来处理的,而业务相关的处理是由开发者自己编写的 代码完成。 <图 17>
gp:EvenIName EJBAction perform WebClientControllerimpl reateUscrEJBAction a controller thandleEvun I CreateUsorHTMLAction <creates SignOn == 好,让我们看看交互图把 1。创建一个用户的请求是 createuser. do,web的配置文件 web.xm中把*do的 请求都映射到了 Main Servlet上 巴上w[rs c CreateUser scsessionpplccentit EJBAction SiqnOnEJB 2: create 4: cr 11: create 2。下面的从请求映射文件 mapping xml摘要,说明了这个URL请求 createuser.do 将要被( reateUserhTMLAction处理,并且说明了,处理完了以后,跳转到 create customer screen屏幕去。 <url-mapping url"createuser. do"screen- <action-class com.sun j2ee blueprints. petstore controller. web. actions. CreateUserHTMLAction 请求处理器 RequestProcessor在xml文件中寻找到 createuser do对应的 CreateUserHTMLAction类,创建之 3。请求处理器 RequestProcessor调用 CreateUserhTmlaction的 perform(方法 4。 CreateUserhTmlaction的 performo方法创建 CreateUser event事件,把用户 名和保密字,然后发挥这个事件给请求处理器 RequestProcessor这个事件封装了 一个命令,将来要传递到EB端的控制器(ECC)以真正完成创建工作。 5。请求处理器 RequestProcessor传递这个事件给一个WEB层的控制器 (WebClientController) 6。WEB层控制器只是个代理,它立刻把事件转手给了EJB层的控制器 (Shopping ClientControllerEJB)
好,让我们看看交互图把, 1。创建一个用户的请求是 createuser.do,web 的配置文件 web.xml 中把*.do 的 请求都映射到了 MainServlet 上。 <图 18> 2。下面的从请求映射文件 mapping.xml 摘要,说明了这个 URL 请求 createuser.do 将要被 CreateUserHTMLAction 处理,并且说明了,处理完了以后,跳转到 create_customer.screen 屏幕去。 <url-mapping url="createuser.do" screen="create_customer.screen"> <action-class> com.sun.j2ee.blueprints.petstore.controller.web.actions.CreateUserHTMLAction </action-class> </url-mapping> 请 求 处理 器 RequestProcessor 在 xml 文 件中 寻 找到 createuser.do 对应的 CreateUserHTMLAction 类,创建之。 3。请求处理器 RequestProcessor 调用 CreateUserHTMLAction 的 perform()方法。 4。CreateUserHTMLAction 的 perform()方法创建 CreateUserEvent 事件,把用户 名和保密字,然后发挥这个事件给请求处理器 RequestProcessor.这个事件封装了 一个命令,将来要传递到 EJB 端的控制器(ECC),以真正完成创建工作。 5。请求处 理器 RequestProcessor 传递这 个事件给 一个 WEB 层的 控制器 (WebClientController). 6。WEB 层控制器只是个代理,它立刻把事件转手给了 EJB 层的控制器 (ShoppingClientControllerEJB)
7。然后把,EJB层的控制器就创建了个 CreateUserejbaction,这个 EBAction 中真正的创建了用户。每个事件中都有方法叫 get EventNameo,它表明了事件本 身的名字,EB层的控制器就通过这个名字到FJB层的控制器这个 sessionEJB 的 ejb-jar xm中,找到事件名字对应的 EJBAction类这样, CreateUserEJBAction 就可以被找到,里面封装了对用户的真正创建动作 CreateUserEvent java eturn "java: comp/env/param/event/CreateUserEvent": <env-entry> <env-entry-name>param/event/CreateUserEvent</env-entry-name> <env-entry-type>java. lang String </env-entry-type> CreateUserEJBAction</env-entry-values ts petstorecontroller ejb actions 8。EJB层的控制器调用 CreateUserejbaction的 process Event方法,方法的入参 是 CreateUser Event事件。 9 CreateUserEJBAction调用 CreateUser Event的 getUser Name和 getPassword得 到用户名和保密字。 10。 CreateUserEJBAction然后创建一个无状态 EJB: SignOnEJB,来创建/认证用 l1。 CreateUserEJBAction创建User实体EJB,用来保存用户和它的保密字。 一旦用户被创建,下一步就是创建一个客户实体( Customer entities) 客户创建 创建完一个用户user)后,要创建一个客户( customer)。WAF会导向你进入 后台的EB层的处理会创建一个和User实体EJB的内部连接,是通过 Customer 中useD保存他们的关系 客户 customer)的创建其实和用户(user)的创建过程一样 基于 mappings. xml,请求处理器 RequestProcessor找到请求“ customer.do” 对应的 CustomerhTmlaction类,然后创建它,然后调用它的 performo方法 2 CustomerHTMLActionperformo方法构建并返回一个 Customer Event事件类, 包含了创建客户必须的各种信息 3.请求处理器 RequestProcessor把 Customer Event事件传递给web层控制器 4.在容器的环境变量中获得 Customer event事件对应的 EJBAction处理类 Customerejbaction,EJB端控制器创建它,然后把 Customer event事件创给它 的 handle event方法,执行 5.读取 Customer Event事件中封装的数据, Customer EjBAction hand leEven)方 法创建一个 Customer实体EJB和相关的实体EJB 6.然后 CustomerhTMLAction do endo方法会被调用,用来完成用户的自动登陆 7.屏幕流程控制器,然后导向到屏幕 customer screen,用来回显客户的所有创建 信息给用户
7。然后把,EJB 层的控制器就创建了个 CreateUserEJBAction,这个 EJBAction 中真正的创建了用户。每个事件中都有方法叫 getEventName(),它表明了事件本 身的名字,EJB 层的控制器就通过这个名字到 EJB 层的控制器这个 sessionEJB 的 ejb-jar.xml 中,找到事件名字对应的 EJBAction 类。这样,CreateUserEJBAction 就可以被找到,里面封装了对用户的真正创建动作。 <图 19> 8。EJB 层的控制器调用 CreateUserEJBAction 的 processEvent 方法,方法的入参 是 CreateUserEvent 事件。 9。CreateUserEJBAction 调用 CreateUserEvent 的 getUserName 和 getPassword 得 到用户名和保密字。 10。CreateUserEJBAction 然后创建一个无状态 EJB:SignOnEJB,来创建/认证用 户。 11。CreateUserEJBAction 创建 User 实体 EJB,用来保存用户和它的保密字。 一旦用户被创建,下一步就是创建一个客户实体(Customer entities)。 客户创建 创建完一个用户(user)后,要创建一个客户(customer)。WAF 会导向你进入 create_customer.screen 屏幕。填写客户登记的各种信息,的,填完了,就提交把。 后台的 EJB 层的处理会创建一个和 User 实体 EJB 的内部连接,是通过 Customer 中 userID 保存他们的关系。 客户(customer)的创建其实和用户(user)的创建过程一样: 1. 基于 mappings.xml,请求处理器 RequestProcessor 找到请求“customer.do ” 对应的 CustomerHTMLAction 类,然后创建它,然后调用它的 perform()方法。 2.CustomerHTMLAction.perform()方法构建并返回一个 CustomerEvent 事件类, 包含了创建客户必须的各种信息。 3. 请求处理器 RequestProcessor 把 CustomerEvent 事件传递给 Web 层控制器. 4. 在容器的环境变量中获得 CustomerEvent 事件对应的 EJBAction 处理类 CustomerEJBAction,EJB 端控制器创建它,然后把 CustomerEvent 事件创给它 的 handleEvent()方法,执行。 5. 读取 CustomerEvent 事件中封装的数据,CustomerEJBAction.handleEvent()方 法创建一个 Customer 实体 EJB 和相关的实体 EJB. 6. 然后 CustomerHTMLAction.doEnd()方法会被调用,用来完成用户的自动登陆 功能。 7. 屏幕流程控制器,然后导向到屏幕 customer.screen,用来回显客户的所有创建 信息给用户
1.1.11异步消息模块 宠物店 stateless session EJB格式化订单成为一个xml文件流,并传送给 Order processing Center(OPC来处理 异步消息模块需求 宠物店和OPC之间的交互要求 通讯必须是异步的,因为订单的处理需要花费很长时间,购物过程不能在这里等待消息的传输 必须可以信赖宠物店发送一份订单要保证OPC能受到这份订单来处理 如果OPC不可用这些订单需要被保存起来等opc恢复了,再取出处理 宠物店和OPC之间的接口必须灵活对于opc和宠物店两端应该容易改变 opc的客户端甚至可以不是java程序书写 每个订单必须有全局唯一标识 异步消息模块实现 WAF开始创建一个购物订单然后传给OPC,使用 WebAction, EBEvent, EjbAction当一个用户第 次请求购买购物车里面的内容,会激活 signon过滤器,来确保用户己经登录,并且组装模板来 完成响应界面- enter order information. screenjSP页面包含了订单的其他信息,然后激活 order. do请求通过 mapping. xm中的请求映射wAF来创建一个 OrderhTMlAction,它负责产生 一个 Order Event,这个 Event会送给EJB层的 OrderEJBAction来处理 个流程图表明了这个过程 Orderejbaction执行EJB层的商业逻辑处理并且传输一个 PO(purchase order)对象(是个XML流)给OPC,是通过JMS给的图中显示的 Action类创建一个 新的购买订单它使用 Unique GeneratorEJB来创建一个全局唯一的 orderID并且,这个订单中还 有用户的运送地址,信用卡号码,这些信息实际上都是从 Order event中获得的 Orderejbaction 会重复的读取购物车中的内容把这些内容加入到购买订单中 <图20> EJBAction (EJB tier I(EJB tier OrderQueue EJBActions NS EJB>> Factory Order D 最后, Orderejbaction创建一个 AsynHelper来发送订单的XML内容给 OPC. AnsynHelper是 个商业代理( bussiness delegate-j2eeDP),它提供一个消息发送的服务同时封装了 lookup和消息 传送的细节 Asynchelper通过 JMSLocator找到消息队列,并且使用 AsyncSenderejB的 stateless ession ejb来发送XML消息然后呢OPC的异步消息Bean(MDB)会受到这个XML消息,当 然宠物店仍然继续响应着其他的请求呢宠物店根本不维护它创建过哪些 Order的历史信息 些都由OPC来做了 O类代表了购买的订单,有 orderly, userIdD,发送地址订单的货物条目等信息它有个 toXMLO 方法用来产生一个XML字符流这个XML流将通过 Asynchelper类发送一个 JMS text消息 消息队列当OPC接受到xml消息它创建和初始化一个新的OP实例用XML消息中内容
1.1.1.1 异步消息模块 宠物店 stateless session EJB 格式化订单成为一个 xml 文件流,并传送给 Order Processing Center(OPC)来处理. 异步消息模块需求 宠物店和 OPC 之间的交互要求: .通讯必须是异步的,因为订单的处理需要花费很长时间,购物过程不能在这里等待.消息的传输 必须可以信赖,宠物店发送一份订单,要保证 OPC 能受到这份订单来处理 • 如果 OPC 不可用,这些订单需要被保存起来,等 opc 恢复了,再取出处理 • 宠物店和 OPC 之间的接口必须灵活,对于 opc 和宠物店两端应该容易改变 • opc 的客户端甚至可以不是 java 程序书写 • 每个订单必须有全局唯一标识 异步消息模块实现 WAF 开始创建一个购物订单然后传给 OPC,使用 WebAction,EJBEvent,EjbAction.当一个用户第 一次请求购买购物车里面的内容,会激活 signon 过滤器,来确保用户已经登录,并且组装模板来 完成响应界面--enter_order_information.screen.JSP 页面包含了 订单的其 他信息, 然后激活 order.do 请求.通过 mapping.xml中的请求映射,WAF 来创建一个 OrderHTMLAction,它负责产生 一个 OrderEvent,这个 Event 会送给 EJB 层的 OrderEJBAction 来处理. 一个流程图表明了这个过程.OrderEJBAction 执行 EJB 层的商业逻辑处理并且传输一个 PO(purchase order)对象(是个 XML流)给OPC,是通过 JMS 给的.图中显示的,Action 类创建一个 新的购买订单.它使用 UniqueGeneratorEJB 来创建一个全局唯一的 orderID.并且,这个订单中还 有用户的运送地址,信用卡号码,这些信息实际上都是从 OrderEvent 中获得的.OrderEJBAction 会重复的读取购物车中的内容,把这些内容加入到购买订单中. <图 20> 最后,OrderEJBAction 创建一个 AsynHelper 来发送订单的 XML 内容给 OPC.AnsynHelper 是一 个商业代理(bussiness delegate-j2eeDP),它提供一个消息发送的服务,同时封装了 lookup 和消息 传送的细节.AsyncHelper 通过 JMSLocator 找到消息队列,并且使用 AsyncSenderEJB 的stateless session EJB 来发送 XML 消息.然后呢,OPC 的异步消息 Bean(MDB)会受到这个 XML 消息,当 然宠物店仍然继续响应着其他的请求呢.宠物店根本不维护它创建过哪些 Order 的历史信息, 这些都由 OPC 来做了. PO 类代表了购买的订单,有 orderID,userID,发送地址,订单的货物条目等信息.它有个 toXML() 方法用来产生一个 XML 字符流.这个 XML 流将通过 AsyncHelper 类发送一个 JMS text 消息 给消息队列.当 OPC 接受到 xml 消息,它创建和初始化一个新的 OP 实例,用 XML 消息中内容