доступ к бину jsf из клиента Blazeds - PullRequest
0 голосов
/ 02 марта 2010
  • Как я могу получить доступ к управляемому бину jsf (скажем, icefaces) из клиента Blazeds?
  • Можно ли будет также передавать ту же информацию о сеансе? (например, если у меня есть страница с компонентом jsf / icefaces и клиентом swf - могут ли они использовать один и тот же сеанс?)

1 Ответ

0 голосов
/ 02 марта 2010

Прежде всего вы должны внедрить FlexFactory на своем собственном заводе:
http://livedocs.adobe.com/blazeds/1/blazeds_devguide/factory_2.html

Я немного изменил SpringFactory, чтобы вы могли получить доступ к текущему экземпляру данного компонента:

public class BeanFactory implements FlexFactory {

private static final String SOURCE = "source";

public void initialize(String id, ConfigMap configMap) {}

public FactoryInstance createFactoryInstance(String id, ConfigMap properties) {
    BeanFactoryInstance instance = new BeanFactoryInstance(this, id, properties);
    instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId()));
    return instance;
}

public Object lookup(FactoryInstance inst) {
    BeanFactoryInstance factoryInstance = (BeanFactoryInstance) inst;
    return factoryInstance.lookup();
} 

static class BeanFactoryInstance extends FactoryInstance {
    BeanFactoryInstance(BeanFactory factory, String id, ConfigMap properties) {
        super(factory, id, properties);
    }

    public String toString() {
        return "BeanFactory instance for id=" + getId() + " source=" + getSource() + " scope=" + getScope();
    }

    public Object lookup() {
        HttpServletRequest hsr = FlexContext.getHttpRequest();
        String beanName = getSource();

        try
        {
            Object o = hsr.getSession().getAttribute(beanName);
            return o;
        }
        catch (Exception e)
        {
            ServiceException se = new ServiceException();
            String msg = "Java Bean '" + beanName + "' does not exist.";
            se.setMessage(msg);
            se.setRootCause(e);
            se.setDetails(msg);
            se.setCode("Server.Processing");
            throw se;
        }
    }
}}

в файле service-config.xml (папка WEB-INF / flex) вы должны зарегистрировать эту фабрику:

<factories>
    <factory id="beanFactory" class="packageName.BeanFactory"/>
</factories>

тогда вам нужно зарегистрировать фабрику в пункте назначения в remoting-config.xml следующим образом:

<destination id="remoteService">
        <properties>
            <factory>beanFactory</factory>
            <source>beanName</source>
            <scope>session</scope>
        </properties>
 </destination>

так что же делает этот BeanFactory:
когда вы хотите получить доступ к удаленному устройству от flex до java или к jee-приложению, вы объявляете удаленный объект на flex с целевым объектом «remoteService», который настроен в remoting-config.xml. в тот момент, когда вы обращаетесь от flex к java путем вызова серверного метода, beanfactory заботится о текущем экземпляре bean-компонента, который вы объявляете в remoting-config.xml, получая запрос через FlexContext:
HttpServletRequest hsr = FlexContext.getHttpRequest ();

теперь вы получаете сеанс и с beanName экземпляра, вызывая
hsr.getSession (). getAttribute (beanName)

это работает только с прикладными и сессионными компонентами и только в том случае, если jsf создал экземпляр компонента до того, как BeanFactory захочет получить доступ к компоненту ...

если вы хотите интегрировать SWF-файл с IceFfaces, вы должны взять лед: outputMedia-Tag установить атрибут проигрывателя на «flash»

если вы работаете с eclipse для разработки своего jee-приложения и интегрируете tomcat в eclipse, вы можете установить корневую папку сервера в свойствах вашего flex-проекта в папку tomcat (flex builder):
alt text (Извините, не время для того, чтобы это выглядело хорошо;))

Теперь вы можете запустить сервер Tomcat непосредственно в Eclipse, а также отладить на Flex и Java:)

надеюсь, это поможет!

...