两个Java项目,他们之间进行信息的通信
前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径。
其实两个java项目之间的通信还是使用HTTP的请求。主要有两种方式:
①使用apache的HttpClient方式。
②使用JDK自带的java.NET包下的HttpURLConnection方式。
HttpURLConnection方式:
HttpURLConnection传递请求常用的有两种方式:POST和GET方式。使用setRequestMethod()方法设置传递的方式。
HttpURLConnection方式详解:
Java原生的API可用于发送HTTP请求
即java.net.URL、java.net.URLConnection,JDK自带的类;
1.通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)
2.设置请求的参数
3.发送请求
4.以输入流的形式获取返回内容
5.关闭输入流
封装请求类:
HttpConnectionUtil
1 package com.util; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.OutputStreamWriter; 9 import java.net.HttpURLConnection; 10 import java.net.MalformedURLException; 11 import java.net.URL; 12 import java.net.URLConnection; 13 import java.util.Iterator; 14 import java.util.Map; 15 16 public class HttpConnectionUtil { 17 18 // post请求 19 public static final String HTTP_POST = "POST"; 20 21 // get请求 22 public static final String HTTP_GET = "GET"; 23 24 // utf-8字符编码 25 public static final String CHARSET_UTF_8 = "utf-8"; 26 27 // HTTP内容类型。如果未指定ContentType,默认为TEXT/HTML 28 public static final String CONTENT_TYPE_TEXT_HTML = "text/xml"; 29 30 // HTTP内容类型。相当于form表单的形式,提交暑假 31 public static final String CONTENT_TYPE_FORM_URL = "application/x-www-form-urlencoded"; 32 33 // 请求超时时间 34 public static final int SEND_REQUEST_TIME_OUT = 50000; 35 36 // 将读超时时间 37 public static final int READ_TIME_OUT = 50000; 38 39 /** 40 * 41 * @param requestType 42 * 请求类型 43 * @param urlStr 44 * 请求地址 45 * @param body 46 * 请求发送内容 47 * @return 返回内容 48 */ 49 public static String requestMethod(String requestType, String urlStr, String body) { 50 51 // 是否有http正文提交 52 boolean isDoInput = false; 53 if (body != null && body.length() > 0) 54 isDoInput = true; 55 OutputStream outputStream = null; 56 OutputStreamWriter outputStreamWriter = null; 57 InputStream inputStream = null; 58 InputStreamReader inputStreamReader = null; 59 BufferedReader reader = null; 60 StringBuffer resultBuffer = new StringBuffer(); 61 String tempLine = null; 62 try { 63 // 统一资源 64 URL url = new URL(urlStr); 65 // 连接类的父类,抽象类 66 URLConnection urlConnection = url.openConnection(); 67 // http的连接类 68 HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection; 69 70 // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 71 // http正文内,因此需要设为true, 默认情况下是false; 72 if (isDoInput) { 73 httpURLConnection.setDoOutput(true); 74 httpURLConnection.setRequestProperty("Content-Length", String.valueOf(body.length())); 75 } 76 // 设置是否从httpUrlConnection读入,默认情况下是true; 77 httpURLConnection.setDoInput(true); 78 // 设置一个指定的超时值(以毫秒为单位) 79 httpURLConnection.setConnectTimeout(SEND_REQUEST_TIME_OUT); 80 // 将读超时设置为指定的超时,以毫秒为单位。 81 httpURLConnection.setReadTimeout(READ_TIME_OUT); 82 // Post 请求不能使用缓存 83 httpURLConnection.setUseCaches(false); 84 // 设置字符编码 85 httpURLConnection.setRequestProperty("Accept-Charset", CHARSET_UTF_8); 86 // 设置内容类型 87 httpURLConnection.setRequestProperty("Content-Type", CONTENT_TYPE_FORM_URL); 88 // 设定请求的方法,默认是GET 89 httpURLConnection.setRequestMethod(requestType); 90 91 // 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。 92 // 如果在已打开连接(此时 connected 字段的值为 true)的情况下调用 connect 方法,则忽略该调用。 93 httpURLConnection.connect(); 94 95 if (isDoInput) { 96 outputStream = httpURLConnection.getOutputStream(); 97 outputStreamWriter = new OutputStreamWriter(outputStream); 98 outputStreamWriter.write(body); 99 outputStreamWriter.flush();// 刷新 100 } 101 if (httpURLConnection.getResponseCode() >= 300) { 102 throw new Exception( 103 "HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode()); 104 } 105 106 if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 107 inputStream = httpURLConnection.getInputStream(); 108 inputStreamReader = new InputStreamReader(inputStream); 109 reader = new BufferedReader(inputStreamReader); 110 111 while ((tempLine = reader.readLine()) != null) { 112 resultBuffer.append(tempLine); 113 resultBuffer.append("\n"); 114 } 115 } 116 117 } catch (MalformedURLException e) { 118 e.printStackTrace(); 119 } catch (IOException e) { 120 e.printStackTrace(); 121 } catch (Exception e) { 122 e.printStackTrace(); 123 } finally {// 关闭流 124 125 try { 126 if (outputStreamWriter != null) { 127 outputStreamWriter.close(); 128 } 129 } catch (Exception e) { 130 e.printStackTrace(); 131 } 132 try { 133 if (outputStream != null) { 134 outputStream.close(); 135 } 136 } catch (Exception e) { 137 e.printStackTrace(); 138 } 139 try { 140 if (reader != null) { 141 reader.close(); 142 } 143 } catch (Exception e) { 144 e.printStackTrace(); 145 } 146 try { 147 if (inputStreamReader != null) { 148 inputStreamReader.close(); 149 } 150 } catch (Exception e) { 151 e.printStackTrace(); 152 } 153 try { 154 if (inputStream != null) { 155 inputStream.close(); 156 } 157 } catch (Exception e) { 158 e.printStackTrace(); 159 } 160 } 161 return resultBuffer.toString(); 162 } 163 164 /** 165 * 将map集合的键值对转化成:key1=value1&key2=value2 的形式 166 * 167 * @param parameterMap 168 * 需要转化的键值对集合 169 * @return 字符串 170 */ 171 public static String convertStringParamter(Map parameterMap) { 172 StringBuffer parameterBuffer = new StringBuffer(); 173 if (parameterMap != null) { 174 Iterator iterator = parameterMap.keySet().iterator(); 175 String key = null; 176 String value = null; 177 while (iterator.hasNext()) { 178 key = (String) iterator.next(); 179 if (parameterMap.get(key) != null) { 180 value = (String) parameterMap.get(key); 181 } else { 182 value = ""; 183 } 184 parameterBuffer.append(key).append("=").append(value); 185 if (iterator.hasNext()) { 186 parameterBuffer.append("&"); 187 } 188 } 189 } 190 return parameterBuffer.toString(); 191 } 192 193 public static void main(String[] args) throws MalformedURLException { 194 195 System.out.println(requestMethod(HTTP_GET, "http://127.0.0.1:8080/TestHttpRequestServlet", 196 "username=123&password=我是谁")); 197 198 } 199 }
测试Servlet
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class TestHttpRequestServelt extends HttpServlet { 11 12 13 /** 14 * 15 */ 16 private static final long serialVersionUID = 1L; 17 18 @Override 19 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20 21 System.out.println("this is a TestHttpRequestServlet"); 22 request.setCharacterEncoding("utf-8"); 23 24 String username = request.getParameter("username"); 25 String password = request.getParameter("password"); 26 27 System.out.println(username); 28 System.out.println(password); 29 System.err.println("BBBBBBBBBBBBOOOOOOOOOOOO"); 30 31 response.setContentType("text/plain; charset=UTF-8"); 32 response.setCharacterEncoding("UTF-8"); 33 response.getWriter().write("This is ok!"); 34 35 } 36 }
web.xml配置
1 <!-- BO测试中。。。多平台之间消息推送 --> 2 <display-name>test</display-name> 3 <servlet> 4 <servlet-name>TestHttpRequestServlet</servlet-name> 5 <servlet-class>com.servlet.TestHttpRequestServelt</servlet-class> 6 </servlet> 7 <servlet-mapping> 8 <servlet-name>TestHttpRequestServlet</servlet-name> 9 <url-pattern>/TestHttpRequestServlet</url-pattern> 10 </servlet-mapping> 11 <!-- BO 测试中。。。 -->