在web應用程式中,一般都是通過頁面發送http的post請求,但也可以使用java程式來類比頁面發送請求,代碼如下:
import java.io.BufferedReader;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.io.InputStreamReader;<br />import java.io.OutputStreamWriter;<br />import java.net.URL;<br />import java.net.URLConnection;<br />public class TestPost {<br />public static void testPost() throws IOException {<br /> /**<br /> * 首先要和URL下的URLConnection對話。 URLConnection可以很容易的從URL得到。比如: // Using<br /> * java.net.URL and //java.net.URLConnection<br /> *<br /> * 使用頁面發送請求的正常流程:在頁面http://www.faircanton.com/message/loginlytebox.asp中輸入使用者名稱和密碼,然後按登入,<br /> * 跳轉到頁面http://www.faircanton.com/message/check.asp進行驗證<br /> * 驗證的的結果返回到另一個頁面<br /> *<br /> * 使用java程式發送請求的流程:使用URLConnection向http://www.faircanton.com/message/check.asp發送請求<br /> * 並傳遞兩個參數:使用者名稱和密碼<br /> * 然後用程式擷取驗證結果<br /> */<br /> URL url = new URL("http://www.faircanton.com/message/check.asp");<br /> URLConnection connection = url.openConnection();<br /> /**<br /> * 然後把串連設為輸出模式。URLConnection通常作為輸入來使用,比如下載一個Web頁。<br /> * 通過把URLConnection設為輸出,你可以把資料向你個Web頁傳送。下面是如何做:<br /> */<br /> connection.setDoOutput(true);<br /> /**<br /> * 最後,為了得到OutputStream,簡單起見,把它約束在Writer並且放入POST資訊中,例如: ...<br /> */<br /> OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "8859_1");<br /> out.write("username=kevin&password=*********"); //向頁面傳遞資料。post的關鍵所在!<br /> // remember to clean up<br /> out.flush();<br /> out.close();<br /> /**<br /> * 這樣就可以發送一個看起來象這樣的POST:<br /> * POST /jobsearch/jobsearch.cgi HTTP 1.0 ACCEPT:<br /> * text/plain Content-type: application/x-www-form-urlencoded<br /> * Content-length: 99 username=bob password=someword<br /> */<br /> // 一旦發送成功,用以下方法就可以得到伺服器的回應:<br /> String sCurrentLine;<br /> String sTotalString;<br /> sCurrentLine = "";<br /> sTotalString = "";<br /> InputStream l_urlStream;<br /> l_urlStream = connection.getInputStream();<br /> // 傳說中的三層封裝阿!<br /> BufferedReader l_reader = new BufferedReader(new InputStreamReader(<br /> l_urlStream));<br /> while ((sCurrentLine = l_reader.readLine()) != null) {<br /> sTotalString += sCurrentLine + "/r/n"; </p><p> }<br /> System.out.println(sTotalString);<br /> } </p><p> public static void main(String[] args) throws IOException {<br /> testPost();<br /> }<br />}
這個程式我已經測試通過的。
如果除了post一些資料外,還要上傳檔案,可以使用下面兩個函數之一:
/**<br /> * 通過HTTP協議向指定的網路地址傳送檔案。<br /> * @param params 傳輸過程中需要傳送的參數<br /> * @param filename 需要傳送的檔案在本地的位置。<br /> * @throws TransferException<br /> */<br />public String doPost(HashMap params, InputStream stream)<br /> throws TransferException<br />{<br /> URLConnection conn = null; // URL連結對象。<br /> BufferedReader in = null; // 請求後的返回資訊的讀取對象。<br /> String keyName = null;<br /> try<br /> {<br /> conn = url.openConnection();<br /> conn.setUseCaches(false);<br /> conn.setDoOutput(true);<br /> conn.setRequestProperty("Content-Type", "multipart/form-data");</p><p> // 設定參數<br /> if (params != null)<br /> {<br /> Set keys = params.keySet();<br /> // 遍曆參數集取得參數名稱和值<br /> if (!keys.isEmpty())<br /> {<br /> Iterator iterator = keys.iterator();<br /> while (iterator.hasNext())<br /> {<br /> keyName = (String) iterator.next();<br /> // 將參數加入到連線物件中<br /> conn.addRequestProperty(<br /> keyName,<br /> (String) params.get(keyName));<br /> }<br /> }<br /> }<br /> // 構造傳輸檔案<br /> //FileInputStream fis = new FileInputStream(filename);<br /> BufferedInputStream bis = new BufferedInputStream( stream );<br /> ByteArrayOutputStream baos = new ByteArrayOutputStream();<br /> int ch;<br /> while ((ch = bis.read()) != -1)<br /> baos.write(ch);<br /> byte[] fileData = baos.toByteArray();</p><p> // 傳輸檔案。<br /> DataOutputStream dos =<br /> new DataOutputStream(<br /> new BufferedOutputStream(conn.getOutputStream()));<br /> dos.write(fileData);<br /> dos.flush();<br /> dos.close();</p><p> in =<br /> new BufferedReader(<br /> new InputStreamReader(conn.getInputStream()));<br /> //in.close();<br /> }<br /> catch (FileNotFoundException fe)<br /> {<br /> InputStream err = ((HttpURLConnection) conn).getErrorStream();<br /> if (err == null)<br /> throw new TransferException("網路傳輸時發生的未知錯誤");<br /> in = new BufferedReader(new InputStreamReader(err));<br /> }<br /> catch (IOException ioe)<br /> {<br /> ioe.printStackTrace();<br /> throw new TransferException("網路傳輸錯誤!");<br /> }</p><p> // 返回提示資訊<br /> StringBuffer response = new StringBuffer();<br /> String line;<br /> try<br /> {<br /> while ((line = in.readLine()) != null)<br /> response.append(line + "/n");<br /> in.close();<br /> }<br /> catch (IOException ioe)<br /> {<br /> ioe.getStackTrace();<br /> throw new TransferException("網路響應錯誤!");<br /> }<br /> return response.toString();<br />}</p><p>/**<br /> * 通過HTTP協議向指定的網路地址傳送檔案。<br /> * @param params 傳輸過程中需要傳送的參數<br /> * @param data 需要傳送的內容。<br /> * @throws TransferException<br /> */<br />public InputStream doPost(HashMap params, byte[] data)<br /> throws TransferException<br />{<br /> URLConnection conn = null; // URL連結對象。<br /> BufferedReader in = null; // 請求後的返回資訊的讀取對象。<br /> String keyName = null;<br /> try<br /> {<br /> conn = url.openConnection();<br /> conn.setUseCaches(false);<br /> conn.setDoOutput(true);<br /> conn.setRequestProperty("Content-Type", "multipart/form-data");</p><p> // 設定參數<br /> if (params != null)<br /> {<br /> Set keys = params.keySet();<br /> // 遍曆參數集取得參數名稱和值<br /> if (!keys.isEmpty())<br /> {<br /> Iterator iterator = keys.iterator();<br /> while (iterator.hasNext())<br /> {<br /> keyName = (String) iterator.next();<br /> // 將參數加入到連線物件中<br /> conn.addRequestProperty(<br /> keyName,<br /> (String) params.get(keyName));<br /> }<br /> }<br /> }</p><p> // 傳輸檔案。<br /> DataOutputStream dos =<br /> new DataOutputStream(<br /> new BufferedOutputStream(conn.getOutputStream()));<br /> dos.write(data);<br /> dos.flush();<br /> dos.close();<br /> return conn.getInputStream();<br /> }<br /> catch (FileNotFoundException fe)<br /> {<br /> InputStream err = ((HttpURLConnection) conn).getErrorStream();<br /> if (err == null)<br /> throw new TransferException("網路傳輸時發生的未知錯誤");<br /> else<br /> throw new TransferException("未知錯誤");<br /> }<br /> catch (IOException ioe)<br /> {<br /> ioe.printStackTrace();<br /> throw new TransferException("網路傳輸錯誤!");<br /> }<br />}
這兩個函數是公司的員工寫的,還沒有用實際的例子測試過。
我們還可以使用htmlparse的jar包(該包及相關文檔可以在http://htmlparser.sourceforge.net/這裡下載)提供的函數對擷取的html進行解析
例子如下:
import org.htmlparser.Node;<br />import org.htmlparser.NodeFilter;<br />import org.htmlparser.Parser;<br />import org.htmlparser.filters.TagNameFilter;<br />import org.htmlparser.tags.TableTag;<br />import org.htmlparser.util.NodeList;<br />public class TestHTMLParser {<br />public static void testHtml() {<br /> try {<br /> String sCurrentLine;<br /> String sTotalString;<br /> sCurrentLine = "";<br /> sTotalString = "";<br /> java.io.InputStream l_urlStream;<br /> java.net.URL l_url = new java.net.URL("http://www.ideagrace.com/html/doc/2006/07/04/00929.html");<br /> java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection();<br /> l_connection.connect();<br /> l_urlStream = l_connection.getInputStream();<br /> java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream));<br /> while ((sCurrentLine = l_reader.readLine()) != null) {<br /> sTotalString += sCurrentLine+"/r/n";<br /> // System.out.println(sTotalString);<br /> }<br /> String testText = extractText(sTotalString);<br /> System.out.println( testText ); </p><p> } catch (Exception e) {<br /> e.printStackTrace();<br /> } </p><p> } </p><p> public static String extractText(String inputHtml) throws Exception {<br /> StringBuffer text = new StringBuffer();<br /> Parser parser = Parser.createParser(new String(inputHtml.getBytes(),"GBK"), "GBK");<br /> // 遍曆所有的節點<br /> NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() {<br /> public boolean accept(Node node) {<br /> return true;<br /> }<br /> }); </p><p> System.out.println(nodes.size()); //列印節點的數量<br /> for (int i=0;i<nodes.size();i++){<br /> Node nodet = nodes.elementAt(i);<br /> //System.out.println(nodet.getText());<br /> text.append(new String(nodet.toPlainTextString().getBytes("GBK"))+"/r/n");<br /> }<br /> return text.toString();<br /> } </p><p> public static void test5(String resource) throws Exception {<br /> Parser myParser = new Parser(resource);<br /> myParser.setEncoding("GBK");<br /> String filterStr = "table";<br /> NodeFilter filter = new TagNameFilter(filterStr);<br /> NodeList nodeList = myParser.extractAllNodesThatMatch(filter);<br /> TableTag tabletag = (TableTag) nodeList.elementAt(11); </p><p> } </p><p> public static void main(String[] args) throws Exception {<br /> // test5("http://www.ggdig.com");<br /> testHtml();<br /> }<br />}
這個例子也已經測試通過。