用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

把Object对象转换为XML

2012-11-30 作者: 程序猿style举报

[java]代码库

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;
import com.thoughtworks.xstream.io.xml.XppDriver;
 
/**
 *Module:       XML_OBJTOXML.java
 *Description:  报文的封装
 *Company:     
 *Author:       pantp
 *Date:         Feb 23, 2012
 */
 
/*
 * 用到的主要知识如下:
 * 1.BeanInfo/Introspector/PropertyDescriptor/Method的使用
 * 2.XStream.jar包相关类及方法的使用
 * 3.javabean
 */
 
/*
假设报文格式如下:
<user_info>
  <username>testuser</username>
  <password>password</password>
</user_info>
 */
 
/**
 * 定义一个javabean,实际开发中javabean是一个单独的类,这里为了方便就放在了一个类中
 * 实际开发中是先定义报文格式和字段,然后根据定义的报文建立javabean以及属性字段名称
 */
class UserInfo {
    // 此处的属性名称就是最后发送报文中的字段名称
    private String username;
    private String password;
 
    // 这几个类的使用时javabean的属性的类型不能有多种(如:String和int不能共存、但是int和long可以共存),否则后面会报异常
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
}
 
// =========================================【javabean定义完成】============================================================
 
public class XML_OBJTOXML {
 
    private static Map parameter = new HashMap();
    private static UserInfo userInfo = null;
 
    /**
     * 整合4个方法,提供一个程序的访问的接口
     *
     * @return
     * @throws Exception
     */
    public static String returnXML() throws Exception {
        /*
         * 1.放值到map对象中
         */
        putValue(parameter);
 
        /*
         * 2.把map中的值set到对应Object对象pt中
         */
        userInfo = new UserInfo();
        setBeanProperty(userInfo, parameter);
 
        /*
         * 3.采用object to xml 的方式封装xml字符串
         */
        String xml = getXML();
 
        /*
         * 4.释放资源
         */
        close();
 
        return xml;
    }
 
    /**
     * 放值到Map对象中
     *
     * @param parameter
     */
    private static void putValue(Map parameter) {
        /*
         * 实际开发中是查询数据库然后把相应的值put到Map的对象中, 但是此处的键key的值必须要和javabean中的字段名称一模一样,
         * 多一个空格,大小写不一样的话都不行,这样后面都没有办法把值set到对象中
         */
        parameter.put("username", "testuser");
        parameter.put("password", "123456");
    }
 
    /**
     * 把map中的值set到对应Object对象pt中
     *
     * @param pt
     * @param map
     * @throws Exception
     */
    private static void setBeanProperty(Object obj, Map map) throws Exception {
        /*
         * 全面地对类进行查询,返回一个我们可以进行详细研究以发现其属性、方法和事件的BeanInfo对象
         */
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        /*
         * BeanInfo 返回这些信息的方法如下: getBeanDescriptor():
         * 返回一个Bean叙词表(BeanDescriptor),包含bean的多方面信息(图标,显示名等)
         * getPropertyDescriptors(): 返回一属性叙词表,返回的每个元素是一个PropertyDescriptor对象
         * getMethodDescriptors(): 返回一方法叙词表 ,返回的每个元素是一个MethodDescriptor对象
         * getEventSetDescriptors(): 返回一事件集叙词表 ,返回的每个元素是一个EventSetDescriptor对象
         */
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for (int i = 0; i < pds.length; i++) {
            PropertyDescriptor pd = pds[i];
            Method methodGetX = pd.getWriteMethod();// getWriteMethod()获得应该用于写入属性值的方法
            if (map.containsKey(pd.getName())) {// pd.getName()的值即username、password
                String value = (map.get(pd.getName())) == null ? "" : map.get(
                        pd.getName()).toString();// 取得属性值
                if (value != null && value.trim() != "") {
                    /*
                     * Object invoke(Object obj, Object... args)
                     * 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法 obj - 从中调用底层方法的对象 args
                     * - 用于方法调用的参数 通俗点说就是,调用obj对象中value属性对应的set方法把值放入到obj对象中
                     */
                    methodGetX.invoke(obj, new Object[] { value });
                }
            }
        }
    }
 
    /**
     * 通过XStream类采用object to xml 的方式封装xml字符串
     *
     * @return
     */
    private static String getXML() {
        XStream xstream = new XStream(new XppDriver(new XmlFriendlyReplacer(
                "-_", "_")));// 用此种构造方法是为了去掉报文中下划线占两个字符的问题
 
        xstream.alias("user_info", UserInfo.class);// 设置别名
        // addImplicitCollection
 
        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\" encoding=\"gbk\"?>");
        sb.append("\n");
        sb.append(xstream.toXML(userInfo));
 
        return sb.toString();
    }
 
    /**
     * 释放Map对象中的资源
     */
    private static void close() {
        if (parameter != null && !parameter.isEmpty())
            parameter.clear();
    }
 
    // =========================================【报文封装完成】============================================================
 
    /**
     * 测试的main方法
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String result = returnXML();// 实际开发中,可以把这个返回值通过调用webservice接口或者是HTTP接口发送报文到交互的系统中
 
        // 打印看看结果
        System.out.println("================================\n");
        System.out.println(result);
        System.out.println("\n================================");
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...