|
From: <jue...@we...> - 2003-08-26 15:29:34
|
ad 1)
A data access object is supposed to be concerned just with actual data =
access operations, it shouldn't care about transactions or being part of =
a larger unit-of-work. It will mainly offer methods like "loadProduct", =
"findProducts", "storeOrder", "deleteOrder". Invoked directly, those =
methods will simply execute non-transactional, i.e. without =
transactional guarantees.
A business object is supposed to implement business operations, i.e. the =
units-of-work that a web controller or remote client needs to trigger. =
This can be simple delegations to DAO methods, or more complex business =
logic like creating an Order object, filling it with customer data and =
line items, and invoking the DAO's storeOrder afterwards.
Such a business object will typically demarcate transactions, i.e. most =
of its methods will need to execute within a transaction. It can =
demarcate those transactions via TransactionTemplate, that's why it =
receives a transaction manager reference in the skeleton. An alternative =
is an AOP TransactionInterceptor that proxies the business object =
itself.
So a data access object should get a resource factory like a JDBC =
DataSource or a Hibernate SessionFactory but not a transaction manager. =
With a business object, it's exactly the other way round. A business =
object should talk to its DAOs through interfaces that are agnostic of =
the actual persistence strategy, to be able to switch e.g. from JDBC to =
Hibernate seamlessly.
Compare a business object with a Stateless Session Bean that serves as =
business facade, just much more lightweight. After all, these are just =
patterns: For simple use cases, you might keep all of this in one =
object, not separating between business and data access operations.
2)
A DAO that just uses HibernateTemplate does not guarantee transactional =
safety. You need to some kind of transaction demarcation for this. As =
outlined above, this typically happens in business facades that delegate =
to the DAOs. You could also choose to use a TransactionTemplate in your =
DAO, preferably in facade methods that delegate to the actual data =
access methods. Or proxy your DAO with an AOP TransactionInterceptor.
3)
There is indeed a strong difference between Controller and =
MultiActionController. Controller is intended for classes that implement =
one single request handling use case each, e.g. a =
ShowProductListController and a ShowProductDetailsController. =
Controller's sole method is "handleRequest(request,response").
MultiActionController on the other hand allows to implement multiple use =
cases in one class, via multiple request handling methods like =
"showProductList(request,response)" and =
"showProductDetails(request,response)". Which method gets invoked is =
decided via a respective MethodNameResolver strategy, e.g. according to =
a request parameter or an explicit mapping. This is convenient for =
multiple small use cases to avoid an excessive number of controller =
classes.
Note that Spring separates roles stricter than WebWork. In WebWork, an =
Action is controller, command/form, and model in one object: It gets =
instantiated, populated, executed, and passed to the view. This is not =
really clean, as a view doesn't need to see the controller methods or =
the original command properties: A view just needs the pure model that =
it should render.
A Spring Controller is just a controller in the sense that it determines =
the processing workflow, that's why it can be a reusable singleton. A =
Spring command object is just a holder of command properties, =
instantiated per request. A Spring model is a map of named attributes =
that are provided to views, which may include a form object and/or =
reference data. Such a model does not have to include anything that a =
view doesn't need to see.
In terms of convenience base classes, you can choose between:
- a pure controller that acts as dispatched replacement of a servlet;
- a command controller that instantiates a command object, populates it =
with request parameters, and decides how to proceed then;
- a form controller that works similar to a command controller but =
applies a form editing workflow with form view and submit view;
- a wizard form controller that applies a form workflow with multiple =
pages.
So if you're used to the WebWork or classic Servlet style, simply stay =
with Controller and its convenience subclasses like =
AbstractCommandController or SimpleFormController. On the other hand, =
people coming from Struts 1.1 might prefer MultiActionController as they =
know a similar concept: Struts' DispatchAction.
Juergen
-----Original Message-----
From: Lars Fischer [mailto:lar...@gm...]
Sent: Tuesday, August 26, 2003 12:00 PM
To: spr...@li...
Subject: [Springframework-developer] A few questions
Finally I've managed to get the whole thing working with Hibernate and
WebLogic.
There are still a few newbie questions left:
In applicationContext.xml from the Hibernate skeleton I've defined this
part:
<bean id=3D"exampleDataAccessObject" =
class=3D"example.ExampleDataAccessObject">
<property name=3D"sessionFactory"><ref =
bean=3D"mySessionFactory"/></property>
<property name=3D"exampleParam"><value>someValue</value></property>
</bean>
1.) When do I need the part defining (do I need it at all?)
<bean id=3D"exampleBusinessObject" =
class=3D"example.ExampleBusinessObject">
<property name=3D"transactionManager"><ref
bean=3D"myTransactionManager"/></property>
<property name=3D"dataAccessObject"><ref
bean=3D"exampleDataAccessObject"/></property>
<property =
name=3D"exampleParam"><value>someOtherValue</value></property>
</bean>
2.) In my DAO implementation I use HibernateTemplate. I assume that =
those
methods
are transaction safe with only the first part =
("exampleDataAccessObject")
defined (?).
3.) Spring provides a "Controller" and a "MultiActionController". For =
sure
there are lots=20
of architectural reasons for providing both. But wouldn't it be easier =
just
to provide one
kind of controller ? E.g. in WebWork 1 you can make a class ActionAware,
SessionAware, etc.=20
which is very easy to understand (when to use what even without
documentation).
Thanks again
Lars
-------------------------------------------------------
This SF.net email is sponsored by: VM Ware
With VMware you can run multiple operating systems on a single machine.
WITHOUT REBOOTING! Mix Linux / Windows / Novell virtual machines
at the same time. Free trial click =
here:http://www.vmware.com/wl/offer/358/0
_______________________________________________
Springframework-developer mailing list
Spr...@li...
https://lists.sourceforge.net/lists/listinfo/springframework-developer
|
|
From: <jue...@we...> - 2003-08-27 07:23:49
|
UmVnYXJkaW5nIHRoZSB1c2Ugb2YgU2Vzc2lvbiBCZWFuczogQXQgdGhlIHRpbWUgb2YgUm9kJ3Mg Ym9vaywgdGhlIGZyYW1ld29yayBkaWRuJ3QgaGF2ZSBhbnkgdHJhbnNhY3Rpb24gc3VwcG9ydC4g R2l2ZW4gYSBjdXJyZW50IFNwcmluZyB2ZXJzaW9uLCBTcHJpbmctbWFuYWdlZCB0cmFuc2FjdGlv bnMgYXJlIGFic29sdXRlbHkgcHJlZmVyYWJsZSB0byBMb2NhbCBTdGF0ZWxlc3MgU2Vzc2lvbiBC ZWFucywgYXMgdGhleSBjYW4gd29yayB3aXRoIGFueSBleGlzdGluZyBiZWFuLCB3aXRob3V0IGRl cGxveW1lbnQgaGFzc2xlLg0KIA0KQW5kIHlvdSBoYXZlIHRoZSBjaG9pY2UgcmVnYXJkaW5nIHRy YW5zYWN0aW9uIHN0cmF0ZWdpZXM6IElmIGp1c3QgYWNjZXNzaW5nIGEgc2luZ2xlIGRhdGFiYXNl LCB5b3UgZG9uJ3QgbmVlZCBKVEEgYXQgYWxsIC0geW91IGNhbiBjaG9vc2UgRGF0YVNvdXJjZVRy YW5zYWN0aW9uTWFuYWdlciwgb3IgdGhlIEhpYmVybmF0ZSBvciBKRE8gb25lLiBTdWNoIGFwcGxp Y2F0aW9ucyBjYW4gaGF2ZSBoaWdoLWxldmVsIHRyYW5zYWN0aW9ucywgZXZlbiBkZWNsYXJhdGl2 ZSBvbmVzLCBvbiBhIHNpbXBsZSBKMkVFIHdlYiBjb250YWluZXIgbGlrZSBUb21jYXQhDQogDQpT cHJpbmctbWFuYWdlZCB0cmFuc2FjdGlvbmFsIGJlYW5zIHNob3VsZCBzY2FsZSBqdXN0IGFzIHdl bGwgYXMgTG9jYWwgU3RhdGVsZXNzIFNlc3Npb24gQmVhbnMuIFRoZSBsYXR0ZXIgY2FuIGJlIHBv b2xlZCBidXQgdGhhdCBkb2Vzbid0IGFkZCBhbnkgYmVuZWZpdCBpZiB5b3UgZG8gbm90IGtlZXAg bm9uLXRocmVhZHNhZmUgc3RhdGUgaW4gaW5zdGFuY2UgdmFyaWFibGVzLiBTY2FsYWJpbGl0eSBh bmQgcHJvcGVyIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgYXJlIG5vIHJlYXNvbiB0byBjaG9vc2Ug bG9jYWwgRUpCcyBhdCBhbGwsIHBhcnRpY3VsYXJseSB3aXRoIFNwcmluZy4NCiANCkp1ZXJnZW4N CiANCiANCg0KCS0tLS0tVXJzcHLDvG5nbGljaGUgTmFjaHJpY2h0LS0tLS0gDQoJVm9uOiBMYXJz IEZpc2NoZXIgW21haWx0bzpsYXJzLmZpc2NoZXJAZ214cHJvLm5ldF0gDQoJR2VzZW5kZXQ6IERp IDI2LjA4LjIwMDMgMjE6MjkgDQoJQW46IHNwcmluZ2ZyYW1ld29yay1kZXZlbG9wZXJAbGlzdHMu c291cmNlZm9yZ2UubmV0IA0KCUNjOiANCglCZXRyZWZmOiBSRTogW1NwcmluZ2ZyYW1ld29yay1k ZXZlbG9wZXJdIEEgZmV3IHF1ZXN0aW9ucw0KCQ0KCQ0KDQoJVGhlc2UgYXJlIHZlcnkgZ29vZCBl eHBsYW50aW9ucyBKw7xyZ2VuLCB0aGFua3MgYSBsb3QgIQ0KCQ0KCUkgYWxzbyBjaGVja2VkIFJv ZCdzIGJvb2sgYW5kIGl0J3MgYWxsIG11Y2ggY2xlYXJlciBmb3IgbWUgbm93IChzaG91bGQgaGF2 ZQ0KCWRvbmUNCgl0aGF0IGJlZm9yZSAuLi4pLg0KCQ0KCUNvbmNlcm5pbmcgdGhlIHNhbXBsZSBh cHBsaWNhdGlvbiBpbiBSb2QncyBib29rOg0KCQ0KCS0gUm9kIHVzZXMgU2Vzc2lvbiBCZWFucyBm b3IgY2VydGFpbiBvcGVyYXRpb25zIC0gaXMgdGhpcyBzdGlsbCB0aGUNCgkgIHByZWZlcmVkIGFw cHJvYWNoIG9yIHdvdWxkIHlvdSBjb21wbGV0ZWx5IGlnbm9yZSBFSkJzID8NCgkNCglBbm90aGVy IGludGVyZXN0aW5nIHF1ZXN0aW9uIGZvciBtZSBpcyBpZiBhbnlib2R5IHVzaW5nIFNwcmluZyBh bmQgSGliZXJuYXRlDQoJY2FuDQoJdGVsbCBtZSBhYm91dCByZWFsIHdvcmxkIGV4cGVyaWVuY2Vz LiBJcyBpdCBwb3NzaWJsZSB0byByZXBsYWNlIEVKQnMgd2l0aA0KCVNwcmluZyBhbmQNCglIaWJl cm5hdGUgYW5kIHN0aWxsIGhhdmUgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBzdGFibGUgYW5kIHNj YWxhYmxlIChsZXQncw0KCXNheSBpdCB3b3Jrcw0KCWZvciAzIHVzZXJzIGFuZCBmb3IgMTAwIHVz ZXJzIHdpdGggdGhlIHNhbWUgYXBwbGljYXRpb24gZGVzaWduKS4NCgkNCglNYXliZSB3aGVuIGdh aW5pbmcgZnVydGhlciBleHBlcmllbmNlIEkgY2FuIHByb3ZpZGUgc29tZSBzaG9ydCByZWNpcGVz IGZvcg0KCXRoZSBXSUtJLg0KCQ0KCVJlZ2FyZHMNCglMYXJzDQoJDQoJPiBhZCAxKQ0KCT4NCgk+ IEEgZGF0YSBhY2Nlc3Mgb2JqZWN0IGlzIHN1cHBvc2VkIHRvIGJlIGNvbmNlcm5lZCBqdXN0IHdp dGggYWN0dWFsIGRhdGENCgk+IGFjY2VzcyBvcGVyYXRpb25zLCBpdCBzaG91bGRuJ3QgY2FyZSBh Ym91dCB0cmFuc2FjdGlvbnMgb3IgYmVpbmcgcGFydCBvZg0KCT4gYSBsYXJnZXIgdW5pdC1vZi13 b3JrLiBJdCB3aWxsIG1haW5seSBvZmZlciBtZXRob2RzIGxpa2UgImxvYWRQcm9kdWN0IiwNCgk+ ICJmaW5kUHJvZHVjdHMiLCAic3RvcmVPcmRlciIsICJkZWxldGVPcmRlciIuIEludm9rZWQgZGly ZWN0bHksIHRob3NlDQoJPiBtZXRob2RzIHdpbGwgc2ltcGx5IGV4ZWN1dGUgbm9uLXRyYW5zYWN0 aW9uYWwsIGkuZS4gd2l0aG91dA0KCT4gdHJhbnNhY3Rpb25hbCBndWFyYW50ZWVzLg0KCT4NCgk+ IEEgYnVzaW5lc3Mgb2JqZWN0IGlzIHN1cHBvc2VkIHRvIGltcGxlbWVudCBidXNpbmVzcyBvcGVy YXRpb25zLCBpLmUuIHRoZQ0KCT4gdW5pdHMtb2Ytd29yayB0aGF0IGEgd2ViIGNvbnRyb2xsZXIg b3IgcmVtb3RlIGNsaWVudCBuZWVkcyB0byB0cmlnZ2VyLg0KCT4gVGhpcyBjYW4gYmUgc2ltcGxl IGRlbGVnYXRpb25zIHRvIERBTyBtZXRob2RzLCBvciBtb3JlIGNvbXBsZXggYnVzaW5lc3MNCgk+ IGxvZ2ljIGxpa2UgY3JlYXRpbmcgYW4gT3JkZXIgb2JqZWN0LCBmaWxsaW5nIGl0IHdpdGggY3Vz dG9tZXIgZGF0YSBhbmQNCgk+IGxpbmUgaXRlbXMsIGFuZCBpbnZva2luZyB0aGUgREFPJ3Mgc3Rv cmVPcmRlciBhZnRlcndhcmRzLg0KCT4NCgk+IFN1Y2ggYSBidXNpbmVzcyBvYmplY3Qgd2lsbCB0 eXBpY2FsbHkgZGVtYXJjYXRlIHRyYW5zYWN0aW9ucywgaS5lLiBtb3N0DQoJPiBvZiBpdHMgbWV0 aG9kcyB3aWxsIG5lZWQgdG8gZXhlY3V0ZSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4gSXQgY2FuDQoJ PiBkZW1hcmNhdGUgdGhvc2UgdHJhbnNhY3Rpb25zIHZpYSBUcmFuc2FjdGlvblRlbXBsYXRlLCB0 aGF0J3Mgd2h5IGl0DQoJPiByZWNlaXZlcyBhIHRyYW5zYWN0aW9uIG1hbmFnZXIgcmVmZXJlbmNl IGluIHRoZSBza2VsZXRvbi4gQW4gYWx0ZXJuYXRpdmUNCgk+IGlzIGFuIEFPUCBUcmFuc2FjdGlv bkludGVyY2VwdG9yIHRoYXQgcHJveGllcyB0aGUgYnVzaW5lc3Mgb2JqZWN0DQoJPiBpdHNlbGYu DQoJPg0KCT4gU28gYSBkYXRhIGFjY2VzcyBvYmplY3Qgc2hvdWxkIGdldCBhIHJlc291cmNlIGZh Y3RvcnkgbGlrZSBhIEpEQkMNCgk+IERhdGFTb3VyY2Ugb3IgYSBIaWJlcm5hdGUgU2Vzc2lvbkZh Y3RvcnkgYnV0IG5vdCBhIHRyYW5zYWN0aW9uIG1hbmFnZXIuDQoJPiBXaXRoIGEgYnVzaW5lc3Mg b2JqZWN0LCBpdCdzIGV4YWN0bHkgdGhlIG90aGVyIHdheSByb3VuZC4gQSBidXNpbmVzcw0KCT4g b2JqZWN0IHNob3VsZCB0YWxrIHRvIGl0cyBEQU9zIHRocm91Z2ggaW50ZXJmYWNlcyB0aGF0IGFy ZSBhZ25vc3RpYyBvZg0KCT4gdGhlIGFjdHVhbCBwZXJzaXN0ZW5jZSBzdHJhdGVneSwgdG8gYmUg YWJsZSB0byBzd2l0Y2ggZS5nLiBmcm9tIEpEQkMgdG8NCgk+IEhpYmVybmF0ZSBzZWFtbGVzc2x5 Lg0KCT4NCgk+IENvbXBhcmUgYSBidXNpbmVzcyBvYmplY3Qgd2l0aCBhIFN0YXRlbGVzcyBTZXNz aW9uIEJlYW4gdGhhdCBzZXJ2ZXMgYXMNCgk+IGJ1c2luZXNzIGZhY2FkZSwganVzdCBtdWNoIG1v cmUgbGlnaHR3ZWlnaHQuIEFmdGVyIGFsbCwgdGhlc2UgYXJlIGp1c3QNCgk+IHBhdHRlcm5zOiBG b3Igc2ltcGxlIHVzZSBjYXNlcywgeW91IG1pZ2h0IGtlZXAgYWxsIG9mIHRoaXMgaW4gb25lDQoJ PiBvYmplY3QsIG5vdCBzZXBhcmF0aW5nIGJldHdlZW4gYnVzaW5lc3MgYW5kIGRhdGEgYWNjZXNz IG9wZXJhdGlvbnMuDQoJPg0KCT4gMikNCgk+DQoJPiBBIERBTyB0aGF0IGp1c3QgdXNlcyBIaWJl cm5hdGVUZW1wbGF0ZSBkb2VzIG5vdCBndWFyYW50ZWUgdHJhbnNhY3Rpb25hbA0KCT4gc2FmZXR5 LiBZb3UgbmVlZCB0byBzb21lIGtpbmQgb2YgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gZm9yIHRo aXMuIEFzDQoJPiBvdXRsaW5lZCBhYm92ZSwgdGhpcyB0eXBpY2FsbHkgaGFwcGVucyBpbiBidXNp bmVzcyBmYWNhZGVzIHRoYXQgZGVsZWdhdGUNCgk+IHRvIHRoZSBEQU9zLiBZb3UgY291bGQgYWxz byBjaG9vc2UgdG8gdXNlIGEgVHJhbnNhY3Rpb25UZW1wbGF0ZSBpbiB5b3VyDQoJPiBEQU8sIHBy ZWZlcmFibHkgaW4gZmFjYWRlIG1ldGhvZHMgdGhhdCBkZWxlZ2F0ZSB0byB0aGUgYWN0dWFsIGRh dGENCgk+IGFjY2VzcyBtZXRob2RzLiBPciBwcm94eSB5b3VyIERBTyB3aXRoIGFuIEFPUCBUcmFu c2FjdGlvbkludGVyY2VwdG9yLg0KCT4NCgk+IDMpDQoJPg0KCT4gVGhlcmUgaXMgaW5kZWVkIGEg c3Ryb25nIGRpZmZlcmVuY2UgYmV0d2VlbiBDb250cm9sbGVyIGFuZA0KCT4gTXVsdGlBY3Rpb25D b250cm9sbGVyLiBDb250cm9sbGVyIGlzIGludGVuZGVkIGZvciBjbGFzc2VzIHRoYXQgaW1wbGVt ZW50DQoJPiBvbmUgc2luZ2xlIHJlcXVlc3QgaGFuZGxpbmcgdXNlIGNhc2UgZWFjaCwgZS5nLiBh DQoJPiBTaG93UHJvZHVjdExpc3RDb250cm9sbGVyIGFuZCBhIFNob3dQcm9kdWN0RGV0YWlsc0Nv bnRyb2xsZXIuDQoJPiBDb250cm9sbGVyJ3Mgc29sZSBtZXRob2QgaXMgImhhbmRsZVJlcXVlc3Qo cmVxdWVzdCxyZXNwb25zZSIpLg0KCT4NCgk+IE11bHRpQWN0aW9uQ29udHJvbGxlciBvbiB0aGUg b3RoZXIgaGFuZCBhbGxvd3MgdG8gaW1wbGVtZW50IG11bHRpcGxlIHVzZQ0KCT4gY2FzZXMgaW4g b25lIGNsYXNzLCB2aWEgbXVsdGlwbGUgcmVxdWVzdCBoYW5kbGluZyBtZXRob2RzIGxpa2UNCgk+ ICJzaG93UHJvZHVjdExpc3QocmVxdWVzdCxyZXNwb25zZSkiIGFuZA0KCT4gInNob3dQcm9kdWN0 RGV0YWlscyhyZXF1ZXN0LHJlc3BvbnNlKSIuIFdoaWNoIG1ldGhvZCBnZXRzIGludm9rZWQgaXMN Cgk+IGRlY2lkZWQgdmlhIGEgcmVzcGVjdGl2ZSBNZXRob2ROYW1lUmVzb2x2ZXIgc3RyYXRlZ3ks IGUuZy4gYWNjb3JkaW5nIHRvDQoJPiBhIHJlcXVlc3QgcGFyYW1ldGVyIG9yIGFuIGV4cGxpY2l0 IG1hcHBpbmcuIFRoaXMgaXMgY29udmVuaWVudCBmb3INCgk+IG11bHRpcGxlIHNtYWxsIHVzZSBj YXNlcyB0byBhdm9pZCBhbiBleGNlc3NpdmUgbnVtYmVyIG9mIGNvbnRyb2xsZXINCgk+IGNsYXNz ZXMuDQoJPg0KCT4gTm90ZSB0aGF0IFNwcmluZyBzZXBhcmF0ZXMgcm9sZXMgc3RyaWN0ZXIgdGhh biBXZWJXb3JrLiBJbiBXZWJXb3JrLCBhbg0KCT4gQWN0aW9uIGlzIGNvbnRyb2xsZXIsIGNvbW1h bmQvZm9ybSwgYW5kIG1vZGVsIGluIG9uZSBvYmplY3Q6IEl0IGdldHMNCgk+IGluc3RhbnRpYXRl ZCwgcG9wdWxhdGVkLCBleGVjdXRlZCwgYW5kIHBhc3NlZCB0byB0aGUgdmlldy4gVGhpcyBpcyBu b3QNCgk+IHJlYWxseSBjbGVhbiwgYXMgYSB2aWV3IGRvZXNuJ3QgbmVlZCB0byBzZWUgdGhlIGNv bnRyb2xsZXIgbWV0aG9kcyBvcg0KCT4gdGhlIG9yaWdpbmFsIGNvbW1hbmQgcHJvcGVydGllczog QSB2aWV3IGp1c3QgbmVlZHMgdGhlIHB1cmUgbW9kZWwgdGhhdA0KCT4gaXQgc2hvdWxkIHJlbmRl ci4NCgk+DQoJPiBBIFNwcmluZyBDb250cm9sbGVyIGlzIGp1c3QgYSBjb250cm9sbGVyIGluIHRo ZSBzZW5zZSB0aGF0IGl0IGRldGVybWluZXMNCgk+IHRoZSBwcm9jZXNzaW5nIHdvcmtmbG93LCB0 aGF0J3Mgd2h5IGl0IGNhbiBiZSBhIHJldXNhYmxlIHNpbmdsZXRvbi4gQQ0KCT4gU3ByaW5nIGNv bW1hbmQgb2JqZWN0IGlzIGp1c3QgYSBob2xkZXIgb2YgY29tbWFuZCBwcm9wZXJ0aWVzLA0KCT4g aW5zdGFudGlhdGVkIHBlciByZXF1ZXN0LiBBIFNwcmluZyBtb2RlbCBpcyBhIG1hcCBvZiBuYW1l ZCBhdHRyaWJ1dGVzDQoJPiB0aGF0IGFyZSBwcm92aWRlZCB0byB2aWV3cywgd2hpY2ggbWF5IGlu Y2x1ZGUgYSBmb3JtIG9iamVjdCBhbmQvb3INCgk+IHJlZmVyZW5jZSBkYXRhLiBTdWNoIGEgbW9k ZWwgZG9lcyBub3QgaGF2ZSB0byBpbmNsdWRlIGFueXRoaW5nIHRoYXQgYQ0KCT4gdmlldyBkb2Vz bid0IG5lZWQgdG8gc2VlLg0KCT4NCgk+IEluIHRlcm1zIG9mIGNvbnZlbmllbmNlIGJhc2UgY2xh c3NlcywgeW91IGNhbiBjaG9vc2UgYmV0d2VlbjoNCgk+IC0gYSBwdXJlIGNvbnRyb2xsZXIgdGhh dCBhY3RzIGFzIGRpc3BhdGNoZWQgcmVwbGFjZW1lbnQgb2YgYSBzZXJ2bGV0Ow0KCT4gLSBhIGNv bW1hbmQgY29udHJvbGxlciB0aGF0IGluc3RhbnRpYXRlcyBhIGNvbW1hbmQgb2JqZWN0LCBwb3B1 bGF0ZXMgaXQNCgk+IHdpdGggcmVxdWVzdCBwYXJhbWV0ZXJzLCBhbmQgZGVjaWRlcyBob3cgdG8g cHJvY2VlZCB0aGVuOw0KCT4gLSBhIGZvcm0gY29udHJvbGxlciB0aGF0IHdvcmtzIHNpbWlsYXIg dG8gYSBjb21tYW5kIGNvbnRyb2xsZXIgYnV0DQoJPiBhcHBsaWVzIGEgZm9ybSBlZGl0aW5nIHdv cmtmbG93IHdpdGggZm9ybSB2aWV3IGFuZCBzdWJtaXQgdmlldzsNCgk+IC0gYSB3aXphcmQgZm9y bSBjb250cm9sbGVyIHRoYXQgYXBwbGllcyBhIGZvcm0gd29ya2Zsb3cgd2l0aCBtdWx0aXBsZQ0K CT4gcGFnZXMuDQoJPg0KCT4gU28gaWYgeW91J3JlIHVzZWQgdG8gdGhlIFdlYldvcmsgb3IgY2xh c3NpYyBTZXJ2bGV0IHN0eWxlLCBzaW1wbHkgc3RheQ0KCT4gd2l0aCBDb250cm9sbGVyIGFuZCBp dHMgY29udmVuaWVuY2Ugc3ViY2xhc3NlcyBsaWtlDQoJPiBBYnN0cmFjdENvbW1hbmRDb250cm9s bGVyIG9yIFNpbXBsZUZvcm1Db250cm9sbGVyLiBPbiB0aGUgb3RoZXIgaGFuZCwNCgk+IHBlb3Bs ZSBjb21pbmcgZnJvbSBTdHJ1dHMgMS4xIG1pZ2h0IHByZWZlciBNdWx0aUFjdGlvbkNvbnRyb2xs ZXIgYXMgdGhleQ0KCT4ga25vdyBhIHNpbWlsYXIgY29uY2VwdDogU3RydXRzJyBEaXNwYXRjaEFj dGlvbi4NCgk+DQoJPiBKdWVyZ2VuDQoJPg0KCT4NCgk+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0t LS0tDQoJPiBGcm9tOiBMYXJzIEZpc2NoZXIgW21haWx0bzpsYXJzLmZpc2NoZXJAZ214cHJvLm5l dF0NCgk+IFNlbnQ6IFR1ZXNkYXksIEF1Z3VzdCAyNiwgMjAwMyAxMjowMCBQTQ0KCT4gVG86IHNw cmluZ2ZyYW1ld29yay1kZXZlbG9wZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0DQoJPiBTdWJqZWN0 OiBbU3ByaW5nZnJhbWV3b3JrLWRldmVsb3Blcl0gQSBmZXcgcXVlc3Rpb25zDQoJPg0KCT4NCgk+ IEZpbmFsbHkgSSd2ZSBtYW5hZ2VkIHRvIGdldCB0aGUgd2hvbGUgdGhpbmcgd29ya2luZyB3aXRo IEhpYmVybmF0ZSBhbmQNCgk+IFdlYkxvZ2ljLg0KCT4NCgk+IFRoZXJlIGFyZSBzdGlsbCBhIGZl dyBuZXdiaWUgcXVlc3Rpb25zIGxlZnQ6DQoJPg0KCT4gSW4gYXBwbGljYXRpb25Db250ZXh0Lnht bCBmcm9tIHRoZSBIaWJlcm5hdGUgc2tlbGV0b24gSSd2ZSBkZWZpbmVkIHRoaXMNCgk+IHBhcnQ6 DQoJPg0KCT4gPGJlYW4gaWQ9ImV4YW1wbGVEYXRhQWNjZXNzT2JqZWN0Ig0KCT4gY2xhc3M9ImV4 YW1wbGUuRXhhbXBsZURhdGFBY2Nlc3NPYmplY3QiPg0KCT4gICA8cHJvcGVydHkgbmFtZT0ic2Vz c2lvbkZhY3RvcnkiPjxyZWYNCgk+IGJlYW49Im15U2Vzc2lvbkZhY3RvcnkiLz48L3Byb3BlcnR5 Pg0KCT4gICA8cHJvcGVydHkgbmFtZT0iZXhhbXBsZVBhcmFtIj48dmFsdWU+c29tZVZhbHVlPC92 YWx1ZT48L3Byb3BlcnR5Pg0KCT4gPC9iZWFuPg0KCT4NCgk+IDEuKSBXaGVuIGRvIEkgbmVlZCB0 aGUgcGFydCBkZWZpbmluZyAoZG8gSSBuZWVkIGl0IGF0IGFsbD8pDQoJPg0KCT4gPGJlYW4gaWQ9 ImV4YW1wbGVCdXNpbmVzc09iamVjdCINCgk+IGNsYXNzPSJleGFtcGxlLkV4YW1wbGVCdXNpbmVz c09iamVjdCI+DQoJPiAgIDxwcm9wZXJ0eSBuYW1lPSJ0cmFuc2FjdGlvbk1hbmFnZXIiPjxyZWYN Cgk+IGJlYW49Im15VHJhbnNhY3Rpb25NYW5hZ2VyIi8+PC9wcm9wZXJ0eT4NCgk+ICAgPHByb3Bl cnR5IG5hbWU9ImRhdGFBY2Nlc3NPYmplY3QiPjxyZWYNCgk+IGJlYW49ImV4YW1wbGVEYXRhQWNj ZXNzT2JqZWN0Ii8+PC9wcm9wZXJ0eT4NCgk+ICAgPHByb3BlcnR5DQoJPiBuYW1lPSJleGFtcGxl UGFyYW0iPjx2YWx1ZT5zb21lT3RoZXJWYWx1ZTwvdmFsdWU+PC9wcm9wZXJ0eT4NCgk+IDwvYmVh bj4NCgk+DQoJPiAyLikgSW4gbXkgREFPIGltcGxlbWVudGF0aW9uIEkgdXNlIEhpYmVybmF0ZVRl bXBsYXRlLiBJIGFzc3VtZSB0aGF0DQoJPiB0aG9zZQ0KCT4gbWV0aG9kcw0KCT4gYXJlIHRyYW5z YWN0aW9uIHNhZmUgd2l0aCBvbmx5IHRoZSBmaXJzdCBwYXJ0DQoJPiAoImV4YW1wbGVEYXRhQWNj ZXNzT2JqZWN0IikNCgk+IGRlZmluZWQgKD8pLg0KCT4NCgk+IDMuKSBTcHJpbmcgcHJvdmlkZXMg YSAiQ29udHJvbGxlciIgYW5kIGEgIk11bHRpQWN0aW9uQ29udHJvbGxlciIuIEZvcg0KCT4gc3Vy ZQ0KCT4gdGhlcmUgYXJlIGxvdHMNCgk+IG9mIGFyY2hpdGVjdHVyYWwgcmVhc29ucyBmb3IgcHJv dmlkaW5nIGJvdGguIEJ1dCB3b3VsZG4ndCBpdCBiZSBlYXNpZXINCgk+IGp1c3QNCgk+IHRvIHBy b3ZpZGUgb25lDQoJPiBraW5kIG9mIGNvbnRyb2xsZXIgPyBFLmcuIGluIFdlYldvcmsgMSB5b3Ug Y2FuIG1ha2UgYSBjbGFzcyBBY3Rpb25Bd2FyZSwNCgk+IFNlc3Npb25Bd2FyZSwgZXRjLg0KCT4g d2hpY2ggaXMgdmVyeSBlYXN5IHRvIHVuZGVyc3RhbmQgKHdoZW4gdG8gdXNlIHdoYXQgZXZlbiB3 aXRob3V0DQoJPiBkb2N1bWVudGF0aW9uKS4NCgk+DQoJPiBUaGFua3MgYWdhaW4NCgk+IExhcnMN Cgk+DQoJPg0KCT4NCgk+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCgk+IFRoaXMgU0YubmV0IGVtYWlsIGlzIHNwb25zb3JlZCBieTogVk0g V2FyZQ0KCT4gV2l0aCBWTXdhcmUgeW91IGNhbiBydW4gbXVsdGlwbGUgb3BlcmF0aW5nIHN5c3Rl bXMgb24gYSBzaW5nbGUgbWFjaGluZS4NCgk+IFdJVEhPVVQgUkVCT09USU5HISBNaXggTGludXgg LyBXaW5kb3dzIC8gTm92ZWxsIHZpcnR1YWwgbWFjaGluZXMNCgk+IGF0IHRoZSBzYW1lIHRpbWUu IEZyZWUgdHJpYWwgY2xpY2sNCgk+IGhlcmU6aHR0cDovL3d3dy52bXdhcmUuY29tL3dsL29mZmVy LzM1OC8wDQoJPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Xw0KCT4gU3ByaW5nZnJhbWV3b3JrLWRldmVsb3BlciBtYWlsaW5nIGxpc3QNCgk+IFNwcmluZ2Zy YW1ld29yay1kZXZlbG9wZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0DQoJPiBodHRwczovL2xpc3Rz LnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcHJpbmdmcmFtZXdvcmstZGV2ZWxvcGVy DQoJPg0KCT4NCgk+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCgk+IFRoaXMgU0YubmV0IGVtYWlsIGlzIHNwb25zb3JlZCBieTogVk0gV2Fy ZQ0KCT4gV2l0aCBWTXdhcmUgeW91IGNhbiBydW4gbXVsdGlwbGUgb3BlcmF0aW5nIHN5c3RlbXMg b24gYSBzaW5nbGUgbWFjaGluZS4NCgk+IFdJVEhPVVQgUkVCT09USU5HISBNaXggTGludXggLyBX aW5kb3dzIC8gTm92ZWxsIHZpcnR1YWwgbWFjaGluZXMNCgk+IGF0IHRoZSBzYW1lIHRpbWUuIEZy ZWUgdHJpYWwgY2xpY2sNCgk+IGhlcmU6aHR0cDovL3d3dy52bXdhcmUuY29tL3dsL29mZmVyLzM1 OC8wDQoJPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0K CT4gU3ByaW5nZnJhbWV3b3JrLWRldmVsb3BlciBtYWlsaW5nIGxpc3QNCgk+IFNwcmluZ2ZyYW1l d29yay1kZXZlbG9wZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0DQoJPiBodHRwczovL2xpc3RzLnNv dXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcHJpbmdmcmFtZXdvcmstZGV2ZWxvcGVyDQoJ Pg0KCQ0KCQ0KCQ0KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCglUaGlzIFNGLm5ldCBlbWFpbCBpcyBzcG9uc29yZWQgYnk6IFZNIFdhcmUN CglXaXRoIFZNd2FyZSB5b3UgY2FuIHJ1biBtdWx0aXBsZSBvcGVyYXRpbmcgc3lzdGVtcyBvbiBh IHNpbmdsZSBtYWNoaW5lLg0KCVdJVEhPVVQgUkVCT09USU5HISBNaXggTGludXggLyBXaW5kb3dz IC8gTm92ZWxsIHZpcnR1YWwgbWFjaGluZXMNCglhdCB0aGUgc2FtZSB0aW1lLiBGcmVlIHRyaWFs IGNsaWNrIGhlcmU6aHR0cDovL3d3dy52bXdhcmUuY29tL3dsL29mZmVyLzM1OC8wDQoJX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCglTcHJpbmdmcmFtZXdv cmstZGV2ZWxvcGVyIG1haWxpbmcgbGlzdA0KCVNwcmluZ2ZyYW1ld29yay1kZXZlbG9wZXJAbGlz dHMuc291cmNlZm9yZ2UubmV0DQoJaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMv bGlzdGluZm8vc3ByaW5nZnJhbWV3b3JrLWRldmVsb3Blcg0KCQ0KDQo= |
|
From: Lars F. <lar...@gm...> - 2003-08-26 19:30:26
|
These are very good explantions Jürgen, thanks a lot !
I also checked Rod's book and it's all much clearer for me now (should have
done
that before ...).
Concerning the sample application in Rod's book:
- Rod uses Session Beans for certain operations - is this still the
prefered approach or would you completely ignore EJBs ?
Another interesting question for me is if anybody using Spring and Hibernate
can
tell me about real world experiences. Is it possible to replace EJBs with
Spring and
Hibernate and still have an application that is stable and scalable (let's
say it works
for 3 users and for 100 users with the same application design).
Maybe when gaining further experience I can provide some short recipes for
the WIKI.
Regards
Lars
> ad 1)
>
> A data access object is supposed to be concerned just with actual data
> access operations, it shouldn't care about transactions or being part of
> a larger unit-of-work. It will mainly offer methods like "loadProduct",
> "findProducts", "storeOrder", "deleteOrder". Invoked directly, those
> methods will simply execute non-transactional, i.e. without
> transactional guarantees.
>
> A business object is supposed to implement business operations, i.e. the
> units-of-work that a web controller or remote client needs to trigger.
> This can be simple delegations to DAO methods, or more complex business
> logic like creating an Order object, filling it with customer data and
> line items, and invoking the DAO's storeOrder afterwards.
>
> Such a business object will typically demarcate transactions, i.e. most
> of its methods will need to execute within a transaction. It can
> demarcate those transactions via TransactionTemplate, that's why it
> receives a transaction manager reference in the skeleton. An alternative
> is an AOP TransactionInterceptor that proxies the business object
> itself.
>
> So a data access object should get a resource factory like a JDBC
> DataSource or a Hibernate SessionFactory but not a transaction manager.
> With a business object, it's exactly the other way round. A business
> object should talk to its DAOs through interfaces that are agnostic of
> the actual persistence strategy, to be able to switch e.g. from JDBC to
> Hibernate seamlessly.
>
> Compare a business object with a Stateless Session Bean that serves as
> business facade, just much more lightweight. After all, these are just
> patterns: For simple use cases, you might keep all of this in one
> object, not separating between business and data access operations.
>
> 2)
>
> A DAO that just uses HibernateTemplate does not guarantee transactional
> safety. You need to some kind of transaction demarcation for this. As
> outlined above, this typically happens in business facades that delegate
> to the DAOs. You could also choose to use a TransactionTemplate in your
> DAO, preferably in facade methods that delegate to the actual data
> access methods. Or proxy your DAO with an AOP TransactionInterceptor.
>
> 3)
>
> There is indeed a strong difference between Controller and
> MultiActionController. Controller is intended for classes that implement
> one single request handling use case each, e.g. a
> ShowProductListController and a ShowProductDetailsController.
> Controller's sole method is "handleRequest(request,response").
>
> MultiActionController on the other hand allows to implement multiple use
> cases in one class, via multiple request handling methods like
> "showProductList(request,response)" and
> "showProductDetails(request,response)". Which method gets invoked is
> decided via a respective MethodNameResolver strategy, e.g. according to
> a request parameter or an explicit mapping. This is convenient for
> multiple small use cases to avoid an excessive number of controller
> classes.
>
> Note that Spring separates roles stricter than WebWork. In WebWork, an
> Action is controller, command/form, and model in one object: It gets
> instantiated, populated, executed, and passed to the view. This is not
> really clean, as a view doesn't need to see the controller methods or
> the original command properties: A view just needs the pure model that
> it should render.
>
> A Spring Controller is just a controller in the sense that it determines
> the processing workflow, that's why it can be a reusable singleton. A
> Spring command object is just a holder of command properties,
> instantiated per request. A Spring model is a map of named attributes
> that are provided to views, which may include a form object and/or
> reference data. Such a model does not have to include anything that a
> view doesn't need to see.
>
> In terms of convenience base classes, you can choose between:
> - a pure controller that acts as dispatched replacement of a servlet;
> - a command controller that instantiates a command object, populates it
> with request parameters, and decides how to proceed then;
> - a form controller that works similar to a command controller but
> applies a form editing workflow with form view and submit view;
> - a wizard form controller that applies a form workflow with multiple
> pages.
>
> So if you're used to the WebWork or classic Servlet style, simply stay
> with Controller and its convenience subclasses like
> AbstractCommandController or SimpleFormController. On the other hand,
> people coming from Struts 1.1 might prefer MultiActionController as they
> know a similar concept: Struts' DispatchAction.
>
> Juergen
>
>
> -----Original Message-----
> From: Lars Fischer [mailto:lar...@gm...]
> Sent: Tuesday, August 26, 2003 12:00 PM
> To: spr...@li...
> Subject: [Springframework-developer] A few questions
>
>
> Finally I've managed to get the whole thing working with Hibernate and
> WebLogic.
>
> There are still a few newbie questions left:
>
> In applicationContext.xml from the Hibernate skeleton I've defined this
> part:
>
> <bean id="exampleDataAccessObject"
> class="example.ExampleDataAccessObject">
> <property name="sessionFactory"><ref
> bean="mySessionFactory"/></property>
> <property name="exampleParam"><value>someValue</value></property>
> </bean>
>
> 1.) When do I need the part defining (do I need it at all?)
>
> <bean id="exampleBusinessObject"
> class="example.ExampleBusinessObject">
> <property name="transactionManager"><ref
> bean="myTransactionManager"/></property>
> <property name="dataAccessObject"><ref
> bean="exampleDataAccessObject"/></property>
> <property
> name="exampleParam"><value>someOtherValue</value></property>
> </bean>
>
> 2.) In my DAO implementation I use HibernateTemplate. I assume that
> those
> methods
> are transaction safe with only the first part
> ("exampleDataAccessObject")
> defined (?).
>
> 3.) Spring provides a "Controller" and a "MultiActionController". For
> sure
> there are lots
> of architectural reasons for providing both. But wouldn't it be easier
> just
> to provide one
> kind of controller ? E.g. in WebWork 1 you can make a class ActionAware,
> SessionAware, etc.
> which is very easy to understand (when to use what even without
> documentation).
>
> Thanks again
> Lars
>
>
>
> -------------------------------------------------------
> This SF.net email is sponsored by: VM Ware
> With VMware you can run multiple operating systems on a single machine.
> WITHOUT REBOOTING! Mix Linux / Windows / Novell virtual machines
> at the same time. Free trial click
> here:http://www.vmware.com/wl/offer/358/0
> _______________________________________________
> Springframework-developer mailing list
> Spr...@li...
> https://lists.sourceforge.net/lists/listinfo/springframework-developer
>
>
> -------------------------------------------------------
> This SF.net email is sponsored by: VM Ware
> With VMware you can run multiple operating systems on a single machine.
> WITHOUT REBOOTING! Mix Linux / Windows / Novell virtual machines
> at the same time. Free trial click
> here:http://www.vmware.com/wl/offer/358/0
> _______________________________________________
> Springframework-developer mailing list
> Spr...@li...
> https://lists.sourceforge.net/lists/listinfo/springframework-developer
>
|
|
From: Rod J. <rod...@in...> - 2003-08-26 21:48:19
|
> Concerning the sample application in Rod's book: > > - Rod uses Session Beans for certain operations - is this still the > prefered approach or would you completely ignore EJBs ? I used a single *local* SLSB. I would only use EJB now if I wanted to distribute my business objects--something I normally try to avoid. So there are not that many situations where I would now use EJB. > Another interesting question for me is if anybody using Spring and Hibernate > can > tell me about real world experiences. Is it possible to replace EJBs with > Spring and > Hibernate and still have an application that is stable and scalable (let's > say it works > for 3 users and for 100 users with the same application design). There should be no scalable issues compared with using local EJBs. Using remote EJBs is a different issue but in my experience, as I say in my book, distributing your business objects is bad for performance and not particularly good for scalability. But I'd also like to hear about users' real experiences with Spring... I don't currently have anything in production on Spring but I've been very happy with the load testing etc I've done on the code I've developed so far. Regards, Rod |
|
From: Lars F. <lar...@gm...> - 2003-08-27 06:53:22
|
Rod, thanks for the insight, it's very valuable for me. With Spring there is the possibility to use a servlet engine without a full blown application server (this reduces the price for the application server). Another advantage is to get rid of all those J2EE patterns only needed to avoid bad performance. Regards, Lars > > Concerning the sample application in Rod's book: > > > > - Rod uses Session Beans for certain operations - is this still the > > prefered approach or would you completely ignore EJBs ? > > I used a single *local* SLSB. I would only use EJB now if I wanted to > distribute my business objects--something I normally try to avoid. > > So there are not that many situations where I would now use EJB. > > > > Another interesting question for me is if anybody using Spring and > Hibernate > > can > > tell me about real world experiences. Is it possible to replace EJBs > with > > Spring and > > Hibernate and still have an application that is stable and scalable > (let's > > say it works > > for 3 users and for 100 users with the same application design). > > There should be no scalable issues compared with using local EJBs. Using > remote EJBs is a different issue but in my experience, as I say in my > book, > distributing your business objects is bad for performance and not > particularly good for scalability. > > But I'd also like to hear about users' real experiences with Spring... I > don't currently have anything in production on Spring but I've been very > happy with the load testing etc I've done on the code I've developed so > far. > > Regards, > Rod > > |