写一个JSP代理作为AIR和FLEX以及远程通信的桥梁

写一个JSP代理作为AIRFLEX以及远程通信的桥梁

【写在前面:】我本人也非常推荐使用JSP来构建FLEX的服务端,这样的应用架构不难理解而且也非常方便,扩充和维护起来都很简单

有的时候你无法将跨域的配置文件放置到一个目标服务器,那么这个时候你的C/S架构就会出现一些问题,如何来解决这些问题呢?你可以使用一个服务端的代理文件作为FLEX客户端加载远程数据的一个桥梁,和直接访问域上的资源不同,FLEX首先回去访问这些代理服务,然后由这个代理来尝试获得指定域上的资源。

这样的代理也可以通过使用JSP服务端语言来构建,脚本如下,将其保存为getrssurl.jsp并将其配置到服务端这样这个代理就可以工作了。

服务端代码:

<% @ page language="java" contentType="text/html; charset=utf-8"

pageEncoding
="utf-8"

import
="java.io.BufferedReader,

java.io.InputStreamReader,

java.io.IOException,

java.io.InputStream,

java.net.MalformedURLException,

java.net.URL,

java.net.URLConnection
"

%>

<% !

private String contentURL;

public static final String CONTENT_URL_NAME = "contentURL";

%>

<%

// 从request获得指定的要访问的URL:

