??xml version="1.0" encoding="utf-8" standalone="yes"?>
域对象之间的关系
2. 域对?Domain Object) - 对真实世界的实体的Y件抽象,也叫业务对象(Business Object)Q分为:
实体域对?实体EJBQPOJO)Qؓ每个实体域对象分配OID(Object Identifier)
q程域对?Session Bean, Message Driven Bean, Java Bean)
事g域对?事g触发)
三种域对象位于业务逻辑?br />
3. 域对象之间的关系
兌(Association)Qone to one, one to many, many to many, 单向, 双向
依赖(Dependency)Q类与类之间的访问关p,如果A讉KB的属性或者方法,或者A负责实例化BQ则A依赖B。过E域对象往往依赖实体域对象?br /> 聚集(Aggregation)Q整体与部分之间的关p,实体域对象之间常见。聚集关pd兌关系有相同的形式Q区别是Q对于聚集关p,部分cȝ对象不能单独存在Q它的生命周期依赖于整体cȝ对象的生命周期;对于兌关系?个类Q可以分别单独存在?br /> 一般化(Generalization)
首先事g是指从客L面Q浏览器Q由用户操作触发的事ӞStruts使用Action来接受浏览器表单提交的事Ӟq里使用了Command模式Q每个承Action的子c都必须实现一个方法execute?/p>
在struts中,实际是一个表单Form对应一个Actionc?或DispatchAction)Q换一句话_在Struts中实际是一个表单只能对应一个事Ӟstrutsq种事g方式UCؓapplication eventQapplication event和component event相比是一U粗_度的事件?/p>
struts重要的表单对象ActionForm是一U对象,它代表了一U应用,q个对象中至包含几个字D,q些字段是Jsp面表单中的input字段Q因Z个表单对应一个事Ӟ所以,当我们需要将事g_度l化到表单中q些字段Ӟ也就是说Q一个字D对应一个事件时Q单U用Struts׃太可能,当然通过l合JavaScript也是可以转弯实现的?/p>
而这U情况用JSF可以方便实玎ͼ
<h:inputText id="userId" value="#{login.userId}"> <f:valueChangeListener type="logindemo.UserLoginChanged" /> </h:inputText> |
#{login.userId}表示从名为login的JavaBean的getUserId获得的结果,q个功能使用struts也可以实玎ͼname="login" property="userId"
关键是第二行Q这里表C如果userId的值改变ƈ且确定提交后Q将触发调用cUserLoginChanged的processValueChanged(...)Ҏ?/p>
JSF可以为组件提供两U事ӞValue Changed?Action. 前者我们已l在上节见识q用处,后者就相当于struts中表单提交Action机制Q它的JSF写法如下Q?/p>
<h:commandButton id="login" commandName="login"> <f:actionListener type=”logindemo.LoginActionListener?/> </h:commandButton> |
从代码可以看出,q两U事件是通过Listernerq样观察者模式脓在具体组件字D上的,而Struts此类事g是原始的一U表单提交Submit触发机制。如果说前者比较语a化(~程语言习惯做法cMSwing~程Q;后者是属于WEB化,因ؓ它是来自Html表单Q如果你h是从Perl/PHP开始,反而容易接受Strutsq种风格?/p>
3.准备各个模块所需的ActionForm、Action和JSP{资?br />
在多模块间进行全局转发
struts-config.xml:
4 ?sandh/web-inf/src/java下面建立以下文g
修改/sandh/web-inf/validation.xml文gQؓaddItemForm增加动态验证,内容如下Q?BR>
6 在tomcat下面试一下吧。http://127.0.0.1:8080/sand
7 试的时候发?个问题:
首先Q如果在/sandh/web-inf/classes下面没有ehcache.xmlq个文gQ会报这个错误,No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath:.....q个文g是hibernate~存配置文gQ以后在学习?BR>另外在log文g中一直发现这个警告:Could not bind factory to JNDI javax.naming.NamingException: Context is read only..... |上查找后发现只要在hibernate.cfg.xml文g?lt;session-factory name="java:/hibernate/HibernateFactory"> 中把name=....L好了,否则会自动把name注册qjndi中失败而发告?BR>
8 所有文件打包在q里 http://www.aygfsteel.com/Files/luckyrobbie/sandh.rar 里面lib下面的文件自己添q去吧?BR>
对于上面的actionform的传递,本来以ؓ一定要通过提交<html:form.../>才能接收的,后来发现其实通过参数的传递也可以实现?/p>
例如上面的actionform, 如果?个field, 分别是A和B, 如果不通过提交form的方法,直接用带参数的连接表C? 那么通过q个做法也可以正的用f.get(..)Ҏ得到数?
http://localhost:8080/app/myaction.do?A=abc&B=def
由此可见Q如果分?个页面page a, page b and page c. page a中有一个form, 提交后生page b, 对page b中的链接提交后生page c. 那么page b ?page c 可以通过一个action来实? 只要保证page b中关于action的连接后面加的参数名字和actionform的field名字一致就可以了?br />