java 代碼post表單數據到服務器,servlet接收處理

前言:

        一般來說表單數據是在網頁前端上面實現,在對應框內填入數據,點擊提交按鈕即將數據傳遞給後臺(action的值指定負責處理表單數據的具體哪個servlet)。但是其實java代碼也是可以遠程post表單數據給服務器的Servlet程序,下面講一講詳細步驟。


一、客戶端

編寫java程序

        主要思想就是利用http協議,post數據到指定url地址。

直接看下面代碼:代碼摘自《java核心技術卷2第9版》,我稍作修改,使之更易看懂,原程序的數據來源是放在一個properites文件中,我爲了程序好讀懂改成在程序中直接對要傳輸的參數進行賦值。

        數據傳輸是以鍵值對的方式(Key-Value)形式傳送。可以傳送很多對鍵值對,比如說(k1,v1)(k2,v2)  (k3,v3)......這所有的鍵值對都存放在Map集合當中,在服務器端,使用HttpServletRequest類的一個方法:getParameter("k1"),即可將客戶端傳來的k1對應的value值讀到,以字符串返回。

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class AndroidPost {

	public static void main(String[] args) throws IOException {
	
		/**
		url這裏是一個重點,服務器端使用的servlet,是tomcat容器在負責調用,
		tomcat默認的監聽端口即是8080,IP地址如果是遠程的或者使用的雲服務器,
		那就換成自己的IP,關鍵是8080端口後面的內容,test1其實是tomcat目錄下的一個webapp,
		test1可以理解成是一個tomcat下面的工程,而Upload_html這個則是具體的負責
		接收java代碼傳來的數據的servlet名稱,後綴.java省掉。同時在tomcat的test1工程下面
		(或者說文件夾下面)要新建一個WEB-INF的文件夾,在這個文件夾下面要建一個
		web.xml文件,在裏面要進行配置才能把url這個地址和具體servlet程序關聯起來。
		後面會講服務器端
		**/
		
		String url = "http://localhost:8080/test1/Upload_html";
		String result = doPost(url, sendParam());
		System.out.println(result);
		System.out.println("come on");
	}
	
	public static Map<String, String> sendParam() {
		//這裏用來存放鍵值對,爲了程序看起來簡單就手動輸上去了
		String key1 = "param1";
		String value1 = "1";
		String key2 = "param2";
		String value2 = "14";
		String key3 = "param3";
		String value3 = "334";
		HashMap<String, String> param = new HashMap<String, String>();
		param.put(key1, value1);
		param.put(key2, value2);
		param.put(key3, value3);
		
		return param;
	}
	
	public static String doPost(String urlString, Map<String, String> nameValuePairs)
			throws IOException {
		URL url = new URL(urlString);//先new出一個URL地址,定位網絡資源
		URLConnection connection = url.openConnection();//打開連接
		connection.setDoOutput(true);//使能往遠程寫操作

		//把建立的http的連接流返回給PrintWriter
		try (PrintWriter out = new PrintWriter(connection.getOutputStream())) {
		
			boolean first = true;
			for (Map.Entry<String, String> pair : nameValuePairs.entrySet()) {
				if (first)
					first = false;
				else
					out.print('&');
				String name = pair.getKey().toString();
				String value = pair.getValue().toString();
				out.print(name);
				out.print('=');
				out.print(URLEncoder.encode(value, "UTF-8"));
			}
			
		}
		//下面的代碼是去接收服務器端的反饋信號,將返回的信號全都存放在response這個對象中,
		看一下api文檔的StringBuilder類,就明白下面的代碼了

		StringBuilder response = new StringBuilder();
		try (Scanner in = new Scanner(connection.getInputStream())) {
			while (in.hasNextLine()) {
				response.append(in.nextLine());
				response.append("\n");
			}
		} catch (IOException e) {
			if (!(connection instanceof HttpURLConnection))
				throw e;
			InputStream err = ((HttpURLConnection) connection).getErrorStream();
			if (err == null)
				throw e;
			Scanner in = new Scanner(err);
			response.append(in.nextLine());
			response.append("\n");
			in.close();
		}

		return response.toString();
	}

}

