1. 程式人生 > >flex eclipse整合spring入門

flex eclipse整合spring入門

最先下載FlashBuilder_4_7_LS10_win64.exe試了幾個eclipse安裝外掛都沒成功,包括myeclipse8.5、spring sts2.9.2、eclipse3.5、j2eeeclipse版本4.2.0,後來搞了一個FlashBuilder_4_LS10.exe安裝完找不到外掛安裝檔案原來這個是單獨版,必須外掛版才行,最後下載FlashBuilder_4_Plugin_LS10.exe終於配置成功了,myeclipse8.5不行,spring sts可以了。

spring sts部署應用跟myeclipse不一樣,比較類似eclipse。

用sts整合flex和java有幾個步驟:

1:新建動態web工程flexweb,建立web.xml

2:blazeds-turnkey-4.0.0.14931.zip解壓,複製blazed兩個資料夾flex和lib到WEB-INF下,裡面是blaze的jar包和flex配置檔案,然後修改web.xml加入blaze支援

<listener>
		<listener-class>flex.messaging.HttpFlexSession</listener-class>
	</listener>

	<!-- MessageBroker Servlet -->
	<servlet>
		<servlet-name>MessageBrokerServlet</servlet-name>
		<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
		<init-param>
			<param-name>services.configuration.file</param-name>
			<param-value>/WEB-INF/flex/services-config.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>MessageBrokerServlet</servlet-name>
		<url-pattern>/messagebroker/*</url-pattern>
	</servlet-mapping>

3:專案右鍵,新增/更改專案型別>新增flex型別專案,第一步,應用程式型別選擇J2EE,下方選擇BlazeDS,第二部根資料夾填入專案在workspase的路徑加一個WebContent,如E:\workspaces\sts\flexweb\WebContent,根URL填http://localhost:8080/flexweb,上下文根目錄/flexweb,輸出資料夾使用預設E:\workspaces\sts\flexweb\WebContent\flexweb-debug,點選finish

4:轉換完成後,目錄有些變化,右鍵專案>properties>flex構建路徑,主原始檔夾改為flex_src,然後把自動生成的src目錄下的flexweb.mxml移動到flex_src下,環境搭建就算完成了


HelloWorld

flexweb.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"     
			   xmlns:s="library://ns.adobe.com/flex/spark"     
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">    
	
	<fx:Script>    
		<![CDATA[    
			import mx.controls.Alert;    
			import mx.rpc.events.ResultEvent;    
			
			protected function myFlex_resultHandler(event:ResultEvent):void{    
				var name:String=event.result as String;    
				Alert.show(name);    
			}    
			protected function button1_clickHandler(event:MouseEvent):void   
			{      
				myFlex.sayHello(txtName.text);    
			}    
		]]>    
	</fx:Script>    
	
	<fx:Declarations>    
		<!-- 將非可視元素(例如服務、值物件)放在此處 -->    
		<s:RemoteObject id="myFlex" destination="mytest" result="myFlex_resultHandler(event)"/>    
	</fx:Declarations>    
	<s:Button x="209" y="135" label="按鈕" click="button1_clickHandler(event)"/>    
	<s:TextInput x="166" y="81" id="txtName"/>    
	<s:Label x="10" y="81" text="請輸入內容:" fontSize="15" fontWeight="bold" fontFamily="中易黑體"/>    
</s:Application>

其中

<s:RemoteObject id="myFlex" destination="mytest" result="myFlex_resultHandler(event)"/>

指定了一個呼叫Java的類Hello,mytest對應到remoting-config.xml

在WEB-INFO/flex目錄下remoting-config.xml加入

<destination id="mytest">
        <properties>
            <source>com.hongbo.Hello</source>
        </properties>
    </destination>

result對應的是java方法呼叫的回撥函式

建一個普通java類

package com.hongbo;

public class Hello {

	public String sayHello(String name){
		System.out.println("------------------------------------");
		return "Hello First Demo " + name;
	}
}

這樣就OK了

訪問路徑是http://localhost:8080/flexweb/flexweb-debug/flexweb.html

第一次會報404,problems提示無法建立html包裝器,右鍵點選重新建立模板


新增Spring支援

1:web.xml加入

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/classes/applicationContext.xml </param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

2:src下建立applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<bean id="hello" class="com.hongbo.Hello">
		<property name="testSpring">
			<ref bean="testSpring"/>
		</property>
	</bean>
	<bean id="testSpring" class="com.hongbo.test.impl.TestSpringImpl"/>
</beans>

3:WEB-INF/flex/service-config.xml加入

<factories>
	    <factory id="spring" class="com.hongbo.SpringFactory" />  
	</factories>
新增java類

package com.hongbo;


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import flex.messaging.FactoryInstance;
import flex.messaging.FlexFactory;
import flex.messaging.config.ConfigMap;
import flex.messaging.services.ServiceException;
public class SpringFactory implements FlexFactory {
	private static final String SOURCE = "source";

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

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

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

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

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

		public Object lookup() {
			ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(flex.messaging.FlexContext.getServletConfig().getServletContext());
			String beanName = getSource();

			try {
				return appContext.getBean(beanName);
			} catch (NoSuchBeanDefinitionException nexc) {
				ServiceException e = new ServiceException();
				String msg = "Spring service named '" + beanName
						+ "' does not exist.";
				e.setMessage(msg);
				e.setRootCause(nexc);
				e.setDetails(msg);
				e.setCode("Server.Processing");
				throw e;
			} catch (BeansException bexc) {
				ServiceException e = new ServiceException();
				String msg = "Unable to create Spring service named '"
						+ beanName + "' ";
				e.setMessage(msg);
				e.setRootCause(bexc);
				e.setDetails(msg);
				e.setCode("Server.Processing");
				throw e;
			}
		}

	}

}


4:修改remoting-config.xml

<destination id="mytest">
        <properties>
        	<factory>spring</factory>
            <source>hello</source>
        </properties>
    </destination>

5:修改相應的Java類

package com.hongbo;

import com.hongbo.test.TestSpring;

public class Hello {

	private TestSpring testSpring;
	
	public void setTestSpring(TestSpring testSpring) {
		this.testSpring = testSpring;
	}
	
	public String sayHello(String name){
		return testSpring.testSpring(name);
	}
}

package com.hongbo.test;

public interface TestSpring {

	String testSpring(String name);
}

package com.hongbo.test.impl;

import com.hongbo.test.TestSpring;

public class TestSpringImpl implements TestSpring{

	public String testSpring(String name){
		System.out.println("test spring-------------------------------------"+name);
		return "test spring "+name;
	}
}

最後,flex列印語句trace不會列印到控制檯,要先解除安裝flashplayer再安裝一個debuger版的flashplayer,下載flashplayer_uninstall.zip,解除安裝,下載flashplayer10r12_36_winax_debug.exe,安裝,解除安裝安裝後好像谷歌瀏覽器沒影響,然後eclipse修改預設瀏覽器為IE,window>preferences>General>Web browser,選擇Internet Explorer,最後還有,啟動tomcat後,必須在mxml上面右鍵debug執行,開啟的IE才會列印trace,直接訪問網址是不行的。

有遺漏請指出