分享
 
 
 

数据绑定

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

数据绑定这个名词对于大多数程序员已经不再陌生了;Java语言(面向对象)已经被证明是一种非常适合数据绑定的语言。我们再看看数据绑定的另一个端即数据媒介,通常有文本文件,XML文件,以及数据库。正如文章提及的大多数程序员理解的数据绑定是XML文档和Java程序结构的关系,其实这仅仅是这两端的一个具体应用。

几个重要概念:

编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。

解组(Unmarshalling)是把数据从存储媒介转换到内存中的过程——正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。

往返(Round-tripping)可能是最重要也最容易误解的数据绑定术语。往返用于描述从存储媒介到内存然后回到存储媒介的完整循环。在 XML 和 Java 技术环境中,这就意味着从 XML 文档到 Java 实例变量,然后再回到 XML 文档。正确的往返要求,如果中间没有修改数据,XML 输入和 XML 输出应该是等同的。

几个数据绑定框架:

Castor 框架:

Castor XML 数据绑定很容易上手,甚至不需要定义 XML 文档格式。只要您的数据用类 JavaBean 的对象表示,Castor 就能自动生成表示这些数据的文档格式,然后从文档重构原始数据。

用一个例子(Castor)来说明:Jbuilder中调试

This bean was auto generated from a schema

清单 1. XmlEmployeeType信息 bean

package com.borland.samples.xml.databinding.castor;

import java.io.IOException;

import java.io.Reader;

import java.io.Serializable;

import java.io.Writer;

import org.exolab.castor.xml.MarshalException;

import org.exolab.castor.xml.Marshaller;

import org.exolab.castor.xml.Unmarshaller;

import org.exolab.castor.xml.ValidationException;

import org.xml.sax.ContentHandler;

/**

* Class XmlEmployeeType.

* @version $Revision$ $Date$

*/

public class XmlEmployeeType implements java.io.Serializable {

private java.lang.String _empNo;

private java.lang.String _firstName;

private java.lang.String _lastName;

private java.lang.String _phoneExt;

private java.lang.String _hireDate;

private java.lang.String _deptNo;

private java.lang.String _jobCode;

private java.lang.String _jobGrade;

private java.lang.String _jobCountry;

private java.lang.String _salary;

private java.lang.String _fullName;

public XmlEmployeeType() {

super();

}

public java.lang.String getDeptNo()

{

return this._deptNo;

}

public java.lang.String getEmpNo()

{

return this._empNo;

}

public java.lang.String getFirstName()

{

return this._firstName;

}

public java.lang.String getFullName()

{

return this._fullName;

}

public java.lang.String getHireDate()

{

return this._hireDate;

}

public java.lang.String getJobCode()

{

return this._jobCode;

} tJobCode()

public java.lang.String getJobCountry()

{

return this._jobCountry;

}

public java.lang.String getJobGrade()

{

return this._jobGrade;

}

public java.lang.String getLastName()

{

return this._lastName;

}

public java.lang.String getPhoneExt()

{

return this._phoneExt;

}

public java.lang.String getSalary()

{

return this._salary;

} //-- java.lang.String getSalary()

public boolean isValid()

{

try {

validate();

}

catch (org.exolab.castor.xml.ValidationException vex) {

return false;

}

return true;

}

public void marshal(java.io.Writer out)

throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException

{

Marshaller.marshal(this, out);

}

public void marshal(org.xml.sax.ContentHandler handler)

throwsjava.io.IOException,org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException

{

Marshaller.marshal(this, handler);

}

public void setDeptNo(java.lang.String deptNo)

{

this._deptNo = deptNo;

}

public void setEmpNo(java.lang.String empNo)

{

this._empNo = empNo;

}

public void setFirstName(java.lang.String firstName)

{

this._firstName = firstName;

} //-- void setFirstName(java.lang.String)

public void setFullName(java.lang.String fullName)

{

this._fullName = fullName;

} //-- void setFullName(java.lang.String)

public void setHireDate(java.lang.String hireDate)

{

this._hireDate = hireDate;

} //-- void setHireDate(java.lang.String)

public void setJobCode(java.lang.String jobCode)

{

this._jobCode = jobCode;

} //-- void setJobCode(java.lang.String)

public void setJobCountry(java.lang.String jobCountry)

{

this._jobCountry = jobCountry;

} //-- void setJobCountry(java.lang.String)

public void setJobGrade(java.lang.String jobGrade)

{

this._jobGrade = jobGrade;

} //-- void setJobGrade(java.lang.String)

public void setLastName(java.lang.String lastName)

{

this._lastName = lastName;

} //-- void setLastName(java.lang.String)

public void setPhoneExt(java.lang.String phoneExt)

{

this._phoneExt = phoneExt;

} //-- void setPhoneExt(java.lang.String)

public void setSalary(java.lang.String salary)

{

this._salary = salary;

} //-- void setSalary(java.lang.String)

public static java.lang.Object unmarshal(java.io.Reader reader)

throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException

{

Return(com.borland.samples.xml.databinding.castor.XmlEmployeeType) Unmarshaller.unmarshal(com.borland.samples.xml.databinding.castor.XmlEmployeeType.class, reader);

} //-- java.lang.Object unmarshal(java.io.Reader)

public void validate()

throws org.exolab.castor.xml.ValidationException

{

org.exolab.castor.xml.Validator validator = new org.exolab.castor.xml.Validator();

validator.validate(this);

} //-- void validate()

}

