点击这里给我发消息 点击这里给我发消息

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

添加时间:2013-12-7
    相关阅读: 网络 程序 HTML

  列表6是URLDemo3的源代码,它演示了把窗体数据发送给某个"了解"application/x-www-form-urlencoded内容类型的资源。它实现了前面提到的各种事务。
  
  列表6: URLDemo3.java
  
  // URLDemo3.java
  
  import java.io.*;
  
  import java.net.*;
  
  class URLDemo3
  
  {
  
  ublic static void main (String [] args) throws IOException
  
  {
  
  // 检查最后两个参数和参数的数量
  
  if (args.length < 2 || args.length % 2 != 0)
  
  {
  
  System.err.println ("usage: java URLDemo3 name value " +
  
  "[name value ...]");
  
  return;
  
  }
  
  // 建立程序连接服务器程序资源的URL对象,它返回一个窗体的名称/值对
  
  URL url;
  
  url = new URL
  
  ("http://banshee.cs.uow.edu.au:2000/~nabg/echo.cgi");
  
  // 向某个特定协议对象返回表现http资源连接的引用
  
  URLConnection uc = url.openConnection ();
  
  // 验证连接的类型,必须是HttpURLConnection的
  
  if (!(uc instanceof HttpURLConnection))
  
  {
  
  System.err.println ("Wrong connection type");
  
  return;
  
  }
  
  // 表明程序必须把名称/值对输出到服务器程序资源
  
  uc.setDoOutput (true);
  
  // 表明只能返回有用的信息
  
  uc.setUseCaches (false);
  
  //设置Content-Type头部指示指定URL已编码数据的窗体MIME类型
  
  uc.setRequestProperty ("Content-Type",
  
  "application/x-www-form-urlencoded");
  
  // 建立名称/值对内容发送给服务器
  
  String content = buildContent (args);
  
  //设置Content-Type头部指示指定URL已编码数据的窗体MIME类型
  
  uc.setRequestProperty ("Content-Length",
  
  "" + content.length ());
  
  // 提取连接的适当的类型
  
  HttpURLConnection hc = (HttpURLConnection) uc;
  
  // 把HTTP请求方法设置为POST(默认的是GET)
  
  hc.setRequestMethod ("POST");
  
  // 输出内容
  
  OutputStream os = uc.getOutputStream ();
  
  DataOutputStream dos = new DataOutputStream (os);
  
  dos.writeBytes (content);
  
  dos.flush ();
  
  dos.close ();
  
  // 从服务器程序资源输入和显示内容
  
  InputStream is = uc.getInputStream ();
  
  int ch;
  
  while ((ch = is.read ()) != -1)
  
  System.out.print ((char) ch);
  
  is.close ();
  
  }
  
  tatic String buildContent (String [] args)
  
  {
  
  StringBuffer sb = new StringBuffer ();
  
  for (int i = 0; i < args.length; i++)
  
  {
  
  // 为正确的传输对参数编码
  
  String encodedItem = URLEncoder.encode (args [i]);
  
  .append (encodedItem);
  
  if (i % 2 == 0)
  
  .append ("="); // 分离名称和值
  
  else
  
  .append ("&"); // 分离名称/值对
  
  }
  
  // 删除最后的 & 间隔符
  
  .setLength (sb.length () - 1);
  
  return sb.toString ();
  
  }
  
  }
  你可以会奇怪为什么URLDemo3没有调用URLConnection的connect()的方法。这个方法没有被明显的调用,因为如果连向资源的连接没有建立的话,其它的URLConnection方法(例如getContentLength())会明确的调用connect()方法。但是一旦连建立了接,调用这些方法(例如setDoOutput(boolean doOutput))就是违反规定的。
  
  在connect()被(明确地或隐含地)调用后,这些方法会产生一个IllegalStateException对象。
  
  在URLDemo3编译后,在命令行输入java URLDemo3 name1 value1 name2 value2 name3 value3,你可以看到下面的输出:
  
  <html> <head>
  
  <title>Echoing your name value pairs</title>
  
  </head>
  
  <body>
  
  <ol>
  
  <li>name1 : value1
  
  <li>name2 : value2
  
  <li>name3 : value3
  
  </ol>
  
  <hr>
  
  Mon Feb 18 08:58:45 2002
  
  </body>
  
  </html>
  
  该服务器程序资源的输出由HTML组成,这些HTML回应的是name1、value1、name2、 value2、name3和value3。
  
  技巧
  
  如果你需要URL对象的URL的字符串表现形式,请调用toExternalForm()或toString()。两种方法的功能是相同的。
  
  总结
  
  本文研究了Java的网络API,聚焦于URI、URL和URN。你学习了这些概念,以及怎样使用URI和URL(URL相关)的类工作,同时你学习了MIME的知识以及它与URL的关系。现在你应该编写一些代码熟悉一下所学的内容了。
咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册