xml-->bean,bean-->xml

本文介绍了一款用于Java环境中实现Bean与XML文件互相转换的实用工具类。该工具适用于需要与C++进行交互的场景,通过XML作为数据交换格式,提供了从Bean到XML及从XML到Bean的转换方法。

  由于要和c++交互,就采用了简单的xml数据交换格式,根据需要封装了从xml到bean,和bean到xml,只供参考,不能测试。

package com.dbs.core.util;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.dom4j.Element;
import org.dom4j.Node;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.dbs.qbzb.service.dao.ShiftService;

public class XmlBeanConvertUtil {

 
 private static final Log log = LogFactory.getLog(XmlBeanConvertUtil.class);
 
 private static  ShiftService shiftService;
 private static  final String domain_package = "com.dbs.qbzb.domain";
 private static  final String domain_package_dot = "com.dbs.qbzb.domain.";
 
 static {
  log.debug("开始初始化shiftService...");
  ApplicationContext conn = new ClassPathXmlApplicationContext(
    new String[] { "classpath:applicationContext-*.xml",
      "classpath:datasource-context.xml" });
  shiftService = (ShiftService) conn.getBean("shiftService");//来自dao层,根据需要所加,设计中应该去掉,已达到正真的util
 }
 
 /*
  * 用于 genenateXml()方法 从对象中得到值,以生成xml
  */
 public static String getFieldValue(Object objValue, String name) {
  StringBuffer xml = new StringBuffer();
  if (objValue instanceof java.util.Set) {
   xml.append("<" + name + ">");
   Set list = (Set) objValue;
   if (list == null || list.size() == 0) { // 如果是集合就递归
   } else {
    for (Iterator iterator = list.iterator(); iterator.hasNext();) {
     Object object = (Object) iterator.next();
     xml.append(generateXML(object));
    }
   }
   xml.append("</" + name + ">");
  }
  
  else if(objValue!=null&&objValue.getClass().getPackage().getName().equals(domain_package)){
   xml.append(generateXML(objValue));
  }if(objValue==null){
   xml.append("<" + name + ">");
   xml.append("</" + name + ">");
  }
  else if (objValue instanceof java.util.Date) { // 处理时间类型
   xml.append("<" + name + ">");
   java.util.Date valueDate = (java.util.Date) objValue;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
   xml.append(formatter.format(valueDate));
   xml.append("</" + name + ">");
  } else if (objValue instanceof String) {
   xml.append("<" + name + ">");
   xml.append(objValue);
   xml.append("</" + name + ">");
  } else if (objValue instanceof Integer) {
   xml.append("<" + name + ">");
   xml.append(String.valueOf(objValue));
   xml.append("</" + name + ">");
  }
  
  return xml.toString();
 }

 /**
  * 生成xml
  */
 public static String generateXML(Object object) {
  Class cls_class = object.getClass();
  String cls_str = cls_class.toString();
  String objname = cls_str.substring(cls_str.lastIndexOf(".") + 1,
    cls_str.length());// 得到类名称,包含前缀
  StringBuffer xml = new StringBuffer();
  xml.append("<" + objname + ">");
  Field[] fields = cls_class.getDeclaredFields(); // 得到成员属性名称,不包含前缀
  String name = "";
  try {
   for (int i = 0; i < fields.length; i++) {
    name = fields[i].getName();
    if (name.equals("serialVersionUID")) { // 如果是序列号就去掉
     continue;
    }
    Object objValue = PropertyUtils.getProperty(object, name); // 得到属性值
    xml.append(getFieldValue(objValue, name));
   }

  } catch (Exception e) {
   log.error("在"+object+"中没有找到属性名为"+name+"的方法...", e);
  }
  xml.append("</" + objname + ">");
  return xml.toString();
 }

 /*
  * 生成bean
  */
 public static Object generateBean(Element strXML) {
  String name = "";
  String type = "";
  String classname = "";
  Object object = null;
  try {
   classname = domain_package_dot + strXML.getName();
   object = Class.forName(classname).newInstance();
   List<Element> e_array = strXML.elements();
   for (Iterator iterator = e_array.iterator(); iterator.hasNext();) {
    {
     Element element = (Element) iterator.next();
     name = element.getName();
     log.debug("查询到方法节点名"+name);
     type = PropertyUtils.getPropertyType(object, name.toLowerCase())
       .getName();
     object = newObjectByType(object, type, name, element);
    }
   }
  } catch (Exception e) {
   log.error(classname+"不存在或者在"+classname+"中没有找到属性名:"+name.toLowerCase(), e);
  }
  return object;
 }

