论坛首页 Java企业应用论坛

Tapestry4 不能和Spring整合?

浏览 15096 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-09-05  
shinwell 写道
论坛在这里:
http://news.gmane.org/gmane.comp.java.tapestry.user


多谢链接,但是上面还是没有我发的帖子 
0 请登录后投票
   发表时间: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上用了 
0 请登录后投票
   发表时间: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呢?昏迷。。。。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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根本就是不兼容的 
这就是直接使用的异常~
0 请登录后投票
   发表时间:2005-09-06  
不过还是谢谢你, 这个线索很重要, 看来要把 Hivemind1.0的配置改成1。1的配置,这又难免要看 HM了 
0 请登录后投票
   发表时间: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作者应该重视一下文档的跟进速度 
0 请登录后投票
   发表时间: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下的项目。
0 请登录后投票
   发表时间: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"/>

 
0 请登录后投票
   发表时间: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了?  大家有什麽看法 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics