一直也想把自己做过的东西记录下来,可是,一直都忙,没有时间(其实是自己懒,嘿嘿),今天终于下定决心,开始行动,最近刚做一个关于机票电子商务网站,接触到了与支付平台交互的东西,其实,理论上来讲这是个SO EASY的,就是调用支持平台API,然后,传入参数,支付平台返回结果,然后在自己的数据库里一堆Update。其实今天我就想说说,在调用支付平台API时怎么样才能简单方便地传入参数,
我接触的支付平台,调用API时需要传入XML格式的参数,返回的也是XML格式的数据,参数格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<MasMessage xmlns="http://www.XXX.com/mas_cnp_merchant_interface">
<version>1.0</version>
<TxnMsgContent>
<txnType>PUR</txnType>
<interactiveStatus>TR1</interactiveStatus>
<cardNo>XXXXXXXXXXXXX</cardNo>
<expiredDate>0811</expiredDate>
<cvv2>123</cvv2>
<amount>100</amount>
<merchantId>XXXXXXXXXX</merchantId>
<terminalId>XXXXX</terminalId>
<cardHolderName>测试</cardHolderName>
<cardHolderId>130928198310000004</cardHolderId>
<entryTime>20090330153345</entryTime>
<externalRefNumber>PUR_NET985534</externalRefNumber>
<customerId />
</TxnMsgContent>
</MasMessage>
上面的内容不必细说,反正就是一堆的参数,我是这样做的组织参数的,首先做一个Bean,Bean的属性是XML中的每个结点名,如下:
public class PURTR1XMLMessage{
//交易类型: PUR=实时消费,PRE=预授权(3位定长字母字符)
private String txnType;
//消息状态:值为TR1(3位定长字母字符)
private String interactiveStatus;
//信用卡号(最长19个字节(数字字符))
private String cardNo;
//卡有效期(4位定长数字字符;格式为MMYY)
private String expiredDate;
//卡校验码(3位定长数字字符)
private String cvv2;
//交易金额(最长12位、2位小数点的数字)
private String amount;
//商务号,此号为测试用(客户端应可配置)
private String merchantId;
//终端号,此号为测试用(客户端应可配置)(定长8位的字母和数字字符)
private String terminalId;
//持卡人姓名(最长32个字节(字母和数字字符),可为中文)
private String cardHolderName;
//持卡人证件号(最长32个字节(字母和数字字符))
private String cardHolderId;
//客户端交易时间(14位定长的数字字符,格式为yyyyMMddHHmmss)
private String entryTime;
//应用端订单号(32位数字和字母)
private String externalRefNumber;
//客户号(为空)
private String customerId ;
public PURTR1XMLMessage() {
}
public String getTxnType() {
return txnType;
}
public void setTxnType(String txnType) {
this.txnType = txnType;
}
public String getInteractiveStatus() {
return interactiveStatus;
}
public void setInteractiveStatus(String interactiveStatus) {
this.interactiveStatus = interactiveStatus;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public String getExpiredDate() {
return expiredDate;
}
public void setExpiredDate(String expiredDate) {
this.expiredDate = expiredDate;
}
public String getCvv2() {
return cvv2;
}
public void setCvv2(String cvv2) {
this.cvv2 = cvv2;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getMerchantId() {
return merchantId;
}
public void setMerchantId(String merchantId) {
this.merchantId = merchantId;
}
public String getTerminalId() {
return terminalId;
}
public void setTerminalId(String terminalId) {
this.terminalId = terminalId;
}
public String getCardHolderName() {
return cardHolderName;
}
public void setCardHolderName(String cardHolderName) {
this.cardHolderName = cardHolderName;
}
public String getCardHolderId() {
return cardHolderId;
}
public void setCardHolderId(String cardHolderId) {
this.cardHolderId = cardHolderId;
}
public String getEntryTime() {
return entryTime;
}
public void setEntryTime(String entryTime) {
this.entryTime = entryTime;
}
public String getExternalRefNumber() {
return externalRefNumber;
}
public void setExternalRefNumber(String externalRefNumber) {
this.externalRefNumber = externalRefNumber;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
}
然后呢,我又写了一个类,把这个bean变成XML,代码如下:
public class PURModel {
public static String beanToXml(Object bean) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
java.lang.reflect.Field[] flds = bean.getClass().getDeclaredFields();
String fieldXML = getClassFields(flds, bean);
StringBuffer queryXML = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
"<MasMessage xmlns=\"http://www.XXX.com/mas_cnp_merchant_interface\">"+
"<version>1.0</version>");
if (bean instanceof PURTR1XMLMessage){
queryXML.append("<TxnMsgContent>");
queryXML.append(fieldXML);
queryXML.append("</TxnMsgContent></MasMessage>");
}
else if(bean instanceof PURTR3XMLMessage){
queryXML.append("<QryTxnMsgContent>");
queryXML.append(fieldXML);
queryXML.append("</QryTxnMsgContent></MasMessage>");
}
return queryXML.toString();
}
private static String getClassFields(java.lang.reflect.Field[] flds,Object msg) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
String xml = "";
if(flds != null){
for(int i = 0;i < flds.length; i++ ){
String getMethod="get"+ flds[i].getName().substring(0, 1).toUpperCase() + flds[i].getName().substring(1);
Class[] methodParam = null;
Object[] params = {};
Object retValue = null;
//这里就是调用Bean的get方法,很爽哦,适合写在基类里!!!
retValue = msg.getClass().getMethod(getMethod, methodParam).invoke(msg, params);
if(retValue == null){
xml = xml+ "<"+flds[i].getName()+"/>";
}
else{
xml = xml+ "<"+flds[i].getName()+">"+retValue+ "</"+flds[i].getName()+">";
}
}
}
return xml;
}
这样只需要把Bean传进来,就可以自动遍历Bean的属性,组织成XML,遍历Bean属性利用了类的反射原理
PS:
getDeclaredFields(): 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组
分享到:
相关推荐
- 例如,一个简单的示例可能是创建一个XML文档,通过调用`Document`类的`createInstance()`方法,然后使用XMLBean生成的Java类来设置XML元素和属性。 4. XMLBean的主要功能: - XML到Java对象的映射:XMLBean能...
JSTL,全称为JavaServer Pages Standard Tag Library,是Java EE平台中一个用于简化JSP开发的库,它提供了一系列预定义的标签,帮助开发者在JSP页面上进行数据处理、控制流程、XML操作等任务,从而降低对脚本语言的...
java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 ...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
在生成测试页面时,可以利用反射遍历Bean类的所有属性,为每个属性创建输入字段和提交按钮。 3. **JSP(JavaServer Pages)**:JSP是一种用于创建动态Web内容的技术,可以用于生成HTML页面。在测试页面中,JSP可以...
JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...
java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java ...
- **使用JAXB(Java Architecture for XML Binding)**:JAXB是Java标准API,可以自动将Java对象转换为XML和从XML反序列化为Java对象。只需为JavaBean添加适当的注解,然后使用JAXBContext和Marshaller进行转换。 ...
### Java面试知识点总结——EJB详解 #### 一、EJB技术概述 EJB(Enterprise JavaBeans)是一种Java EE标准,用于开发企业级应用程序。它提供了构建可伸缩、健壮且易于维护的企业应用程序的方法。 #### 二、...
首先,Java提供了两种主要的API来处理XML:DOM(文档对象模型)和SAX(简单API for XML)。DOM解析器会将整个XML文件加载到内存中,形成一个树形结构,适合处理小到中等规模的XML文档。而SAX解析器采用事件驱动的...
首先,dom4j是一个强大的Java XML API,它提供了丰富的功能,如读取、写入、修改和操作XML文档。其核心概念是Element(元素)、Attribute(属性)和Document(文档)。通过这些对象,我们可以方便地处理XML文档的...
- **FacesServlet**:JSF的核心控制器,负责处理HTTP请求,解析请求参数,调用生命周期方法,并生成响应。 - **Lifecycle**:JSF的生命周期包括六个阶段:恢复视图、应用请求值、校验、更新模型、调用应用程序和...
### Java技术面试 ---- 框架 #### 一、Mybatis #{} 和 ${} 的区别 在 Mybatis 中,#{} 和 ${} 是用来处理 SQL 语句中的动态参数的两种方式。 - **#{}**:这种方式可以有效地避免 SQL 注入问题。它的工作原理是将...
将XML数据转换为Java实体类(Bean)以及将实体类转换回XML是两个重要的操作,这对于数据的序列化和反序列化至关重要。下面将详细解释这两个过程以及涉及的相关知识点。 首先,XML转实体类的过程通常涉及到Java的...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在各种软件开发中,特别是在Java平台上。XML的设计目标是传输和存储数据,而非显示数据,因此它与HTML(HyperText Markup Language)有着本质...
- 使用JAXB(Java Architecture for XML Binding):JAXB是Java平台的标准API,用于在Java对象和XML之间进行绑定。首先,你需要为JavaBean创建对应的XML Schema(XSD)文件,然后使用JAXB工具自动生成JavaBean类。...
在IT行业中,构建一个能够递归生成XML树的系统是一项常见的任务,特别是在处理复杂的数据结构时。本项目结合了Spring、iBatis和JDom这三个强大的技术,它们各自扮演着不同的角色来实现这一目标。 首先,Spring是一...
3. Java与XML的结合:Java提供了多种API来处理XML,如DOM(文档对象模型)、SAX(简单API for XML)和DOM4J等。DOM将整个XML文档加载到内存中形成一棵树形结构,适合小规模数据处理;SAX是事件驱动模型,只在解析时...