If (contentURL 
==   null {

contentURL 
= (String)request.getAttribute(CONTENT_URL_NAME);

throw new ServletException("A content URL must be provided, as a

"'" + CONTENT_URL_NAME +

"'" request attribute or request parameter.");

URL url 
= null;

try {

//获得到该内容的连接:

url 
= new URL(contentURL);

URLConnection urlConn 
= url.openConnection();

//向客户端展示文档内容:

String contentType 
= urlConn.getContentType();

response.setContentType(contentType);

// 获得输入流

InputStream 
in = urlConn.getInputStream();

BufferedReader br 
= new BufferedReader(new InputStreamReader(in));

char[] buffer = new char[1024];

String contentString 
= "";

String tmp 
= br.readLine();

do

{

contentString 
+= tmp + " ";

tmp 
= br.readLine();

}


while (tmp != null);

out.flush();

out.close();

}


catch (MalformedURLException me) {

// 新的URL到来的时候:

throw new ServletException(å

"URL: '" + contentURL + "' is malformed.");

}


catch (IOException ioe) {

//在创建新的连接的时候:

throw new ServletException("Exception while opening '" +å

contentURL 
+ "': " + ioe.getMessage());

}


catch (Exception e) {

//在读入输入的时候:

throw new ServletException("Exception during proxy request: " å

+ e.getMessage());

}


%>

 

FLEX客户端,你要做的唯一一件事情就是将HTTP标签的目标URL进行修改,指向该JSP文件即可

客户端代码

< mx:Application xmlns:mx = " http://www.adobe.com/2006/mxml "

layout
= " vertical "  creationComplete = " myHS.send() " >

< mx:HTTPService id = " myHS "

url
= " http://88.149.156.198/develop/xmloutput/getrssurl.jsp "

method
= " GET " å

result
= " myAS = myHS.lastResult.rss.channel.item as ArrayCollection " >

< mx:request xmlns = "" >

< url > {myURL} </ url >

</ mx:request >

</ mx:HTTPService >

< mx:DataGrid id = " myDG "  dataProvider = " {myAS} " >

< mx:columns >

< mx:DataGridColumn dataField = " category "  headerText = " Category "   />

< mx:DataGridColumn dataField = " title "  headerText = " Description "   />

< mx:DataGridColumn dataField = " pubDate "  headerText = " Date "   />

</ mx:columns >

</ mx:DataGrid >

</ mx:Application >

保存这些文件,然后将SWFHTML包裹代码作为客户端,JSP文件作为服务端,装载该LFEX程序的话你就可以看见RSS FEED显示在应用程序中

 

源文档 <http://casario.blogs.com/mmworld/2008/02/write-a-jsp-pro.html>

 

Write a JSP proxy which acts as a bridge between the Flex and AIR applications and the remote data

Sometimes you won’t be able to put a cross-domain file on the destination server. To solve

this problem you can use a server-side proxy file that consists of a script published on the

server which acts as a bridge between the Flex application and the remote data to load. Instead of directly accessing external resources on different domains, Flex will access this proxy service, which looks after accessing the resources on the specified domains.

The same proxy method can also be created by using JSP as server-side language. Create a

new file and save it with the name getrssurl.jsp.  The script is the following:

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"

import="java.io.BufferedReader,

java.io.InputStreamReader,

java.io.IOException,

java.io.InputStream,

java.net.MalformedURLException,

java.net.URL,

java.net.URLConnection"

%>

<%!

private String contentURL;

public static final String CONTENT_URL_NAME = "contentURL";

%>

<%

// get the url through the request:

If (contentURL == null) {

contentURL = (String)request.getAttribute(CONTENT_URL_NAME);

if (contentURL == null)

contentURL = (String)request.getParameter(CONTENT_URL_NAME);

}

if (contentURL == null)

throw new ServletException("A content URL must be provided, as a

"'" + CONTENT_URL_NAME +

"'" request attribute or request parameter.");

URL url = null;

try {

// get a connection to the content:

url = new URL(contentURL);

URLConnection urlConn = url.openConnection();

// show the client the content type:

String contentType = urlConn.getContentType();

response.setContentType(contentType);

// get the input stream

InputStream in = urlConn.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(in));

char[] buffer = new char[1024];

String contentString = "";

String tmp = br.readLine();

do

{

contentString += tmp + "/n";

tmp = br.readLine();

}

while (tmp != null);

out.flush();

out.close();

}

catch (MalformedURLException me) {

// on new URL:

throw new ServletException(å

"URL: '" + contentURL + "' is malformed.");

}

catch (IOException ioe) {

// on opne connection:

throw new ServletException("Exception while opening '" +å

contentURL + "': " + ioe.getMessage());

}

catch (Exception e) {

// on reading input:

throw new ServletException("Exception during proxy request: " å

+ e.getMessage());

}

%>

Save this file as getrssurl.jsp and transfer it onto the web server.

On the Flex side the only thing you have to change is the address defined within the url

property of the HTTPService tag. The url has to point to the JSP file:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"

layout="vertical" creationComplete="myHS.send()">

<mx:HTTPService id="myHS"

url="http://88.149.156.198/develop/xmloutput/getrssurl.jsp"

method="GET"å

result="myAS = myHS.lastResult.rss.channel.item as ArrayCollection">

<mx:request xmlns="">

<url>{myURL}</url>

</mx:request>

</mx:HTTPService>

<mx:DataGrid id="myDG" dataProvider="{myAS}">

<mx:columns>

<mx:DataGridColumn dataField="category" headerText="Category" />

<mx:DataGridColumn dataField="title" headerText="Description" />

<mx:DataGridColumn dataField="pubDate" headerText="Date" />

</mx:columns>

</mx:DataGrid>

</mx:Application>

Save the file, run the application, and then copy the SWF file with the HTML Wrapper and

the JSP file onto a web server. Load the application to see the RSS feed displayed in the

Flex application.

Posted by marco casario on February 20, 2008 at 01:16 AM in Flex, Flex 2 Best Practice | Permalink

Comments

I end up using proxies like this way more than I'd like to, but alas, it's what we have to do.

one trick i like to use is to put the proxying into an error handler, so that if the site ever adds a crossdomain file, i can take advantage of direct access without having to change the code. It does add an extra request but can be handy.

myurlloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,tryProxy);

Posted by: Daryn | February 20, 2008 at 02:05 AM

 

源文档 <http://casario.blogs.com/mmworld/2008/02/write-a-jsp-pro.html>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值