原文:Java Applets, ASP.net - Can You Play Together?
作者:Sowmya Kannan
出处:http://java.sun.com/developer/technicalArticles/appletAspIntegration/index.html
你的web应用平台是基于ASP.net技术的吗?当用户访问你的站点时,你想利用无处不在的Java平台来提供丰富的用户体验吗?你可以使用Java和JavaFX语言来开发安全的富互联网应用(Rich Internet Application,RIA——applet和Java Web Start应用),Java客户端技术无缝地整合了ASP.net技术。在这篇文章中,我们将探讨Java applet能够与ASP.net网页交互的各种机制。
这是一段简短的截屏视频(screencast)(大概两分半钟),展示了applet如何能够与ASP.net页面交互,可通过观看这一截屏视频来更好的了解本文剩余部分涉及到的上下文环境。
(因为编辑器原因,无法播放flash,可在原文中播放。)
如下代码片段所示,使用部署工具包(Deployment Toolkit)的脚本来在ASP.net页面中部署一个applet:
Default.aspx
<body>
...
<script src="http://www.java.com/js/deployJava.js"></script>
<script>
var attributes = { width:675, height:300} ;
var parameters = { jnlp_href: 'applet/map-applet.jnlp'};
deployJava.runApplet(attributes, parameters, '1.6');
</script>
...
</body>
applet(运行在客户端)能够使用以下机制来与ASP.net页面(运行在服务器上)交互:
可以使用cookie来在applet和ASP.net页面之间共享数据。Applet可以获取由ASP.net页面设定的cookie,基于同理,ASP.net也可以获取由applet设定的cookie。
在接下来展示的代码段中,MapApplet类使用java.net.CookieHandler类来获取由该applet所属父页面设定的userName这一cookie,文本内容“Hello <用户名称>”会显示在该applet的左上角。
private void getUserNameFromCookie() {
try {
// 获取用于该applet所属父页面的cookie
URL docBaseUrl = this.getDocumentBase();
CookieHandler cookieHandler = CookieHandler.getDefault();
java.util.Map<String, List<String>> headers =
cookieHandler.get(docBaseUrl.toURI(),
new HashMap<String,List<String>>());
if (headers.isEmpty()) {
System.out.println("No cookies found!");
} else {
getUserNameFromHeader(headers);
}
} catch(Exception e) {
...
}
}
private void getUserNameFromHeader(java.util.Map<String, List<String>> headers) {
for (String key : headers.keySet()) {
for (String value : headers.get(key)) {
if (key.equals("Cookie") && value.startsWith("userName")) {
userName = value.split("=")[1];
}
}
}
}
注:在使用java.net.CookieHandler的时候,需要对applet签名,如果你不希望对applet签名的话,那么可以在ASP.net页面中使用JavaScript代码来获取cookie的值,applet可以以下方式之一来访问该值:
applet可以利用LiveConnect特性来与其所属父页面中的JavaScript代码交互,applet可以调用JavaScript函数以及访问JavaScript变量,以此来更新其所属父页面的内容,页面中的JavaScript代码也可以调用applet的方法。
在以下的代码片段中,MapApplet类使用netscape.javascript.JSObject类的一个实例来更新asp:TextBox ID=”addresses”这一控件的内容。
MapApplet.java
public void updateWebPage(String street, String city, String state) {
char result = invokeAspPage(street, city, state);
if (result == '1') {
window.call("writeAddressOnPage", new Object[] {street, city, state});
}
}
Default.aspx
<body>
...
<script type="text/javascript" language="javascript">
function writeAddressOnPage(street, city, state) {
var address = street + ", " + city + ", " + state;
var form = document.getElementById("addrForm");
var prevValue = form.elements["addresses"].value;
form.elements["addresses"].value = prevValue + "\n" + address;
}
</script>
<form id="addrForm" runat="server">
<div>
<p>Addresses saved to your address book:</p>
<asp:TextBox ID="addresses" TextMode="MultiLine" Rows="6"
Columns="60" runat="server" ></asp:TextBox>
</div>
</form>
...
</body>
在表单提交时,通过Request这一对象,表单各字段的值对于下一个ASP.net页面来说就变为可用的了,所以你可能也会选择使用applet的数据来更新隐藏的表单字段。
applet可以使用java.net.URLConnection类来调用ASP.net页面,在以下的代码片段中,MapApplet类打开了一个到FileWriter.aspx页面的连接,使用连接的输出流传递参数,并通过读取连接的输入流来获取结果。
MapApplet.java
public char invokeAspPage(String street, String city, String state) {
char [] result = {'0'};
...
String urlString = baseUrl + "FileWriter.aspx";
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
// 发送参数给url连接
OutputStreamWriter out = new OutputStreamWriter(
connection.getOutputStream());
out.write("addresses=" + URLEncoder.encode(address, "UTF-8"));
out.close();
//从url连接中读取响应
BufferedReader in = new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
in.read(result);
in.close();
...
return result[0];
}
FileWriter.aspx页面把给定的地址信息写到位于ASP.net服务器上的userData/addresses.txt这一文本文件中,如果地址被成功写入的话,则该页面返回’1’这一字符值。
正如在本文中展示的那样,applet可通过好几种方式与ASP.net页面交互,请选择最适合你的应用的那种。我们将非常乐意听到你关于本文的反馈,如果你正在使用一些很有创意的方法来把applet和ASP.net很好地放一起工作的话,那么来与整个社区一起分享你的见解吧!
可下载ASP.net项目和Java代码(Netbeans项目)来进行更进一步的实验,点击以下链接就可以查看单个的源代码文件:
Java源代码(zip压缩文件)
ASP.net源代码(zip压缩文件)