用java怎么实现与浏览器的数据交互:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java怎么实现与浏览器的数据交互:相关的知识,希望对你有一定的参考价值。

简单意思就是用java开发的cs应用小程序的一个数据怎么传到IE浏览器页面.
cs应用小程序和IE浏览器(jsp)页面是没有关联的。怎么把cs应用程序的string值传到jsp页面的input下面的text文本框里面。
如图
难道是我的意思没表达清楚吗?怎么大家全部都理解错了。
1、cs小程序监听到的称重数据是不进数据库的,小程序和IE交互数据这中间是没牵涉到数据库,所以请大家不要往数据库方面向;
2、web系统(jsp)是买的,供应商不提供代码,所以jsp是没办法改的,所以请大家别再用request.setAttribute()这个方法了;
3、其实很简单就是cs程序和jsp页面交互数据的一个功能。

看看java.net.HttpURLConnection这个类的用法,能够达到你的要求:
下面是一个例子:

1. package com.sw.study.urlConnection;
2.
3. import java.io.BufferedReader;
4. import java.io.InputStreamReader;
5. import java.io.OutputStream;
6. import java.net.HttpURLConnection;
7. import java.net.URL;
8. import java.net.URLConnection;
9. import java.util.HashMap;
10. import java.util.Map;
11.
12. public class URLConnectionUtil
13.
14. private static final String SERVLET_POST = "POST" ;
15. private static final String SERVLET_GET = "GET" ;
16. private static final String SERVLET_DELETE = "DELETE" ;
17. private static final String SERVLET_PUT = "PUT" ;
18.
19. private static String prepareParam(Map<String,Object> paramMap)
20. StringBuffer sb = new StringBuffer();
21. if(paramMap.isEmpty())
22. return "" ;
23. else
24. for(String key: paramMap.keySet())
25. String value = (String)paramMap.get(key);
26. if(sb.length()<1)
27. sb.append(key).append("=").append(value);
28. else
29. sb.append("&").append(key).append("=").append(value);
30.
31.
32. return sb.toString();
33.
34.
35.
36. public static void doPost(String urlStr,Map<String,Object> paramMap ) throws Exception
37. URL url = new URL(urlStr);
38. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
39. conn.setRequestMethod(SERVLET_POST);
40. String paramStr = prepareParam(paramMap);
41. conn.setDoInput(true);
42. conn.setDoOutput(true);
43. OutputStream os = conn.getOutputStream();
44. os.write(paramStr.toString().getBytes("utf-8"));
45. os.close();
46.
47. BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
48. String line ;
49. String result ="";
50. while( (line =br.readLine()) != null )
51. result += "\n"+line;
52.
53. System.out.println(result);
54. br.close();
55.
56.
57.
58. public static void doGet(String urlStr,Map<String,Object> paramMap ) throws Exception
59. String paramStr = prepareParam(paramMap);
60. if(paramStr == null || paramStr.trim().length()<1)
61.
62. else
63. urlStr +="?"+paramStr;
64.
65. System.out.println(urlStr);
66. URL url = new URL(urlStr);
67. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
68. conn.setRequestMethod(SERVLET_PUT);
69. conn.setRequestProperty("Content-Type","text/html; charset=UTF-8");
70.
71. conn.connect();
72. BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
73. String line ;
74. String result ="";
75. while( (line =br.readLine()) != null )
76. result += "\n"+line;
77.
78. System.out.println(result);
79. br.close();
80.
81.
82. public static void doPut(String urlStr,Map<String,Object> paramMap) throws Exception
83. URL url = new URL(urlStr);
84. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
85. conn.setRequestMethod(SERVLET_PUT);
86. String paramStr = prepareParam(paramMap);
87. conn.setDoInput(true);
88. conn.setDoOutput(true);
89. OutputStream os = conn.getOutputStream();
90. os.write(paramStr.toString().getBytes("utf-8"));
91. os.close();
92.
93. BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
94. String line ;
95. String result ="";
96. while( (line =br.readLine()) != null )
97. result += "\n"+line;
98.
99. System.out.println(result);
100. br.close();
101.
102.
103.
104. public static void doDelete(String urlStr,Map<String,Object> paramMap) throws Exception
105. String paramStr = prepareParam(paramMap);
106. if(paramStr == null || paramStr.trim().length()<1)
107.
108. else
109. urlStr +="?"+paramStr;
110.
111. System.out.println(urlStr);
112. URL url = new URL(urlStr);
113. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
114. conn.setDoOutput(true);
115. conn.setRequestMethod(SERVLET_DELETE);
116. //屏蔽掉的代码是错误的,java.net.ProtocolException: HTTP method DELETE doesn't support output
117. /* OutputStream os = conn.getOutputStream();
118. os.write(paramStr.toString().getBytes("utf-8"));
119. os.close(); */
120.
121. if(conn.getResponseCode() ==200)
122. System.out.println("成功");
123. else
124. System.out.println(conn.getResponseCode());
125.
126.
127.
128. public static void main(String[] args) throws Exception
129. String urlStr = "http://localhost:8080/SwTest/ReceiveDataServlet";
130. Map<String,Object> map = new HashMap<String,Object>();
131. map.put("username","张三");
132. map.put("password","88888");
133. // URLConnectionUtil.doGet(urlStr, map);
134. // URLConnectionUtil.doPost(urlStr, map);
135. // URLConnectionUtil.doPut(urlStr, map);
136. URLConnectionUtil.doDelete(urlStr, map);
137.
138.
139.
140.
141. 追问

