Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>J2ME开发>>Java ME应用设计指南之联网重定向
Java ME应用设计指南之联网重定向
2007-04-17   来源:www.javaresearch.org  作者:未知

    HTTP 1.1协议允许Web服务器临时改变资源的位置,也就是说你访问的资源在另外一个地址。这时候服务器返回的响应代码是302,而新的地址存放在Header中,Header的名称是Location。正常情况下,客户端浏览器应该指向临时的访问地址。但是,移动终端设备差距很大,在处理302返回码的时候,设备之间的行为差异很大。

下面的代码可以用来处理重定向问题,但是在部分设备中会导致应用程序出错。

Connection c = (HttpConnection) Connector.open(uri);

  int status = c.getResponseCode();
String new_uri = c.getHeaderField("Location"); // new_uri is null on some devices
if (status == 302) {
  c.close();
  c = (HttpConnection) Connector.open(new_uri); // Breaks here
}
 
由于重定向是HTTP 1.1的特性,那么所有1.1兼容的设备都需要考虑这个问题。下面介绍如何解决这个问题。

    事实证明在某些设备上,底层的网络协议栈处理重定向的问题,302响应码告诉应用程序内部的处理流程。应用程序应该等待直到响应码等于302。但是有些设备不能正确地从响应中解析出Location字段,这样Location字段的内容是null,响应码存储在了响应的内容之中。有经验的工程师会采用下面的解决办法。

1)解析响应,在Location或者响应的内容中查找新地址,如果找到的话关闭以前的连接,转向新的连接。

2)如果什么也没有找到的话,那么等待10-1000ms,直到状态码从302转变为200。马上处理响应,当作没有错误发生。

下面的代码能够很好的解决重定向的问题,供大家参考和完善。

Connection c = (HttpConnection) Connector.open(uri);
int status = c.getResponseCode();
String redirection = httpConnection.getHeaderField("Location");
if (status == HttpConnection.HTTP_TEMP_REDIRECT) {
  if (redirection != null) {
    // This the standard HTTP 1.1 behaviour, move on to the redirection uri (basically restarting again).
  } else {
    // Parse the content of the HTTP response, if any.
    // Lookup for a "Location" header, if found, set value to the redirection variable
    if (redirection != null) {
    // Since location was found, fall back to the standard behaviour.
    } else {
      long begin_wait = System.currentTimeMillis();
      while (System.currentTimeMillis() - begin_wait < 1000 || response != 200) {
        sleep(100);
        response = httpConnection.getResponseCode();
      };
      if (response == 200) {
        // Once again we're back on tracks, continue processing as if no error has ever happen
      } else {
        // Here we're really hopeless. Either the server did provided a valid redirection uri,
        // or the device did not preserved it. The best option is probably to fail by throwing an exception.
      };
    };
  };
} else // Handle other error codes here
};

// Handle success here (status == 200)

    您还可以了解一下Http协议的细节,http://www.ietf.org/rfc/rfc2616.txt。本文是笔者在阅读SUN的技术文章的时候编译的。您可以通过下面的地址阅读原文,也欢迎您编译其他的好文章,共同促进国内Java ME技术的发展。

  --相关文章--
· 详细介绍手机游戏中的声音处理 (2007-04-17)
· 让JavaME程序实现真正Run Anywhere (2007-04-17)
· 端到端J2ME应用开发实例——介绍Smart Ticket (2007-04-17)
· 移动开发谁领风骚 J2ME开发工具面面观 (2007-04-17)
· 用NetBeans平台开发J2ME游戏实例讲解3 (2007-04-17)
· 用NetBeans平台开发J2ME游戏实例讲解2 (2007-04-17)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接