清单 2. 测试默认的数据绑定

/**

* Title: XML Tutorial

* Description: XML Tutorial for JBuilder

* Company: Borland Software Coporation

* @author

* @version 1.0

*/

import java.io.*;

import org.exolab.castor.xml.*;

public class DB_Castor {

public DB_Castor() {

}

public static void main(String[] args) {

try {

String fileName = "Employees.xml";

System.out.println("== unmarshalling \"" + fileName + "\" ==");

//Unmarshal XML file.

XmlEmployeesxmlEmployees = (XmlEmployees)XmlEmployees.unmarshal(new FileReader(fileName));

System.out.println("TotalNumber of XmlEmployees read = " + xmlEmployees.getXmlEmployeeCount());

System.out.println("FirstXmlEmployee's Full Name is " + xmlEmployees.getXmlEmployee(0).getFullName());

System.out.println("LastXmlEmployee's Full Name is " + xmlEmployees.getXmlEmployee(xmlEmployees.getXmlEmployeeCount()-1).getFullName());

// Add an XmlEmployee.

xmlEmployees.addXmlEmployee(getXmlEmployee("8000","400","Charlie","Castor","3/3/2001","VP","USA","2","1993","155000.00"));

// Modify the last XmlEmployee.

xmlEmployees.setXmlEmployee(xmlEmployees.getXmlEmployeeCount()-1, getXmlEmployee("8000","600","Peter","Castor","3/3/2001","VP","USA","3","2096","125000.00"));

// Marshal out the data to the same XML file.

xmlEmployees.marshal(new java.io.FileWriter(fileName));

}

catch (Exception ex) {

ex.printStackTrace();

}

}

private static XmlEmployee getXmlEmployee(String XmlEmployeeNumber,String departmentNumber,String firstName,String lastName,String hireDate,String jobCode,String jobCountry,String jobGrade,String phoneExt,String salary){

XmlEmployee xmlEmployee = new XmlEmployee();

xmlEmployee.setEmpNo(XmlEmployeeNumber);

xmlEmployee.setDeptNo(departmentNumber);

xmlEmployee.setFirstName(firstName);

xmlEmployee.setLastName(lastName);

xmlEmployee.setFullName(lastName+", "+firstName);

xmlEmployee.setHireDate(hireDate);

xmlEmployee.setJobCode(jobCode);

xmlEmployee.setJobCountry(jobCountry);

xmlEmployee.setJobGrade(jobGrade);

xmlEmployee.setPhoneExt(phoneExt);

xmlEmployee.setSalary(salary);

return xmlEmployee;

}

}

最后,看看运行的效果;XML是不是变化了;此篇仅仅描述了一个Castor框架,还有JAXB(Sun的框架);以及其他开源的框架需要不断的去学习。

参考资料:http://www-900.ibm.com/developerWorks/cn/xml/theme/x-pracdb.shtml

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有