指引网

当前位置: 主页 > 编程开发 > Java >

Java网络编程之URI、URL研究专题七

来源:网络 作者:佚名 点击: 时间:2017-11-14 05:55
[摘要] 在对openConnection()的调用返回后,调用了connect()方法--用于建立某种资源的连接。(尽管openConnection()方法返回一个连接对象的引用,但是openConnection()不会连接到资源)。 URLConnection的getHeaderFiel

  在对openConnection()的调用返回后,调用了connect()方法--用于建立某种资源的连接。(尽管openConnection()方法返回一个连接对象的引用,但是openConnection()不会连接到资源)。 URLConnection的getHeaderFields()方法返回一个对象的应用,该对象的类实现了java.util.Map接口。
  
  该图表(map)包含头部名称和值的集合。什么是头部(header)?头部是基于文本的名称/值对,它识别资源数据的类型、数据的长度等等。
  
  在编译了URLDemo2后,在命令行输入java URLDemo2 http://www.javajeff.com,输出如下:
  
  Date=[Sun, 17 Feb 2002 17:49:32 GMT]
  
  Connection=[Keep-Alive]
  
  Content-Type=[text/html; charset=iso-8859-1]
  
  Accept-Ranges=[bytes]
  
  Content-Length=[7214]
  
  ull=[HTTP/1.1 200 OK]
  
  ETag=["4470e-1c2e-3bf29d5a"]
  
  Keep-Alive=[timeout=15, max=100]
  
  Server=[Apache/1.3.19 (Unix) Debian/GNU]
  
  Last-Modified=[Wed, 14 Nov 2001 16:35:38 GMT]
  
  Input allowed = true
  
  Output allowed = false
  
  上面的输出识别了很多头部(包括Date、null、Content-Length、 Server、Last-Modified等等)和它们的值。输出也显示只允许从资源读取数据。
  
  你对一个程序是如何识别资源数据的是否感到惊奇?仔细看一下前面的输出,你会看到叫做Content-Type的东西。Content-Type是一个头部,它识别了资源数据(内容)的类型是text/html。text部分就是我们所知道的类型,html部分是我们所知道的子类型。
  
  (如果内容是普通的文本,Content-Type的值可能是text/plain。上面的类型表明内容是文本的但不是没有格式的)。Content-Type头部是我们所知道的多用途Internet邮件扩展(MIME)的一部分。
  
  MIME是传统的传输消息的7位ASCII标准的一种扩展。通过引入了多种头部,MIME使视频、声音、图像、不同字符集的文本与7位ASCII结合起来。有了Content-Type,MIME可以识别Content-Length和其它标准的头部。当你使用URLConnection类的时候,你会遇到getContentType()和getContentLength()。这些方法返回的值是Content-Type和Content-Length头部。
  
  你也许听说过HTML窗体(<form>、 </form>)和其它的HTML标记。窗体使我们能够从某种资源得到(GET)数据并按后来的处理把HTML窗体的字段数据发送(POST)到某种资源。你能够使用URLConnection类和MIME模拟可以得到和发送数据的HTML窗体。下面说明你怎样完成这种事务。
  
  假设你想把窗体数据发送(POST)到某个服务器程序。发送需要对窗体数据的操作。首先,窗体的数据必须组织为名称/值对(name/value pair),其次每个对必须指定为name=value格式,再次如果发送多个名称/值对,必须使用 & 符号把每对分开,最后的name内容和value的内容必须使用application/x-www-form-urlencoded MIME类型编码。例如x=y&a=b表现了两个名称/值对--x/y和a/b。
  
  为了辅助编码,Java提供了java.net.URLEncoder类,它声明了一对静态的encode()方法。每个方法有一个String参数并返回包含已编码的参数内容的String对象的引用。例如,如果encode()发现参数中有空格,它在结果中用加号代替空格。
  
  下面的代码片断演示了调用URLEncoder的encode(String s)方法,对a 空格 b字符串进行编码。结果a+b存储在一个新的String对象中,result引用它。
  
  String result = URLEncoder.encode ("a b");
  
  作为准备窗体数据的补充,必须告诉URLConnection对象数据已经被发送了,因为URLConnection默认的操作是获取数据。为了完成这种事务,你可以首先把openConnection()的返回值转换为HttpURLConnection类型(在确保该返回值的类型正确后)。接着调用结果对象的setRequestMethod(String method)方法,把POST作为method参数引用的对象的值。
  
  另一个必须完成的事务是调用URLConnection的setDoOutput(boolean doOutput)方法,其参数的值必须为true。这种事务是必要的,因为URLConnection对象在默认情况下不支持输出。(接着程序最终可以调用URLConnection的getOutputStream()方法,为发送的窗体数据返回一个资源的输出流的引用)。
------分隔线----------------------------