精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-09-05
shinwell 写道 论坛在这里:
http://news.gmane.org/gmane.comp.java.tapestry.user 多谢链接,但是上面还是没有我发的帖子 |
|
返回顶楼 | |
发表时间:2005-09-05
gzdlw 写道 Tapestry4spring的应用,我已经更新到MyTapestry-TWF中去了。http://forum.iteye.com/viewtopic.php?t=15715
对Spring的集成,本来想做点小改良,早上试了一下,可惜不行,底层变了很多,而且也屏蔽了很多。对于Tapestry4,我也只是个新手而已,只是凭借着在T3上还有些经验,上手比较快罢了。。。。等以后接触时间长些,或许会有些办法。 对于Hivemind与T的结合,实际上我现在稍微习惯之后,觉得还是不错的。Hivemind与Spring不应该相提并论。的确,它们可以相互取代,但是,他们各有特长。Tapestry在结合Hivemind之后,变得比较有趣,举例说吧。。。上个星期我用Tapestry-beta4的时候遇到Tapestry-552bug,这个bug呢,是个非常严重的缺陷,官方已经作出了解决,并且更新的CVS,但是还没有更新版本。。。在邮件列表上,我就发现有些用户并不喜欢修改源代码,于是他们就利用Hivemind的ioc特性,为Tapestry单独写了一个自己的DataSqueezer实现,这样总比修改源代码,再重新打包舒服多了。呵呵。。。。 这个例子也就说明了,由于Tapestry集合了Hivemind,你可以完全用自己的策略和实现来取代Tapestry官方的策略和实现。 唉。。。Hivemind的文档和Tapestry一样少。。。所以严重影响了它们的应用及推广。 等于说目前没有什麽好的办法在 Tapestry4中使用 Spring的IOC注入了 我实在不想使用 Hivemind,我没有把他们做比较,只是因为Spring太强大了可能,想不出使用第二个 IOC容器的理由,可能Hivemind的优势还没有发现吧 我迫不得已直接使用 Spring的 ”WebApplicationContext“ 对象了 你能否告诉我使用 jakarta邮件列表的方法,我去上面问问tapestry的作者 BTW:tapestry的作者在tapestry4-beta5的发行声明中强调了,增加了许多后台方面的新功能,使开发者更容易使用 Spring,但是好像使用起来更困难了,spring旅行上的集成 tapestry和 spring的文档已经不能在 T4上用了 |
|
返回顶楼 | |
发表时间:2005-09-05
引用 http://news.gmane.org/gmane.comp.java.tapestry.user
上没有你的帖子是因为你的标题长度太长,不能够在gmane那个破东西里面显示。但是仍然可以用gmane发帖子。。。。你可以去官方邮件列表里面查看。。 还有,并不是你想发贴就可以发的,必须遵守apache的规则。。。另外,可能是由于时差问题,我发的帖子通常要等两三个小时才会进邮件列表,有时候甚至要等一天。 引用 等于说目前没有什麽好的办法在 Tapestry4中使用 Spring的IOC注入了
我实在不想使用 Hivemind,我没有把他们做比较,只是因为Spring太强大了可能,想不出使用第二个 IOC容器的理由,可能Hivemind的优势还没有发现吧 我迫不得已直接使用 Spring的 ”WebApplicationContext“ 对象了 你能否告诉我使用 jakarta邮件列表的方法,我去上面问问tapestry的作者 BTW:tapestry的作者在tapestry4-beta5的发行声明中强调了,增加了许多后台方面的新功能,使开发者更容易使用 Spring,但是好像使用起来更困难了,spring旅行上的集成 tapestry和 spring的文档已经不能在 T4上用了 Tapestry通过Hivemind配置的仍然是WebApplicationContext对象呀。。。。还有,tapestry4spring的方式配起的Spring,我提供的例子里面都已经加载applicationContext.xml并且获取对象实例,你怎么会认为那没有使用Spring的IoC呢?昏迷。。。。 |
|
返回顶楼 | |
发表时间:2005-09-06
通过hivemind在tapestry中使用spring
tapestry4.0中使用hivemind作为微内核,Hivemind也是一个依赖注射的容器,其 功能有一部分与spring重合,但spring 有良好的用户基础,所以使用hivemind访 问spring中定义的bean是在tapestry中集成spring的关键,这个功能可以通过一个 软件包实现,项目地址:http://sourceforge.net/projects/diaphragma/,下载 tapestry- spring.jar包,放入系统类路径,就可以在页面和组件的定义中使用 hivemind提供的注射功能访问spring中的bean定义。 hivemind.xml不需要做任何 修改,但spring容器必须通过web容器启动,web.xml中启动spring容器: <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>context</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 这样spring中定义一个bean,例如 <bean id="user" class="tapestry4.pages.User"> <property name="name"> <value>jimlaren</value> </property> </bean> Home.page中定义注入: <inject property="user" object="spring:user"/> Home.html中访问:<span jwcid="@Insert" value="ognl:user.name" /> 输出:jimlaren |
|
返回顶楼 | |
发表时间:2005-09-06
jimlaren 写道 hivemind.xml不需要做任何
修改 ********************************************************** org.apache.hivemind.ApplicationRuntimeException: Error at jar:file:/E:/liferay/w ebapps/TapTest/WEB-INF/lib/tapestry-spring.jar!/META-INF/hivemodule.xml, line 8, column 123: Error at jar:file:/E:/liferay/webapps/TapTest/WEB-INF/lib/tapestry- spring.jar!/META-INF/hivemodule.xml, line 8, column 123: Attribute id (hivemind. lib.DefaultSpringBeanFactoryHolder); of element module/service-point is improperl y formatted. Schema and extension point ids should be simple names with no punct uation. location: jar:file:/E:/liferay/webapps/TapTest/WEB-INF/lib/tapestry-spring.ja r!/META-INF/hivemodule.xml, line 8, column 123 org.apache.hivemind.ApplicationRuntimeException: Error at jar:file:/E:/liferay/w ebapps/TapTest/WEB-INF/lib/tapestry-spring.jar!/META-INF/hivemodule.xml, line 8, column 123: Attribute id (hivemind.lib.DefaultSpringBeanFactoryHolder); of eleme nt module/service-point is improperly formatted. Schema and extension point ids should be simple names with no punctuation. location: jar:file:/E:/liferay/webapps/TapTest/WEB-INF/lib/tapestry-spring.ja r!/META-INF/hivemodule.xml, line 8, column 123 org.apache.hivemind.impl.StrictErrorHandler.error(StrictErrorHandler.java:39); org.apache.hivemind.parse.DescriptorParser.getValidatedAttribute(DescriptorParse r.java:1213); org.apache.hivemind.parse.DescriptorParser.enterServicePoint(DescriptorParser.ja va:1056); org.apache.hivemind.parse.DescriptorParser.beginModule(DescriptorParser.java:421 ); org.apache.hivemind.parse.DescriptorParser.begin(DescriptorParser.java:207); org.apache.hivemind.parse.AbstractParser.startElement(AbstractParser.java:410); org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source); org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown S ource); org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher. dispatch(Unknown Source); org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Sourc e); org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source); org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source); org.apache.xerces.parsers.XMLParser.parse(Unknown Source); org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source); javax.xml.parsers.SAXParser.parse(Unknown Source); org.apache.hivemind.parse.XmlResourceProcessor.parseResource(XmlResourceProcesso r.java:119); org.apache.hivemind.parse.XmlResourceProcessor.processResource(XmlResourceProces sor.java:82); org.apache.hivemind.impl.XmlModuleDescriptorProvider.processResource(XmlModuleDe scriptorProvider.java:172); org.apache.hivemind.impl.XmlModuleDescriptorProvider.getModuleDescriptors(XmlMod uleDescriptorProvider.java:158); org.apache.hivemind.impl.RegistryBuilder.processModuleDescriptorProvider(Registr yBuilder.java:161); org.apache.hivemind.impl.RegistryBuilder.constructRegistry(RegistryBuilder.java: 143); org.apache.tapestry.ApplicationServlet.constructRegistry(ApplicationServlet.java :271); org.apache.tapestry.ApplicationServlet.init(ApplicationServlet.java:212); org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1029); org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:862); org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4013 ); org.apache.catalina.core.StandardContext.start(StandardContext.java:4357); org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823); org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807); org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595); org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java: 277); org.apache.catalina.core.StandardHost.install(StandardHost.java:832); org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:701); org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:432); org.apache.catalina.startup.HostConfig.start(HostConfig.java:983); org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349); org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.ja va:119); org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091); org.apache.catalina.core.StandardHost.start(StandardHost.java:789); org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083); org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478); org.apache.catalina.core.StandardService.start(StandardService.java:480); org.apache.catalina.core.StandardServer.start(StandardServer.java:2313); org.apache.catalina.startup.Catalina.start(Catalina.java:556); sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method); sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39); sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav a:25); java.lang.reflect.Method.invoke(Method.java:324); org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287); org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425); ********************************************************** 怎麽可能不做任何修改阿老兄,Hivemind1。0和1。10根本就是不兼容的 这就是直接使用的异常~ |
|
返回顶楼 | |
发表时间:2005-09-06
不过还是谢谢你, 这个线索很重要, 看来要把 Hivemind1.0的配置改成1。1的配置,这又难免要看 HM了
|
|
返回顶楼 | |
发表时间:2005-09-06
gzdlw 写道 Tapestry4spring的应用,我已经更新到MyTapestry-TWF中去了。http://forum.iteye.com/viewtopic.php?t=15715
对Spring的集成,本来想做点小改良,早上试了一下,可惜不行,底层变了很多,而且也屏蔽了很多。对于Tapestry4,我也只是个新手而已,只是凭借着在T3上还有些经验,上手比较快罢了。。。。等以后接触时间长些,或许会有些办法。 对于Hivemind与T的结合,实际上我现在稍微习惯之后,觉得还是不错的。Hivemind与Spring不应该相提并论。的确,它们可以相互取代,但是,他们各有特长。Tapestry在结合Hivemind之后,变得比较有趣,举例说吧。。。上个星期我用Tapestry-beta4的时候遇到Tapestry-552bug,这个bug呢,是个非常严重的缺陷,官方已经作出了解决,并且更新的CVS,但是还没有更新版本。。。在邮件列表上,我就发现有些用户并不喜欢修改源代码,于是他们就利用Hivemind的ioc特性,为Tapestry单独写了一个自己的DataSqueezer实现,这样总比修改源代码,再重新打包舒服多了。呵呵。。。。 这个例子也就说明了,由于Tapestry集合了Hivemind,你可以完全用自己的策略和实现来取代Tapestry官方的策略和实现。 唉。。。Hivemind的文档和Tapestry一样少。。。所以严重影响了它们的应用及推广。 大家都说 Tapestry的文档少,但实际上他的文档已经非常多了,而且很全面,当然没有 Struts的多,他的最大问题是Tapestry的文档发布赶不上他的T4版本发布,比如说,我经常在使用Tapestry的时候,后台发生一个警告: 2005-09-06 09:00:25,101 [http-8080-Processor25] ERROR tapestry.page.ComponentSpe cificationResolver - Component 'Conditional' (at context:/html/logon.html, line 5); is deprecated, and will likely be removed in a later release. Consult its doc umentation to find a replacement component. 2005-9-6 12:22:04 org.apache.catalina.core.StandardHostDeployer stop ..................................................................... 这就要去查T4的文档看看到底应该用什麽合适,但是发现T4的文档上描述是这样的: Conditional Parameters Examples THIS PAGE UNDER CONSTRUCTION See also: Parameters Name Type Direction Required Default Description Body: removed / allowed Informal parameters: allowed / forbidden Reserved parameters: none Examples 显然还未完成 而实际上大部分的T4文档都没有完成,T4-beta5就已经出来了,这样问题就很麻烦了~ T4作者应该重视一下文档的跟进速度 |
|
返回顶楼 | |
发表时间:2005-09-06
to:lyo
我不知道你用什么版本的hivemind,我写的那些文档好像是Tapestry beta2时测试过的,看了您的帖子又用最新的beta5测试了一下,我这里没有任何问题的,Tapestry从4.0开始只能用hivemind1.1,原文见: http://jakarta.apache.org/tapestry/UsersGuide/hivemind.html Tapestry 4.0 is not compatible with HiveMind 1.0. Tapestry 4.0 may only be used with HiveMind 1.1. The compatibility issues are related to the underlying Javassist library; HiveMind 1.0 and Tapestry 3.0 use one version of the library, HiveMind 1.1 and Tapestry 4.0 use a more recent version. 如果需要我可以上传一下刚测试的eclipse下的项目。 |
|
返回顶楼 | |
发表时间:2005-09-09
可以不用spring,因为用Spring连接不上受保护(init需要验证)的EJB
<module id="mymodule" version="1.0.0" > The master module for the Apache Tapestry web application framework. <dependency module-id="hivemind" version="1.1.0"/> <dependency module-id="hivemind.lib" version="1.1.0"/> <dependency module-id="tapestry" version="4.0.0"/> <contribution configuration-id="hivemind.FactoryDefaults"> <default symbol="java.naming.security.principal" value="weblogic"/> <default symbol="java.naming.security.credentials" value="weblogic"/> </contribution> <service-point id="SecurityNameLookup" interface="org.apache.hivemind.lib.NameLookup"> A service which can perform name lookups of objects using JNDI. <invoke-factory> <construct class="org.apache.hivemind.lib.impl.SecurityNameLookup"> <set property="initialFactory" value="${java.naming.factory.initial}"/> <set property="URLPackages" value="${java.naming.factory.url.pkgs}"/> <set property="providerURL" value="${java.naming.provider.url}"/> <set property="userName" value="${java.naming.security.principal}"/> <set property="passWord" value="${java.naming.security.credentials}"/> <set-service property="coordinator" service-id="hivemind.lib.RemoteExceptionCoordinator"/> <event-listener service-id="hivemind.lib.RemoteExceptionCoordinator"/> </construct> </invoke-factory> </service-point> <service-point id="hibernateService" interface="com.ejb.inf.BaseHibernateService"> <invoke-factory service-id="hivemind.lib.EJBProxyFactory"> <construct jndi-name="BaseHibernateServiceBean" home-interface="com.ejb.inf.BaseHibernateServiceHome" name-lookup-service-id="mymodule.SecurityNameLookup" /> </invoke-factory> </service-point> <service-point id="securityService" interface="com.ejb.inf.SecurityService"> <invoke-factory service-id="hivemind.lib.EJBProxyFactory"> <construct jndi-name="SecurityServiceBean" home-interface="com.ejb.inf.SecurityServiceHome" name-lookup-service-id="mymodule.SecurityNameLookup" /> </invoke-factory> </service-point> <service-point id="securityFacade" interface="net.sf.acegisecurity.providers.dao.AuthenticationDao"> <invoke-factory> <construct class="com.tapestry.facade.SecurityFacade"> <set-service property="securityService" service-id="securityService"/> </construct> </invoke-factory> </service-point> <service-point id="facadeBaseDao" interface="com.hibernateDao.inf.BaseHibernateDaoInf"> <invoke-factory> <construct class="com.tapestry.facade.HibernateDaoFacade"> <set-service property="baseHibernateService" service-id="hibernateService"/> </construct> </invoke-factory> </service-point> <!-- <bean name="passwordEncoder" class="com.tapestry.security.PasswordEncoder"/> <bean name="userCache" class="com.tapestry.security.TapestryUserCache"/> --> <service-point id="userCache" interface="net.sf.acegisecurity.providers.dao.UserCache"> <create-instance class="com.tapestry.security.TapestryUserCache" model="singleton"/> </service-point> <service-point id="passwordEncoder" interface="net.sf.acegisecurity.providers.encoding.PasswordEncoder"> <create-instance class="com.tapestry.security.PasswordEncoder" model="singleton"/> </service-point> <service-point id="daoAuthenticationProvider" interface="net.sf.acegisecurity.providers.AuthenticationProvider"> <invoke-factory> <construct class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider"> <set property="hideUserNotFoundExceptions" value="false"/> <set-service property="authenticationDao" service-id="securityFacade"/> <set-service property="userCache" service-id="mymodule.userCache" /> <set-service property="passwordEncoder" service-id="mymodule.passwordEncoder"/> </construct> </invoke-factory> </service-point> <service-point id="providers" interface="java.util.List"> <invoke-factory> <construct class="com.tapestry.security.MyProviders"> <set-service property="authenticationProvider" service-id="daoAuthenticationProvider"/> </construct> </invoke-factory> </service-point> <service-point id="authenticationManager" interface="net.sf.acegisecurity.AuthenticationManager"> <invoke-factory> <construct class="net.sf.acegisecurity.providers.ProviderManager"> <set-service property="providers" service-id="providers"/> </construct> </invoke-factory> </service-point> //namelookup package org.apache.hivemind.lib.impl; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.apache.hivemind.ApplicationRuntimeException; import org.apache.hivemind.HiveMind; import org.apache.hivemind.lib.NameLookup; import org.apache.hivemind.lib.RemoteExceptionCoordinator; import org.apache.hivemind.lib.RemoteExceptionEvent; import org.apache.hivemind.lib.RemoteExceptionListener; public class SecurityNameLookup implements NameLookup,RemoteExceptionListener { private RemoteExceptionCoordinator _coordinator; private Context _initialContext; private String _initialFactory; private String _URLPackages; private String _providerURL; private String _userName; private String _passWord; public Object lookup(String name, Class expected) { int i = 0; while (true) { Context context = null; Object raw = null; try { context = getInitialContext(); raw = context.lookup(name); } catch (NamingException ex) { if (i++ == 0) _coordinator.fireRemoteExceptionDidOccur(this, ex); else throw new ApplicationRuntimeException( ImplMessages.unableToLookup(name, context), ex); continue; } if (raw == null) throw new ApplicationRuntimeException(ImplMessages.noObject(name, expected)); if (!expected.isAssignableFrom(raw.getClass())) throw new ApplicationRuntimeException(ImplMessages.wrongType(name, raw, expected)); return raw; } } private Context getInitialContext() throws NamingException { if (_initialContext == null) { Hashtable properties = new Hashtable(); if (!HiveMind.isBlank(_initialFactory)) properties.put(Context.INITIAL_CONTEXT_FACTORY, _initialFactory); if (!HiveMind.isBlank(_providerURL)) properties.put(Context.PROVIDER_URL, _providerURL); if (!HiveMind.isBlank(_URLPackages)) properties.put(Context.URL_PKG_PREFIXES, _URLPackages); if(!HiveMind.isBlank(_userName)) properties.put(Context.SECURITY_PRINCIPAL,_userName); if(!HiveMind.isBlank(_passWord)) properties.put(Context.SECURITY_CREDENTIALS,_passWord); _initialContext = constructContext(properties); } return _initialContext; } /** * Constructs the InitialContext (this is separated out in a standalone * method so that it may be overridden in a testing subclass). */ protected Context constructContext(Hashtable properties) throws NamingException { return new InitialContext(properties); } /** * Sets the InitialContext to null. */ public void remoteExceptionDidOccur(RemoteExceptionEvent event) { _initialContext = null; } /** * Sets the initial factory used to create the initial JNDI context. * Equivalent to the system property <code>java.naming.factory.initial</code>. */ public void setInitialFactory(String string) { _initialFactory = string; } /** * Sets the JNDI provider URL, used to create the initial JNDI context. * Equivalent to the system property <code>java.naming.provider.url</code>. */ public void setProviderURL(String string) { _providerURL = string; } /** * Sets the URL packages, used to create the initial JNDI context. * Equivalent to the system property * <code>java.naming.factory.url.pkgs</code> */ public void setURLPackages(String string) { _URLPackages = string; } public void setCoordinator(RemoteExceptionCoordinator coordinator) { _coordinator = coordinator; } /** * @return Returns the _passWord. */ public String getPassWord() { return _passWord; } /** * @param word The _passWord to set. */ public void setPassWord(String word) { _passWord = word; } /** * @return Returns the _userName. */ public String getUserName() { return _userName; } /** * @param name The _userName to set. */ public void setUserName(String name) { _userName = name; } } //page <inject property="authenticationManger" object="service:mymodule.authenticationManager"/> |
|
返回顶楼 | |
发表时间:2005-09-09
你说的访问受保护的EJB是指什麽?我认为spring不是很适合与EJB一起使用, 看过一篇 jdon上的文章,http://www.jdon.com/AOPdesign/spring2.htm 说的有点道理, robbin的最佳分布式架构 SessionBean+Hibernate 中也没有涉及Spring,似乎在EJB环境下 ,spring很难插手,我指的是在EJB这个层面,用Hibernate代替EntityBean,中间是不是应该直接用Hibernate操作数据库,不用加Spring了? 大家有什麽看法
|
|
返回顶楼 | |