大哥,下次别再这样回答问题了,好吗?

追答

你仔细研究一下程序没??这娃真笨。。

参考技术A 那继续先把String 保存到文件或数据库下,jsp在去读取就行了追问

你理解错了,java的cs小程序和ie浏览器jsp页面中间是没有牵涉到数据库的。

参考技术B 先将String值 request.setAttribute(),再从界面得到追问

因为web系统是买过来的,供应商不提供代码。所以jsp页面里面不能修改

参考技术C 调win32API 获取句柄 赋值追问

java 没有实现,最终还是通过C#实现了。

参考技术D 找一下response对象的使用方法追问

唉,无语。

Go语言入门篇-gRPC基于golang & java简单实现

一.什么是RPC

1.简介:

RPC:Remote Procedure Call,远程过程调用。简单来说就是两个进程之间的数据交互。

正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者自身调用的,也就是本地过程调用。

和本地过程调用相对的就是:假如两个服务端不在一个进程内怎么进行数据交互?使用RPC。

尤其是现在微服务的大量实践,服务与服务之间的调用不可避免,RPC更显得尤为重要。

2.原理:

计算机的世界中不管使用哪种技术,核心都是对数据的操作。RPC不过是将数据的操作垮了一个维度而已。

解决的问题本质上只是数据在不同进程间的传输。我们所说的RPC一般是指在传输层使用TCP协议进行的数据交互,

也有很多基于HTTP的成熟框架。

gRPC调用如下图所示:

上图描述了一个RPC的完整调用流程:

1:client向client stub发起方法调用请求。

2:client stub接收到请求后,将方法名,请求参数等信息进行编码序列化。

3:client stub通过配置的ip和端口使用socket通过网络向远程服务器server发起请求。

4:远程服务器server接收到请求,解码反序列化请求信息。

5:server将请求信息交给server stub,server stub找到对应的本地真实方法实现。

6:本地方法处理调用请求并将返回的数据交给server stub。

7:server stub 将数据编码序列化交给操作系统内核,使用socket将数据返回。

8:client端socket接收到远程服务器的返回信息。

9:client stub将信息进行解码反序列化。

10:client收到远程服务器返回的信息。

上图中有一个stub(存根)的概念。

stub负责接收本地方法调用,并将它们委托给各自的具体实现对象。

server端stub又被称为skeleton(骨架)。可以理解为代理类。而实际上基于Java的RPC框架stub基本上也都是使用动态代理。

我们所说的client端和server端在RPC中一般也都是相对的概念。

而所谓的RPC框架也就是封装了上述流程中2-9的过程,让开发者调用远程方法就像调用本地方法一样。