這樣一來,客戶端就已經寫好了。


二、服務器端

使用Servlet程序來做客戶端的接收處理,而負責調用Servlet的是Tomcat,所以先下載安裝好tomcat,其實特別簡單就是下載解壓然後放在某個目錄就好了。這裏有兩種啓動方式:

1、使用bin目錄下的腳本文件,Linux下用startup.sh 、 shutdown.sh,在Windows平臺下使用.bat後綴的腳本。

2、調試階段其實可以使用eclipse來輔助,新建一個Server,把tomcat關聯進去,百度一下有很多帶圖教程。

這裏重點是講Servlet端應該怎麼編寫:先上代碼

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.javafx.collections.MappingChange.Map;

public class Upload_html extends HttpServlet{

	@Override
	//客戶端的連接被封裝到request這個對象中,參數的提取也是從這個對象中拿
	//而反饋給客戶端的內容封裝在response這個對象中,比如返回數據也是通過這個對象來完成

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		response.setContentType("text/html");
		
		//將接收到的數據再返回給客戶端
		PrintWriter pw = response.getWriter();
		//使用方法getParameter來獲取鍵值對應的value值,這裏的Key參數要和客戶端傳上來的Key值一樣!	
		pw.println(request.getParameter("param1"));
		
		pw.println(request.getParameter("param2"));		
		pw.println(request.getParameter("param3"));
		
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		//跳轉到doGet當中去處理
		doGet(request, response);
	}

}


服務端配置:

    我這裏以手動配置爲例,不使用eclipse來輔助。

安裝好tomcat目錄結構如下:



進入webapps目錄:


新建一個文件夾test1,並在test1這個目錄下新建WEB-INF文件夾,並在WEB-INF文件夾下新建一個classes文件夾和web.xml文件


classes裏面保存編寫好的servlet文件的class文件,比如這裏就應該是Upload_html.class文件。另外,在編寫servlet文件的時候,會需要toncat安裝目錄下的一些jar包,主要是servlet-api.jar,目錄如下


另外關鍵的就是web.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" 
version="3.1">

  <display-name>test1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  
  
    <servlet>
  	<servlet-name>Upload_image</servlet-name>
  	<servlet-class>com.zhoucy.Upload_image</servlet-class>
  </servlet>
  <servlet-mapping>
 	<servlet-name>Upload_image</servlet-name> 
  	<url-pattern>/Upload_image</url-pattern>
  </servlet-mapping>
 
  
  <servlet>
  	<servlet-name>Upload_html</servlet-name>
  	<servlet-class>com.zhoucy.Upload_html</servlet-class>
  </servlet>
  <servlet-mapping>
 	<servlet-name>Upload_html</servlet-name> 
  	<url-pattern>/Upload_html</url-pattern>
  </servlet-mapping>
</web-app>
重點就是加紅的部分。


        <url-pattern>/Upload_html</url-pattern>這裏填的值Upload_html就是決定客戶端url的最後一個參數,
(千萬注意有一個斜槓“/”一定要填上的)相當就是說,客戶端運行以後,url就指定了Upload_html,
然後找到<servlet-name>Upload_html</servlet-name> ,再通過映射找到上面的兩行代碼
<servlet-name>Upload_html</servlet-name>  <servlet-class>com.zhoucy.Upload_html</servlet-class>,
最終找到com.zhoucy.Upload_html這個程序,我servlet代碼當中是有package封包的,如果沒有封包,那就直接程序名,
有封包就把包名也加上,當然.class文件也就得放在相應的包的路徑下。

        然後運行tomcat,客戶端再運行java代碼,注意把ip改好,就可以成功post數據到服務端了。



























發佈了44 篇原創文章 · 獲贊 36 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章