最近工作中碰到一个工作需求,需要两个系统进行数据交互,把一个系统中的相关数据传递到另外一个系统中去。
阐明一下当时的一个环境:
1)公司有两个系统,一个是订单处理系统,一个是库存系统;订单处理系统放在公司机房内部,而库存系统放在公司总部机房,不在同一局域网。
2)订单系统获取到相关库存数据,包括产品数据、库位、数量等,依据订单的相关信息,进行产品比对,发货等等操作
由于工作经验有限,在此之前没有碰到过类似的情况。接到任务后,我第一时间想到的是把这些数据用OutputStream给输出到浏览器中,这样既可以在浏览器中查看,也可以获取到这些信息进行解析,这样对项目的结构调整也不大。后来由于项目慢慢的要做些调整和优化之后,利用这个时机就把这个需求通过WebService给实现了。孰优孰劣按我的经验暂时无法判断,不过个人还是比较喜欢WebService。
第一种方法:把信息写入OutputStream中去
1.以XML的方式进行输出
1)DAO查询数据
// 分页查询
public List<Barcodegoods> queryBarcodegoodsByPage(String page,
String pageSize) {
Integer current;//当前页码
Integer pageCount;//每页条数
if (page != null && !"".equals(page)) {
current = Integer.valueOf(page);
} else {
current = currentpage;
}
if (pageSize != null && !"".equals(pageSize)) {
pageCount = Integer.valueOf(pageSize);
} else {
pageCount = pagesize;
}
StringBuffer buffer = new StringBuffer();
buffer.append("select * from barcodegoods ");
buffer.append("limit ");
buffer.append((current - 1) * pageCount);
buffer.append(",");
buffer.append(pageCount);
String sql = buffer.toString();
List<Barcodegoods> bgs = new ArrayList<Barcodegoods>();
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
pstmt = conn.prepareStatement(sql);
res = pstmt.executeQuery();
Barcodegoods bg = null;
while (res.next()) {
bg = new Barcodegoods();
bg.setBarcode(res.getString("barcode"));
bg.setColorid(res.getString("colorid"));
bg.setGoods_no(res.getString("goods_no"));
bg.setSize(res.getString("size"));
bgs.add(bg);
}
} catch (SQLException e) {
e.printStackTrace();
}
return bgs;
}
2)输出XML格式信息
public void createXml(List<Barcodegoods> list, PrintWriter out) {
Document document = DocumentHelper.createDocument();
Element stocks = document.addElement("stocks");// 创建根节点
Barcodegoods bean = null;
for (int i = 0; i < list.size(); i++) {
bean = list.get(i);
Element stock = stocks.addElement("stock");
Element barcode = stock.addElement("barcode");
Element goodsNo = stock.addElement("goods_no");
Element colorid = stock.addElement("colorid");
Element size = stock.addElement("size");
barcode.setText(bean.getBarcode());
goodsNo.setText(bean.getGoods_no());
colorid.setText(bean.getColorid());
size.setText(bean.getSize());
}
// 输出
try {
OutputFormat format = new OutputFormat(" ", true);
format.setEncoding("gb2312");
// 输出创建的xml文档
XMLWriter output = new XMLWriter(out, format);
output.write(document);
out.flush();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
利用了Dom4j当中的XMLWriter类包装PrintWriter进行输出
3)编写请求响应的Servlet,利用Servlet进行响应输出XML内容
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();//获取PrintWriter
String current = "1";//当前页码
String pageSize = "20";//每页总数
String page = request.getParameter("page");
if(page!=null){
String parray[] = page.split(",");
current = parray[0];
pageSize = parray[1];
}
String checkCode = request.getParameter("checkcode");
if("passing".equals(checkCode)){
response.setContentType("text/xml;charset=gb2312");//内容类型和字符集
response.setHeader("Cache-Control", "no-cache");//响应头
XmlApi api = new XmlApi();
List<Barcodegoods> bgs = api.queryBarcodegoods(current, pageSize);
api.createXml(bgs, out);
}else{
out.print("check failed!!!");
return;
}
out.flush();
out.close();
}
可以命令请求时需要带参数,并且参数验证通过后才给与返回,不然就不接受请求!
浏览器的请求地址为:
http://localhost:8083/webdemo/XmlApiServlet?checkcode=passing&page=1,5结果为:
<stocks>
<stock>
<barcode>FL009620010110</barcode>
<goods_no>FL00962</goods_no>
<colorid>0010</colorid>
<size>110</size>
</stock>
<stock>
<barcode>B622180202200</barcode>
<goods_no>B622180</goods_no>
<colorid>2022</colorid>
<size>00</size>
</stock>
<stock>
<barcode>B622180107100</barcode>
<goods_no>B622180</goods_no>
<colorid>1071</colorid>
<size>00</size>
</stock>
<stock>
<barcode>BB13150203900</barcode>
<goods_no>BB13150</goods_no>
<colorid>2039</colorid>
<size>00</size>
</stock>
<stock>
<barcode>BB13150222000</barcode>
<goods_no>BB13150</goods_no>
<colorid>2220</colorid>
<size>00</size>
</stock>
</stocks>
结果正确可以正常显示库存信息
4)用JAVA的方式来获取此库存信息
public static void main(String[] args) throws Exception {
URL url = new URL( "http://localhost:8083/webdemo/XmlApiServlet?checkcode=passing");
URLConnection conn = url.openConnection();
conn.setDoInput(true);//默认也是true。如果设置成false,这无法读取InputStream
InputStream in = conn.getInputStream();
SAXReader reader = new SAXReader();
List<List<String>> list = new ArrayList<List<String>>();
List<String> list1 = null;
Document document = reader.read(in);//通过IO流产生Document对象
Element stocks = document.getRootElement();//获取根元素
for (Iterator i = stocks.elementIterator(); i.hasNext();) {//遍历Stock节点
list1 = new ArrayList();//一个Stcok中的所有属性
Element stock = (Element) i.next();// 获得每个stock
for (Iterator j = stock.elementIterator(); j.hasNext();) {//遍历Stock节点下的属性节点
Element node = (Element) j.next();// 获得每个stock中的属性
list1.add(node.getText());// 把属性存放到List1中
}
list.add(list1);//存放所有的stock的信息
}
//存放数据
List<Barcodegoods> bars = new ArrayList<Barcodegoods>();
Barcodegoods goods = null;
for(List<String> data : list){
goods = new Barcodegoods();//new出barcodegoods对象,为它赋值
goods.setBarcode(data.get(0));
goods.setGoods_no(data.get(1));
goods.setColorid(data.get(2));
goods.setSize(data.get(3));
bars.add(goods);
}
//输出产品的条形码
for(Barcodegoods b :bars){
System.out.println(b.getBarcode());
}
}
通过获取连接中的InputStream,来解析XML。
2.以JSON的方式输出
1)产生JSON的类方法
//构造JSON字符串
public String makeJsonString(List<Barcodegoods> list) {
if (list != null && list.size() > 0) {
List<JSONObject> objects = new ArrayList<JSONObject>();
Map<String, JSONObject> omap = new HashMap<String, JSONObject>();
Map<String,String> map = null;//JSON对象每个属性
for(Barcodegoods bg : list){
map = new HashMap<String, String>();
map.put("barcode", bg.getBarcode());
map.put("goodsno", bg.getGoods_no());
map.put("colorid", bg.getColorid());
map.put("size", bg.getSize());
JSONObject jobj = JSONObject.fromObject(map);//将每个MAP转换成key-value的JSON对象
objects.add(jobj);//存放所有的JSON对象
}
Map<String,Object> olists = new HashMap<String, Object>();//
olists.put("barcodegoods", objects.toArray());//把Barcodegoods当做key,把objects当做value
olists.put("status", "success");//添加status属性
JSONObject obj = JSONObject.fromObject(olists);//转化成JSON
//return obj.toString();
omap.put("message", obj);
return omap.toString();
}else{
return "failed";
}
}
JSON数据的构成可以依据需求进行构造,只要符合业务需求的数据构造就可以了
2)输出JSON的Servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
String page = request.getParameter("page");
String current = "1";// 当前页
String pageSize = "10";// 每页总数
if (page != null) {// 判断是否自定义分页
String[] pages = page.split(",");
if (pages.length == 2) {//两个参数缺一不可
current = pages[0];
pageSize = pages[1];
}
}
String checkcode = request.getParameter("checkcode");// 验证参数
if ("passing".equals(checkcode)) {// 判断验证参数
JsonApi api = new JsonApi();
List<Barcodegoods> bgs = api.queryBarcodegoods(current, pageSize);// 查询数据
String jsonString = api.makeJsonString(bgs);// 构造JSON字符串
out.print(jsonString);// 输出JSON字符串
} else {
out.print("check failed");
}
}
可以命令请求时需要带参数,并且参数验证通过后才给与返回,不然就不接受请求!
浏览器的请求地址为:
http://localhost:8083/webdemo/JsonApiServlet?checkcode=passing&page=1,5结果为:
{message={"barcodegoods":[{"goodsno":"FL00962","colorid":"0010","barcode":"FL009620010110","size":"110"},{"goodsno":"B622180","colorid":"2022","barcode":"B622180202200","size":"00"},{"goodsno":"B622180","colorid":"1071","barcode":"B622180107100","size":"00"},{"goodsno":"BB13150","colorid":"2039","barcode":"BB13150203900","size":"00"},{"goodsno":"BB13150","colorid":"2220","barcode":"BB13150222000","size":"00"}],"status":"success"}}
3)JAVA解析输出的数据
public static void main(String[] args) throws Exception {
URL url = new URL( "http://localhost:8083/webdemo/JsonApiServlet?checkcode=passing"); URLConnection conn = url.openConnection();
conn.setDoInput(true);// 默认也是true。如果设置成false,这无法读取InputStream
InputStream in = conn.getInputStream();
byte[] b = new byte[1024];
int length = 0;
StringBuffer buffer = new StringBuffer();
while((length=in.read(b))>0){
buffer.append(new String(b,0,length));//读取JSON字符串
}
JSONObject json = JSONObject.fromObject(buffer.toString());//转换为JSON对象
JSONObject message = json.getJSONObject("message");//获取Message属性
JSONArray barcodegoods = message.getJSONArray("barcodegoods");//获取barcodegoods集合属性
List<Barcodegoods> bgs = new ArrayList<Barcodegoods>();
Barcodegoods bg = null;
for(int i=0;i<barcodegoods.size();i++){//遍历集合
bg = new Barcodegoods();
JSONObject goods = barcodegoods.getJSONObject(i);//遍历集合中的json对象
bg.setBarcode(goods.getString("barcode"));//获取值,并且赋值
bg.setColorid(goods.getString("colorid"));
bg.setGoods_no(goods.getString("goodsno"));
bg.setSize(goods.getString("size"));
bgs.add(bg);
}
for(Barcodegoods bs : bgs){
System.out.println(bs.getBarcode());
}
}
这个是当时的做法,后来由于其他原因,就改成了WebService的方法进行传递
分享到:
相关推荐
显示多窗口管理文章http://blog.csdn.net/miniduhua/article/details/71190747
C#多个类之间进行值传递的方法实现,有多种不同的方法可以实现
“如何在Swift 2.0中的iOS 9视图之间传递数据”视频演示了如何将数据直接传递到目标视图控制器,以及如何使用协议将数据传递回源视图控制器。 该视频使用Swift 2.0和iOS 9 您可以上找到更多iOS视频入门该代码是一个...
在很多公司,一个产品或项目往往涉及到多个部门的分工协作,由于缺乏通用的项目管理平台,大家彼此之间使用的工具都比较散乱,导致信息传递不对称、团队协作低效,同时还缺乏项目成果的积累和沉淀。此次新版渠成将...
训练数据被输入到神经网络中,通过前向传播算法将数据从输入层传递到输出层,然后计算网络输出结果与实际标签之间的差异,即损失函数。通过反向传播算法,网络参数会被调整以减小损失函数值,直到误差达到一定的阈值...
数据传递 该项目是使用版本11.2.1生成的。 开发服务器 为开发服务器运行ng serve 。 导航到http://localhost:4200/ 。 如果您更改任何源文件,该应用程序将自动重新加载。 代码脚手架 运行ng generate component ...
经常会遇到在一个activity界面上布局... * 定义地接口,用于fragment和activity之间的数据传递 */ public interface onClickShopListner{ public void setOnClickShopListner(int index); } 2、重写fragment的onAt
【资源说明】 1、该资源包括项目的全部...游戏服务端主要存储所有连线客户的相关信息及各种状态,并负责游戏客户之间数据的传递,具有连接服务器、挑战、传送聊天信息等等功能;游戏客户端提 供客户连接服务器).zip
数据分析报告的 7 个模块 一份完整的数据分析报告,通常包括 7 个模块,但这些模块并非一成不变,不同的领导、不同的客户、不同的数据,都有可能会影响到数据分析报告最终呈现出来的结果,不同模块所花费的时间和...
【资源说明】 1、该资源内项目代码都是...游戏服务端主要存储所有连线客户的相关信息及各种状态,并负责游戏客户之间数据的传递,具有连接服务器、挑战、传送聊天信息等等功能;游戏客户端提 供客户连接服务器).zip
业务管理要求按流程操作,同一个业务的不同流程之间数据详解紧密; 提供多种业务的汇总报表,统计时间段自定义,可区分代理商和普通用户业务数据; 统计分析图要求直观、形象、美观,为公司高层管理者提供有效的决策...
迭代传递数据样本并计算损失,然后通过反向传播更新模型参数。重复此过程多次以提高模型性能。 模型评估:使用测试集对训练好的模型进行评估。计算准确率、精确度、召回率等指标来评估模型在面部表情识别任务上的...
数据分析师专业数据分析报告撰写规范 数据分析报告的重要性在数据分析师的工作中不言而喻,数据分析报告是数据分析的 展现形式,是完成数据分析的最后一步,是支持决策的依托。即便有些人前期分析都进 行非常好,但...
KV项目下载底层重构升级决定采用独立进程进行Media下载处理,以能做到模块复用之目的,因此涉及到了独立进程间的数据传递问题。 目前进程间数据传递,多用WM_COPYDATA、共享dll、内存映射、Remoting等方式。相对来说...
在这个项目中,我们可以使用Asp.Net中的SingalR在用户之间提供即时消息传递。 简要说明SignalR; 它是为开发实时应用程序而编写的开源.NET库。 它是用于将数据实时传递到连接的客户端的库。 有关更多信息,Github...
渠成2.0Alpha1版本的特点:支持复杂和多层级的项目管理在很多公司,一个产品或项目往往涉及到多个部门的分工协作,由于缺乏通用的项目管理平台,大家彼此之间使用的工具都比较散乱,导致信息传递不对称、团队协作...
训练数据被输入到神经网络中,通过前向传播算法将数据从输入层传递到输出层,然后计算网络输出结果与实际标签之间的差异,即损失函数。通过反向传播算法,网络参数会被调整以减小损失函数值,直到误差达到一定的阈值...
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,...
训练数据被输入到神经网络中,通过前向传播算法将数据从输入层传递到输出层,然后计算网络输出结果与实际标签之间的差异,即损失函数。通过反向传播算法,网络参数会被调整以减小损失函数值,直到误差达到一定的阈值...
'到Excel中处理,如何有效快速地在AutoCAD与Excel之间传递数据成为影响工作效率的关键。CadAssis '在AutoCAD与Excel之间架起一座桥梁,轻松实现AutoCAD与Excel之间的数据交换。 ' CadAssis目前主要有以下六个功能: ...