Here are my concerns with Tapesty. Please feel free to debate these points. I am still trying to feel my way through. If I am wrong on a point or there is a better way let me know.
--> The "view" is proprietary. While I agree, in not having java scriptlet code in the view, I believe the same simple view can be achieved with simple templating languages like velocity or freemarker. Tapesty's view does not offer absolute/complete protection from an html author stomping on it. A framework that supports multiple result types(e.g. freemarker, jsp, velocity, xslt, jasperreports, jax-rpc, or custom) doesn't lock you in. There are often times you may need to produce a pdf/excel result, doing so should not be an uphill battle. This type of flexiblity helps bridge the gap with existing applications. If you are converting a struts application that used velocity, you don't have to completetly throw away the view. The view is appears slightly "more" verbose than needed. compare snippet: <table cellspacing="10"> <tr> <td>ID</td> <td>Name</td> <td>Level</td> </tr> <tr> <td colspan="3"><hr></td> </tr> <tr jwcid="@For" source="ognl:customerList" value="ognl:customer" element="tr"> <td><span jwcid="@Insert" value="ognl:customer.id"/></td> <td><span jwcid="@Insert" value="ognl:customer.fullName"/></td> <td><span jwcid="@Insert" value="ognl:customer.memberLevel"/></td> </tr> </table> vs. <table cellspacing="10"> <tr> <td>ID</td> <td>Name</td> <td>Level</td> </tr> <tr> <td colspan="3"><hr></td> </tr> #foreach($customer in $customerList) <tr> <td>$customer.id</td> <td>$customer.fullName</td> <td>$customer.memberLevel</td> </tr> #end </table> The Tapestry view requires a knowledge of OGNL and the syntatic sugars of what @Insert(@Update?) is. In addition, the tapestry view often requires additional binding lingo in the .page specification file. Tapestry page(Actions) are based on inheritance(same complaint about struts). Instead of simply implementing an interface, basing your stack on inheritance can be less flexible to change and more dependent on a library and implicit behaviors. I tried finding best practice type apps with tapestry. In looking at "better petshop", I found a development model when most "Pages" extended SecurePage e.g.SecurePage extends--> PetshopBasePage extends --->BasePage The same type of secure behavior could be achieve in Webwork via interceptors. This way actions are unaware they are secure and actions can be redeployed elsewhere with behavior turned off. sample below (note there are a couple other ways of expressing this). <interceptor-stack name="secureStack"> <interceptor-ref name="security"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> <package name="policy" extends="default" namespace="/securePolicy"> <default-interceptor-ref name="secureStack"/> <!-- Add your actions here --> <action name="list" class="com.pennmutual.csc.actions.PolicyListAction" method="list"> <result name="SUCCESS" type="velocity">list.vm</result> </action> </package> vs <package name="policy" extends="default" namespace="/openPolicy"> <default-interceptor-ref name="defaultStack"/> <action name="list" class="com.pennmutual.csc.actions.PolicyListAction" method="list"> <result name="SUCCESS" type="freemarker">list.flt</result> <result name="CANCEL" >/home.jsp</result> </action> </package> The use of interceptors allows all sorts of configurable pre/post processing Abstract page and getter/setter wierdness While I see that it is an initiative for Tapestry 5.0, these abstract actions are not quite pojo driven development. I also see difficulties doing things like wiring AOP advice via spring(though dependencies can still be wired), since an abstract class can not be instantiated directly. Heavy API usage to achieve behavior -in the way and adds learning curve -Action cannot be reused outside of web enviroment vs. simple pojo based actions webwork sample below. Note the absence of any Servlet centric object(no HttpRequest/Session) These xwork actions can be used by other things outside the serlet enviroment (e.g. quartz scheduler, osworkflow, or an in-house app) ---> pkg imports <!--- you could also just implement "Action" --> class CustomerAction extends BaseAction implements PersistanceAware { private List customerList; private Customer customer; PersistanceManager manager; public void SetPersistanaceManager(PersistanaceManager _pm) { this.manager = _pm; } public List getCustomers() { if (customerList !=null) { customerList = manager.findAll(Customer.class); } return customerList(); } public String list() { return SUCCESS; } public String save() { manager.saveOrUpdate(customer); addActionMessage(getText("object.save.success", customer.id)); return SUCCESS; } public void validate() { // this is not the only way to do validation simple field validation if(customer.name==null || customer.name.length<1) { addActionErrror(getText("customer.name.required")); } } public String view() { if (customer!=null && customer.id != null) { customer =(Customer)manager.load(Customer.class, customer.id); } //else assume we are doing a new/edit return SUCCESS; } get/setCustomerHere--- } -----Original Message----- From: Jonnalagadda, Sumithra [mailto:[EMAIL PROTECTED] Sent: Tuesday, April 25, 2006 10:08 PM To: tapestry-user@jakarta.apache.org Subject: tapastry vs struts We are currently evaluating different frameworks to build our e-commerce site. Struts Pros : huge user base and hence good support Cons : its stagnant. Tapestry : Pro : component based development Cons : not as big user base as struts. These are the preliminary points I could gather till. More experienced ones can you please help me make the right decision by sharing your experinces. Thanks This message, including any attachments, is intended only for the recipient(s) named above. It may contain confidential and privileged information. If you have received this communication in error, please notify the sender immediately and destroy or delete the original message. Also, please be aware that if you are not the intended recipient, any review, disclosure, copying, distribution or any action or reliance based on this message is prohibited by law. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]