在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下:
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.net.URL; 7 import java.net.HttpURLConnection; 8 public class TestPost { 9 public static void testPost() throws IOException { 10 /** 11 * 首先要和URL下的URLConnection对话。 URLConnection可以很容易的从URL得到。比如: // Using 12 * java.net.URL and //java.net.URLConnection 13 * 14 * 使用页面发送请求的正常流程:在页面http://www.faircanton.com/message/loginlytebox.asp中输入用户名和密码,然后按登录, 15 * 跳转到页面http://www.faircanton.com/message/check.asp进行验证 16 * 验证的的结果返回到另一个页面 17 * 18 * 使用java程序发送请求的流程:使用URLConnection向http://www.faircanton.com/message/check.asp发送请求 19 * 并传递两个参数:用户名和密码 20 * 然后用程序获取验证结果 21 */ 22 URL url = new URL("http://www.faircanton.com/message/check.asp"); 23 HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 24 /** 25 * 然后把连接设为输出模式。URLConnection通常作为输入来使用,比如下载一个Web页。 26 * 通过把URLConnection设为输出,你可以把数据向你个Web页传送。下面是如何做: 27 */ 28 connection.setDoOutput(true); 29 connection.setRequestMethod("POST"); 30 /** 31 * 最后,为了得到OutputStream,简单起见,把它约束在Writer并且放入POST信息中,例如: ... 32 */ 33 OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "8859_1"); 34 out.write("username=kevin&password=*********"); //向页面传递数据。post的关键所在! 35 // remember to clean up 36 out.flush(); 37 out.close(); 38 /** 39 * 这样就可以发送一个看起来象这样的POST: 40 * POST /jobsearch/jobsearch.cgi HTTP 1.0 ACCEPT: 41 * text/plain Content-type: application/x-www-form-urlencoded 42 * Content-length: 99 username=bob password=someword 43 */ 44 // 一旦发送成功,用以下方法就可以得到服务器的回应: 45 String sCurrentLine; 46 String sTotalString; 47 sCurrentLine = ""; 48 sTotalString = ""; 49 InputStream l_urlStream; 50 l_urlStream = connection.getInputStream(); 51 // 传说中的三层包装阿! 52 BufferedReader l_reader = new BufferedReader(new InputStreamReader( 53 l_urlStream)); 54 while ((sCurrentLine = l_reader.readLine()) != null) { 55 sTotalString += sCurrentLine + "/r/n"; 56 57 } 58 System.out.println(sTotalString); 59 } 60 61 public static void main(String[] args) throws IOException { 62 testPost(); 63 } 64 }
这个程序我已经测试通过的。
如果除了post一些数据外,还要上传文件,可以使用下面两个函数之一:
1 /** 2 * 通过HTTP协议向指定的网络地址发送文件。 3 * @param params 传输过程中需要传送的参数 4 * @param filename 需要传送的文件在本地的位置。 5 * @throws TransferException 6 */ 7 public String doPost(HashMap params, InputStream stream) 8 throws TransferException 9 { 10 URLConnection conn = null; // URL连结对象。 11 BufferedReader in = null; // 请求后的返回信息的读取对象。 12 String keyName = null; 13 try 14 { 15 conn = url.openConnection(); 16 conn.setUseCaches(false); 17 conn.setDoOutput(true); 18 conn.setRequestProperty("Content-Type", "multipart/form-data"); 19 20 // 设置参数 21 if (params != null) 22 { 23 Set keys = params.keySet(); 24 // 遍历参数集取得参数名称和值 25 if (!keys.isEmpty()) 26 { 27 Iterator iterator = keys.iterator(); 28 while (iterator.hasNext()) 29 { 30 keyName = (String) iterator.next(); 31 // 将参数加入到连接对象中 32 conn.addRequestProperty( 33 keyName, 34 (String) params.get(keyName)); 35 } 36 } 37 } 38 // 构造传输文件 39 //FileInputStream fis = new FileInputStream(filename); 40 BufferedInputStream bis = new BufferedInputStream( stream ); 41 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 42 int ch; 43 while ((ch = bis.read()) != -1) 44 baos.write(ch); 45 byte[] fileData = baos.toByteArray(); 46 47 // 传输文件。 48 DataOutputStream dos = 49 new DataOutputStream( 50 new BufferedOutputStream(conn.getOutputStream())); 51 dos.write(fileData); 52 dos.flush(); 53 dos.close(); 54 55 56 in = 57 new BufferedReader( 58 new InputStreamReader(conn.getInputStream())); 59 //in.close(); 60 } 61 catch (FileNotFoundException fe) 62 { 63 InputStream err = ((HttpURLConnection) conn).getErrorStream(); 64 if (err == null) 65 throw new TransferException("网络传输时发生的未知错误"); 66 in = new BufferedReader(new InputStreamReader(err)); 67 } 68 catch (IOException ioe) 69 { 70 ioe.printStackTrace(); 71 throw new TransferException("网络传输错误!"); 72 } 73 74 // 返回提示信息 75 StringBuffer response = new StringBuffer(); 76 String line; 77 try 78 { 79 while ((line = in.readLine()) != null) 80 response.append(line + "/n"); 81 in.close(); 82 } 83 catch (IOException ioe) 84 { 85 ioe.getStackTrace(); 86 throw new TransferException("网络响应错误!"); 87 } 88 return response.toString(); 89 } 90 91 /** 92 * 通过HTTP协议向指定的网络地址发送文件。 93 * @param params 传输过程中需要传送的参数 94 * @param data 需要传送的内容。 95 * @throws TransferException 96 */ 97 public InputStream doPost(HashMap params, byte[] data) 98 throws TransferException 99 { 100 URLConnection conn = null; // URL连结对象。 101 BufferedReader in = null; // 请求后的返回信息的读取对象。 102 String keyName = null; 103 try 104 { 105 conn = url.openConnection(); 106 conn.setUseCaches(false); 107 conn.setDoOutput(true); 108 conn.setRequestProperty("Content-Type", "multipart/form-data"); 109 110 // 设置参数 111 if (params != null) 112 { 113 Set keys = params.keySet(); 114 // 遍历参数集取得参数名称和值 115 if (!keys.isEmpty()) 116 { 117 Iterator iterator = keys.iterator(); 118 while (iterator.hasNext()) 119 { 120 keyName = (String) iterator.next(); 121 // 将参数加入到连接对象中 122 conn.addRequestProperty( 123 keyName, 124 (String) params.get(keyName)); 125 } 126 } 127 } 128 129 // 传输文件。 130 DataOutputStream dos = 131 new DataOutputStream( 132 new BufferedOutputStream(conn.getOutputStream())); 133 dos.write(data); 134 dos.flush(); 135 dos.close(); 136 return conn.getInputStream(); 137 } 138 catch (FileNotFoundException fe) 139 { 140 InputStream err = ((HttpURLConnection) conn).getErrorStream(); 141 if (err == null) 142 throw new TransferException("网络传输时发生的未知错误"); 143 else 144 throw new TransferException("未知错误"); 145 } 146 catch (IOException ioe) 147 { 148 ioe.printStackTrace(); 149 throw new TransferException("网络传输错误!"); 150 } 151 }
这两个函数是公司的员工写的,还没有用实际的例子测试过。
我们还可以使用htmlparse的jar包(该包及相关文档可以在http://htmlparser.sourceforge.net/这里下载)提供的函数对获取的html进行解析
例子如下:
1 import org.htmlparser.Node; 2 import org.htmlparser.NodeFilter; 3 import org.htmlparser.Parser; 4 import org.htmlparser.filters.TagNameFilter; 5 import org.htmlparser.tags.TableTag; 6 import org.htmlparser.util.NodeList; 7 public class TestHTMLParser { 8 public static void testHtml() { 9 try { 10 String sCurrentLine; 11 String sTotalString; 12 sCurrentLine = ""; 13 sTotalString = ""; 14 java.io.InputStream l_urlStream; 15 java.net.URL l_url = new java.net.URL("http://www.ideagrace.com/html/doc/2006/07/04/00929.html"); 16 java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection(); 17 l_connection.connect(); 18 l_urlStream = l_connection.getInputStream(); 19 java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream)); 20 while ((sCurrentLine = l_reader.readLine()) != null) { 21 sTotalString += sCurrentLine+"/r/n"; 22 // System.out.println(sTotalString); 23 } 24 String testText = extractText(sTotalString); 25 System.out.println( testText ); 26 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 31 } 32 33 public static String extractText(String inputHtml) throws Exception { 34 StringBuffer text = new StringBuffer(); 35 Parser parser = Parser.createParser(new String(inputHtml.getBytes(),"GBK"), "GBK"); 36 // 遍历所有的节点 37 NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() { 38 public boolean accept(Node node) { 39 return true; 40 } 41 }); 42 43 System.out.println(nodes.size()); //打印节点的数量 44 for (int i=0;i<nodes.size();i++){ 45 Node nodet = nodes.elementAt(i); 46 //System.out.println(nodet.getText()); 47 text.append(new String(nodet.toPlainTextString().getBytes("GBK"))+"/r/n"); 48 } 49 return text.toString(); 50 } 51 52 public static void test5(String resource) throws Exception { 53 Parser myParser = new Parser(resource); 54 myParser.setEncoding("GBK"); 55 String filterStr = "table"; 56 NodeFilter filter = new TagNameFilter(filterStr); 57 NodeList nodeList = myParser.extractAllNodesThatMatch(filter); 58 TableTag tabletag = (TableTag) nodeList.elementAt(11); 59 60 } 61 62 public static void main(String[] args) throws Exception { 63 // test5("http://www.ggdig.com"); 64 testHtml(); 65 } 66 }