前言:
一般来说表单数据是在网页前端上面实现,在对应框内填入数据,点击提交按钮即将数据传递给后台(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 sendParam() {
//这里用来存放键值对,为了程序看起来简单就手动输上去了
String key1 = "param1";
String value1 = "1";
String key2 = "param2";
String value2 = "14";
String key3 = "param3";
String value3 = "334";
HashMap param = new HashMap();
param.put(key1, value1);
param.put(key2, value2);
param.put(key3, value3);
return param;
}
public static String doPost(String urlString, Map 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 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的配置:
test1
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
Upload_image
com.zhoucy.Upload_image
Upload_image
/Upload_image
Upload_html
com.zhoucy.Upload_html
Upload_html
/Upload_html
重点就是加红的部分。
(千万注意有一个斜杠“/”一定要填上的)相当就是说,客户端运行以后,url就指定了Upload_html,
然后找到
最终找到com.zhoucy.Upload_html这个程序,我servlet代码当中是有package封包的,如果没有封包,那就直接程序名,
有封包就把包名也加上,当然.class文件也就得放在相应的包的路径下。
然后运行tomcat,客户端再运行java代码,注意把ip改好,就可以成功post数据到服务端了。