`
ducklsl
  • 浏览: 24794 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

工作中多个项目之间数据传递

阅读更多
最近工作中碰到一个工作需求,需要两个系统进行数据交互,把一个系统中的相关数据传递到另外一个系统中去。
阐明一下当时的一个环境:
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的方法进行传递
分享到:
评论

相关推荐

    数据库之间的数据传递

    在IT行业中,数据库之间的数据传递是一项常见的任务,特别是在企业级应用中,可能需要将数据从一个数据库系统迁移到另一个,或者实现跨系统的数据同步。在这个场景中,我们使用Java编程语言来实现MySQL与SQL Server...

    C# 两个窗体之间实时传递数据的实例

    在这个实例中,我们将探讨如何在两个窗体之间实现实时的数据传递,主要采用委托和事件的技术。这种方式可以确保数据的安全性,避免了直接引用导致的问题。 首先,我们需要理解委托和事件的基本概念。在C#中,委托是...

    窗口之间数据传递

    在VC++中,窗口之间数据传递是一个关键的编程概念,熟练掌握DDX和可能的扩展(如DDX2)能提高开发效率,确保程序的稳定性和用户体验。通过深入理解这些机制,开发者可以构建出更加灵活和健壮的应用程序。

    C#_winform_多个窗体之间相互传递数据操作

    在C# WinForm应用开发中,经常需要在多个窗体之间进行数据交互,以便实现信息的传递和更新。本文将详细讲解如何在不同窗体之间有效地传递数据,并提供实际操作的示例。 首先,理解窗体(Form)是WinForm应用程序的...

    MFC 多线程之间通过消息传递数据

    要实现多线程间的数据传递,我们需要利用Windows的消息机制。在Windows操作系统中,消息队列是线程安全的,这使得它成为线程间通信的一个理想选择。每个窗口都有自己的消息队列,当一个线程发送消息到另一个线程的...

    matlab GUI 多界面数据传递的实例

    通过研究这些例子,你可以更深入地理解如何在MATLAB GUI中实现多界面的数据传递,以及如何在实际项目中灵活运用`guidata(hObject,handles)`和输出函数。 总的来说,理解和掌握MATLAB GUI中的数据传递技巧是构建复杂...

    javafx显示多个窗口以及javafx多窗口之间数据交互传输项目原文件

    在这个“javafx显示多个窗口以及javafx多窗口之间数据交互传输项目原文件”中,我们可以学习到如何在JavaFX中创建并管理多个窗口,以及在这些窗口之间进行数据的交换和传递。 1. **创建JavaFX窗口** 在JavaFX中,...

    可在两个程序之间传递数据

    在IT领域,程序之间的数据传递是一项基础且至关重要的任务,特别是在多进程或多线程编程、分布式系统以及组件式软件开发中。标题“可在两个程序之间传递数据”和描述“有两个模块,一个发送数据;一个接收数据”所...

    窗口之间传递数据.rar

    在Windows应用程序开发中,窗口之间的数据传递是一个常见的需求。这通常涉及到多个窗体(Form)间的交互,例如用户在其中一个窗体中输入信息,然后希望这些信息能够在另一个窗体中被使用或显示。本篇文章将深入探讨...

    C#多窗体之间数据传递

    委托允许我们将方法作为参数传递,或者存储在一个变量中,使得我们可以灵活地调用这些方法,这正是我们在多窗体数据传递中需要的功能。 在多窗体应用中,通常有两种常见的数据传递方式:使用公共属性或者使用事件和...

    kettle实现多参数传递并且循环加载数据.zip

    在Kettle中,可以通过命令行参数、环境变量或者调用API的方式传递多个参数。在脚本或程序中调用Kettle时,可以使用`--param:参数名=参数值`的方式传递多个参数。 3. **循环加载数据**: Kettle中的“循环”通常由...

    Qt窗体间传递数据的三种模型

    Qt的属性系统允许对象的属性之间进行绑定,这在窗口间数据传递中也非常有用。例如,你可以将一个窗体的属性(如文本框的文本)绑定到另一个窗体的属性,实现数据的实时同步。 ```cpp // 窗体A的属性 QObject::...

    通过触摸屏实现1200PLC和1500PLC之间的数据传递.docx

    本主题将详细探讨如何通过触摸屏实现1200PLC和1500PLC之间的数据传递,这对于多PLC系统间的交互至关重要。 首先,确保触摸屏具备与多个PLC通信的能力。在本例中,我们使用的是TP1200 Comfort触摸屏,它支持同时与S7...

    LabVIEW中引用的概念及在VI间传递值

    - 在多个VI之间共享数据结构,如数组或簇。 - 实现动态数据流,如在连续的数据处理链中。 - 在大型应用程序中更新全局状态,如配置设置或缓冲区。 总结来说,理解并熟练运用LabVIEW中的引用和通过引用传递值是优化...

    iPhone窗口之间传递数据

    本文将详细解析《iPhone窗口之间传递数据》这一主题,深入探讨多种有效的数据传递方法,帮助开发者更好地理解和掌握iOS中的数据传递机制。 ### 一、通过UIApplication共享数据 在iOS应用中,UIApplication对象是...

    C#窗体之间数据传递

    在C# .NET编程中,窗体间的数据传递是一个常见的任务,特别是在开发具有多个界面的桌面应用程序时。本文将深入探讨如何在不同窗体之间传递数据,帮助初学者更好地理解和应用这一关键概念。 首先,我们要了解窗体...

    对话框之间的数据传递.rar

    在多个对话框之间进行数据传递是一个常见的需求,特别是在开发复杂的应用程序时。本教程将深入探讨如何在Visual Studio 2015环境下,利用窗口句柄(Window Handle)实现对话框之间的数据交换。 首先,了解窗口句柄...

    Flex 对象调用之间的 数据传递 包括 页面调用之间的数据传递 -

    总的来说,Flex中的数据传递是一个复杂而重要的主题,涉及到组件通信、事件处理、数据管理等多个方面。通过理解和掌握这些技术,开发者可以创建出功能丰富、交互性强的Flex应用程序。在实际项目中,应根据需求选择最...

    案例一 GUI数据传递和多窗口编程.zip

    在GUI(图形用户界面)编程中,数据传递和多窗口管理是两个至关重要的概念。本案例将探讨如何在不同窗口之间有效地传递数据以及如何构建和管理多个窗口的应用程序。我们将主要关注以下几个方面: 1. **数据传递机制...

    C# 不同Form之间值的传递

    在C#编程中,Form是Windows应用程序中用户界面的基本组件,常常需要在多个Form之间传递数据。本篇文章将深入探讨三种常见的在不同Form之间传递值的方法:公共变量、窗口调用以及构造函数。 1. 公共变量 公共变量是...

Global site tag (gtag.js) - Google Analytics