前言:
一般來說表單數據是在網頁前端上面實現,在對應框內填入數據,點擊提交按鈕即將數據傳遞給後臺(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數據到服務端了。