 /**
  * 根据参数给类赋值
  * @param object
  * @param type
  * @param field_name
  * @param element
  * @return
  */
 private static Object newObjectByType(Object object, String type,
   String field_name, Element element) {
  try {
   if (type.endsWith("java.lang.String")) {      //处理String类型

    PropertyUtils
      .setProperty(object, field_name, element.getText());
   } else if (type.endsWith("java.lang.Integer")) {   //处理integer
    System.out.println(type.endsWith("java.lang.Integer"));
    PropertyUtils.setProperty(object, field_name, Integer
      .parseInt(element.getText()));
   } else if (type.endsWith("java.util.Set")) {
    Set set = new HashSet();//处理set
    List<Element> e_list = element.elements();
    for (Iterator iterator = e_list.iterator(); iterator.hasNext();) {
     Element object2 = (Element) iterator.next();
     generateBean(object2);
     set.add(generateBean(object2));
     PropertyUtils.setProperty(object, field_name, set);
    }
   }else if(type.startsWith(domain_package)){
    if(getBeanById(element)!=null){
    Class cls = Class.forName(domain_package_dot+element.getName());
    PropertyUtils.setProperty(object, field_name.toLowerCase(), cls.cast(getBeanById(element)));
    }
   }
  } catch (Exception e) {
   log.error(domain_package_dot+element.getName()+"类不存在", e);
  }
  return object;
 }

 private static Object getBeanById(Element e) throws Exception {
  Object object = null;
  Node node = e.selectSingleNode("//id");
  log.debug("没有找到属性"+e.getName()+"的id");
  if(node!=null){
   Integer id = Integer.parseInt(node.getText());
   object =  shiftService.getObjectById(Class.forName(domain_package_dot+e.getName()),id);
  }
  return object;
 }

 /**
  * 生成最终xml,加上头
  * @param args
  */
 public static String beanToXml(Object object){
  String xml = "<?xml version='1.0' encoding='UTF-8'?>"
   + generateXML(object);
  log.debug("生成最终xml:"+xml);
  return xml;
 }
 
}

Java Web应用中,`faces-config.xml` 是 JavaServer Faces (JSF) 框架的核心配置文件之一。它用于定义应用程序的全局设置、导航规则、托管Bean、转换器、验证器以及国际化相关的资源等。对于使用 PrimeFaces 的项目,此文件可能包含与 PrimeFaces 组件库相关的特定配置。 下面是一个典型的 `faces-config.xml` 配置片段,并对其进行解释: ```xml <?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd" version="2.3"> <!-- 定义一个托管Bean --> <managed-bean> <managed-bean-name>userBean</managed-bean-name> <managed-bean-class>com.example.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <!-- 设置国际化资源包 --> <application> <resource-bundle> <base-name>com.example.messages</base-name> <var>msg</var> </resource-bundle> <!-- 如果使用了PrimeFaces的主题或组件特性,可以在这里进行相关配置 --> <default-render-kit-id>org.primefaces.renderkit.PartialResponseRenderKit</default-render-kit-id> </application> <!-- 导航规则(可选) --> <navigation-rule> <from-view-id>/login.xhtml</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/welcome.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config> ``` ### 解释 - **`<managed-bean>`**:定义了一个 JSF 托管 Bean,`userBean` 是其名称,`com.example.UserBean` 是其实现类,作用域为 `session`,表示该 Bean 在用户的整个会话期间有效。 - **`<resource-bundle>`**:配置了国际化资源包。`base-name` 指向资源文件的基本路径(例如 `messages.properties`, `messages_zh_CN.properties`),而 `var` 则是在页面中引用这些资源时使用的变量名(如 `#{msg.welcome}`)[^1]。 - **`<default-render-kit-id>`**:指定了默认的渲染工具包 ID。如果使用 PrimeFaces,则通常需要将此值设置为 `org.primefaces.renderkit.PartialResponseRenderKit` 以启用其 AJAX 支持和高级组件功能 [^1]。 - **`<navigation-rule>`**:定义了从 `/login.xhtml` 页面根据不同的结果(如 `success`)跳转到 `/welcome.xhtml` 页面的导航逻辑。虽然现代 JSF 应用更倾向于通过返回字符串控制导航,但旧版本或某些框架集成仍可能依赖这种 XML 配置方式 [^1]。 --- ### 使用示例 假设你有一个简单的登录表单,其中包含用户名输入框和提交按钮,可以通过以下方式访问托管 Bean 和国际化消息: ```xhtml <h:form> <h:outputLabel value="#{msg.username}" for="username"/> <h:inputText id="username" value="#{userBean.username}"/> <h:commandButton value="#{msg.submit}" action="#{userBean.login}"/> </h:form> ``` 在这个例子中: - `#{msg.username}` 和 `#{msg.submit}` 分别从 `messages.properties` 文件中获取对应的本地化文本。 - `#{userBean.username}` 和 `#{userBean.login}` 分别绑定到 `UserBean` 类中的属性和方法 。 --- ### 相关问题 1. 如何在 JSF 中实现多语言支持? 2. PrimeFaces 提供了哪些常用的 UI 组件? 3. 如何自定义 JSF 托管 Bean 的生命周期? 4. 怎样在 JSF 应用中集成 Spring Boot? 5. 如何处理 JSF 页面之间的导航?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值