二.常用的RPC框架选型

  • Dubbo:

    阿里开源的基于TCP的RPC框架,基本上是国内生产环境应用最广的开发框架了。使用zookeeper做服务的注册与发现,使用Netty做网络通信。遗憾的是不能跨语言,目前只支持Java。

  • Thrift:

    Facebook开源的跨语言的RPC框架,通过IDL来定义RPC的接口和数据类型,使用thrift编译器生成不同语言的实现。据说是目前性能最好的RPC框架,只是暂没使用过。

  • gRPC:

    这个是我们今天要聊的重点。gRPC是Google的开源产品,是跨语言的通用型RPC框架,使用Go语言编写。 Java语言的应用同样使用了Netty做网络通信,Go采用了Goroutine做网络通信。序列化方式采用了Google自己开源的Protobuf。请求的调用和返回使用HTTP2的Stream。

  • SpringCloud:

    SpringCloud并不能算一个RPC框架,它是Spring家族中一个微服务治理的解决方案,是一系列框架的集合。但在这个方案中,微服务之间的通信使用基于HTTP的Restful API,使用Eureka或Consul做服务注册与发现,使用声明式客户端Feign做服务的远程调用。这一系列的功能整合起来构成了一套完整的远程服务调用。

如何选择

如果公司项目使用Java并不牵扯到跨语言,且规模并没有大到难以治理,我推荐Dubbo。如果项目规模大,服务调用错综复杂,我推荐SpringCloud。

如果牵扯到跨语言,我推荐gRPC,这也是目前我司的选择。即使Thrift性能是gRPC的2倍,但没办法,它有个好爹,现在我们的开发环境考虑最多的还是生态,不得不向Google爸爸臣服。

三.gRPC原理

一个RPC框架必须有两个基础的组成部分:数据的序列化和进程数据通信的交互方式。

对于序列化gRPC采用了自家公司开源的Protobuf。什么是Protobuf?先看一句网络上 大部分的解释:

Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。

上句有几个关键点:它是一种数据存储格式,跨语言,跨平台,用于通讯协议和数据存储。

这么看和我们熟悉的JSON类似,但其实着重点有些本质的区别:

JSON主要是用于数据的传输,因为它轻量级,可读性好,解析简单。

Protobuf主要是用于跨语言的IDL,它除了和JSON、XML一样能定义结构体之外,还可以使用自描述格式定于出接口的特性,

             并可以使用针对不同语言的protocol编译器产生不同语言的stub类。所以天然的适用于跨语言的RPC框架中。

而关于进程间的通讯,无疑是Socket。Java方面gRPC同样使用了成熟的开源框架Netty。使用Netty Channel作为数据通道。传输协议使用了HTTP2。

通过以上的分析,我们可以将一个完整的gRPC流程总结为以下几步:

  • 通过.proto文件定义传输的接口和消息体。
  • 通过protocol编译器生成server端和client端的stub程序。
  • 将请求封装成HTTP2的Stream。
  • 通过Channel作为数据通信通道使用Socket进行数据传输。

四.gRPC的简单实现

项目需求:

go调用java传递请求参数,并接收java返回的数据。(项目中本人采用http方式建立go&java连接

为了体现gRPC跨语言的特性,我们使用两种语言:Go实现server端,Java作为client端来实现

1。安装Protocol Buffers,定义.proto文件

Step1:登录Google的 github下载对应Protocol Buffers版本 (本人下载all)

Step2:安装Protocol Buffer

参考博文:手把手教你如何安装Protocol Buffer

// Step1:安装 Protocol Buffer 依赖
// 注:Protocol Buffer 依赖于  autoconf、automake、libtool、curl
brew install autoconf automake libtool curl

// Step2:进入 Protocol Buffer安装包 解压后的文件夹(我的解压文件放在桌面)
cd Desktop/protobuf-3.6.1

// Step3:运行 autogen.sh 脚本
./autogen.sh

// Step4:运行 configure.sh 脚本
 ./configure

// Step5:编译未编译的依赖包
 make

// Step6:检查依赖包是否完整
 make check

// Step7:开始安装Protocol Buffer
make install

Step3:检查Protocol Buffer是否安装成功

// 在 终端 下输入
protoc - - version

执行protoc命令如果返回如下信息说明安装成功

 

未完待绪。。。。

 

参考文章:gRPC基于golang和java的简单实现

以上是关于用java怎么实现与浏览器的数据交互:的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot数据库交互之Spring Data JPA

androidwebview加载本地js怎么实现交互

用Java模拟多线程下的客户端与服务端数据交互

web前端的javascript主要用于交互吗

vue3和c#怎么交互

VB.NET 服务器与客户端数据交互问题?