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 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目录结构如下:

java 代码post表单数据到服务器,servlet接收处理_第1张图片


进入webapps目录:

java 代码post表单数据到服务器,servlet接收处理_第2张图片

新建一个文件夹test1,并在test1这个目录下新建WEB-INF文件夹,并在WEB-INF文件夹下新建一个classes文件夹和web.xml文件

java 代码post表单数据到服务器,servlet接收处理_第3张图片

classes里面保存编写好的servlet文件的class文件,比如这里就应该是Upload_html.class文件。另外,在编写servlet文件的时候,会需要toncat安装目录下的一些jar包,主要是servlet-api.jar,目录如下

java 代码post表单数据到服务器,servlet接收处理_第4张图片

另外关键的就是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
  

重点就是加红的部分。


        /Upload_html这里填的值Upload_html就是决定客户端url的最后一个参数,
(千万注意有一个斜杠“/”一定要填上的)相当就是说,客户端运行以后,url就指定了Upload_html,
然后找到Upload_html ,再通过映射找到上面的两行代码
Upload_html  com.zhoucy.Upload_html
最终找到com.zhoucy.Upload_html这个程序,我servlet代码当中是有package封包的,如果没有封包,那就直接程序名,
有封包就把包名也加上,当然.class文件也就得放在相应的包的路径下。

        然后运行tomcat,客户端再运行java代码,注意把ip改好,就可以成功post数据到服务端了。



























你可能感兴趣的:(JavaWeb基础)