(NIO-框架)--Netty(四)http+xml协议栈的开发

书上有关用ant加上JIBX去绑定java class文件和xml文件这段讲的太少了,而且还不全,我又没用过ant还有JIBX,我尝试了很多次才成功实现了ant基于build.xml去绑定二者的功能,为了避免大家和我遇到一样的问题,我把这一部分粘出来,大家可以做个参考

这是build.xml,没用过ant很多东西都是瞎搞出来的,这个build.xml是我去那本书的源码上拷贝了一份,就书上那点屁用没有

<?xml version="1.0"?>

<!-- ===================================================================

Ant build file for JiBX data binding code to schema starter example.

=================================================================== -->
<project basedir="." default="full">
  <available file="/lib/jibx-bind.jar" property="jibx-home" value=""/>
  <property environment="env"/>
  <condition property="jibx-home" value="${env.JIBX_HOME}">
    <and>
      <not>
        <isset property="jibx-home"/>
      </not>
      <available file="${env.JIBX_HOME}/lib"/>
    </and>
  </condition>
  <!-- End of jibx-home location setting block. -->
  
  <!-- make sure required jars are present -->
  <condition property="runtime-jars-found">
    <available file="${jibx-home}/lib/jibx-run.jar"/>
  </condition>
  <condition property="binding-jars-found">
    <and>
      <available file="${jibx-home}/lib/bcel.jar"/>
      <available file="${jibx-home}/lib/jibx-bind.jar"/>
      <available file="${jibx-home}/lib/jibx-run.jar"/>
    </and>
  </condition>
  <available property="extras-jar-found" file="${jibx-home}/lib/jibx-extras.jar"/>
  
  <!-- set classpath for compiling and running application with JiBX -->
  <path id="classpath">
    <fileset dir="${jibx-home}/lib" includes="*.jar"/>
    <pathelement location="bin"/>
  </path>
  
  <!-- make sure runtime jars are present -->
  <target name="check-runtime">
  	<echo message="-------------->${env.JIBX_HOME}"></echo>
    <fail unless="jibx-home">JiBX home directory not found - define JIBX_HOME system property or set path directly in build.xml file.</fail>
    <fail unless="runtime-jars-found">Required JiBX runtime jar jibx-run.jar was not found in JiBX home lib directory (${jibx-home}/lib)</fail>
  </target>
  
  <!-- make sure extras jars are present -->
  <target name="check-extras" depends="check-runtime">
    <fail unless="extras-jar-found">Required JiBX extras jar jibx-extras.jar was not found in JiBX home lib directory (${jibx-home}/lib)</fail>
  </target>
  
  <!-- make sure binding jars are present -->
  <target name="check-binding" depends="check-runtime">
    <fail unless="binding-jars-found">Required JiBX binding jar jibx-bind.jar or bcel.jar was not found in JiBX home lib directory (${jibx-home}/lib)</fail>
  </target>
  
  <!-- clean compiled class files and output file -->
  <target name="clean">
    <delete quiet="true" dir="${basedir}/bin/com/phei/netty/protocol/http/xml/pojo"/>
    <delete quiet="true" file="${basedir}/binding.xml"/>
    <delete quiet="true">
      <fileset dir="${basedir}" includes="out*.xml"/>
      <fileset dir="${basedir}" includes="*.xsd"/>
    </delete>
  </target>
  
  <!-- compile the classes -->
  <target name="compile" depends="clean,check-runtime">
    <echo message="Compiling Java source code"/>
    <delete quiet="true" dir="${basedir}/bin/com/taikang/httpxml/domain"/>
    <mkdir dir="${basedir}/bin"/>
    <javac target="1.8" srcdir="${basedir}/src/main/java/com/taikang/httpxml/domain" destdir="${basedir}/bin" debug="on">
      <classpath refid="classpath"/>
    </javac>
  </target>
  
  <!-- generate default binding and schema -->
  <target name="bindgen">
    <echo message="Running BindGen tool"/>
    <java classpathref="classpath" fork= "true" failonerror="true" classname="org.jibx.binding.generator.BindGen">
      <arg value="-s"/>
      <arg value="${basedir}/src/com/taikang/httpxml/domain"/>
      <arg value="com.taikang.httpxml.domain.Order"/>
    </java>  
  </target>
  
  <!-- bind as a separate step -->
  <target name="bind" depends="check-binding">
    <echo message="Running JiBX binding compiler"/>
    <taskdef name="bind" classname="org.jibx.binding.ant.CompileTask">
      <classpath>
        <fileset dir="${jibx-home}/lib" includes="*.jar"/>
      </classpath>
    </taskdef>
    <bind binding="${basedir}/binding.xml">
      <classpath refid="classpath"/>
    </bind>  
  </target>
  <!-- compile, generate default, compile binding, run test -->
  <target name="full" depends="compile,bindgen,bind"/>
	<target name="help">
	  <echo message="Targets are:" /> 
	  <echo message="http://sourceforge.net/projects/jibx"/> 
      </target>
</project>

给大家不懂ant的解释一下,当前你要是点执行ant build,是走名字叫做“full”的这个任务,这个任务里有子任务会先执行,像compile,bindgen,bind,都执行完了然后执行help那个任务

当然你也可以修改

default里的执行的任务名字,分别按顺序执行compile操作(编译),bindgen(根据class生成binding.xml和xsd文件),bind(根据前边生成的那俩个文件生成绑定关系如下图)

总之看你心情,注意执行的时候看日志,出现什么错误好好找,我找了两天才彻底解决JIBX和ant的各种问题,我下了个JIBX的安装包,配置了环境变量,忘记了在eclipse里是不是安插件了,应该是有配置或者安装插件的操作,那个大家百度下JIBX的用法应该都有教学

注意,之后你要是执行TestOrder这个测试方法,是会报错的,报找不到Order这个类的class文件,可是你明明编译了,他还让你确认make sure you have compiled ,狗屁,就是没找到,记得把bin目录下

这一堆class看见没,都挪到你项目的target目录里,就是IDE(代码编辑器,eclipse或者idea intellij)的自动编译后的目录位置,覆盖掉,再执行main方法就可以了

结果下图

忘了粘代码了,补一下,各位看到了给点个赞,评论下都行啊

package com.taikang.httpxml.domain;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import org.jibx.runtime.BindingDirectory;
import org.jibx.runtime.IBindingFactory;
import org.jibx.runtime.IMarshallingContext;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;

public class TestOrder {
	private IBindingFactory factory = null;
	private StringWriter writer = null;
	private StringReader reader = null;
	private final static String CHARSET_NAME = "UTF-8";
	
	private String encode2Xml(Order order) throws JiBXException, IOException{
		System.out.println(order.getClass());
		factory = BindingDirectory.getFactory(Order.class);
		writer = new StringWriter();
		IMarshallingContext mctx = factory.createMarshallingContext();
		mctx.setIndent(2);
		mctx.marshalDocument(order, CHARSET_NAME, null, writer);
		String xmlStr = writer.toString();
		writer.close();
		System.out.println(xmlStr.toString());
		return xmlStr;
	} 
	
	private Order decode2Order(String xmlBody) throws JiBXException {
		reader = new StringReader(xmlBody);
		IUnmarshallingContext uctx = factory.createUnmarshallingContext();
		Order order = (Order) uctx.unmarshalDocument(reader);
		return order;
	}
	
	public static void main(String[] args) throws JiBXException, IOException {
		TestOrder test = new TestOrder();
		Order order = new Order();
		System.out.println("haha");
		order.setOrderNumber(123);
		order.setTotal(9999.999f);
		Address address = new Address();
		address.setCity("北京");
		address.setCountry("中国");
		address.setPostCode("330000");
		address.setState("变身中");
		address.setStreet1("贝克街");
		order.setBillTo(address);
		Customer customer = new Customer();
		customer.setCustomerNumber(123);
		customer.setFirstName("孙");
		customer.setLastName("悟空");
		order.setCustomer(customer);
		order.setShipping(Shipping.INTERNATIONAL_MAIL);
		order.setShipTo(address);
		String body =test.encode2Xml(order);
		Order order2 = test.decode2Order(body);
		System.out.println(order2);
	}
}


	


package com.taikang.httpxml.domain;

public enum Shipping {
	STANDARD_MAIL,PRIORITY_MAIL,INTERNATIONAL_MAIL,DOMESTIC_EXPRESS,INTERNATIONAL_EXPRESS
}

 

package com.taikang.httpxml.domain;

public class Order {
	private long orderNumber;
	private Customer customer;
	/** Billing address information*/
	private Address billTo;
	private Shipping shipping;
	/** Shipping address information.If missing,the billing address is also used as the shipping address */
	private Address shipTo;
	private Float total;
	public long getOrderNumber() {
		return orderNumber;
	}
	public void setOrderNumber(long orderNumber) {
		this.orderNumber = orderNumber;
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
	public Address getBillTo() {
		return billTo;
	}
	public void setBillTo(Address billTo) {
		this.billTo = billTo;
	}
	public Shipping getShipping() {
		return shipping;
	}
	public void setShipping(Shipping shipping) {
		this.shipping = shipping;
	}
	public Address getShipTo() {
		return shipTo;
	}
	public void setShipTo(Address shipTo) {
		this.shipTo = shipTo;
	}
	public Float getTotal() {
		return total;
	}
	public void setTotal(Float total) {
		this.total = total;
	}
	@Override
	public String toString() {
		return "Order [orderNumber=" + orderNumber + ", customer=" + customer + ", billTo=" + billTo + ", shipping="
				+ shipping + ", shipTo=" + shipTo + ", total=" + total + "]";
	}
	
}
package com.taikang.httpxml.domain;

import java.util.List;

public class Customer {
	private long customerNumber;
	private String firstName;
	private String lastName;
	private List<String> middleNames;
	public long getCustomerNumber() {
		return customerNumber;
	}
	public void setCustomerNumber(long customerNumber) {
		this.customerNumber = customerNumber;
	}
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public List<String> getMiddleNames() {
		return middleNames;
	}
	public void setMiddleNames(List<String> middleNames) {
		this.middleNames = middleNames;
	}
	@Override
	public String toString() {
		return "Customer [customerNumber=" + customerNumber + ", firstName=" + firstName + ", lastName=" + lastName
				+ ", middleNames=" + middleNames + "]";
	}
	
}
package com.taikang.httpxml.domain;

public class Address {
	private String street1;
	private String street2;
	private String city;
	private String state;
	private String postCode;
	private String country;
	public String getStreet1() {
		return street1;
	}
	public void setStreet1(String street1) {
		this.street1 = street1;
	}
	public String getStreet2() {
		return street2;
	}
	public void setStreet2(String street2) {
		this.street2 = street2;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public String getPostCode() {
		return postCode;
	}
	public void setPostCode(String postCode) {
		this.postCode = postCode;
	}
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
	@Override
	public String toString() {
		return "Address [street1=" + street1 + ", street2=" + street2 + ", city=" + city + ", state=" + state
				+ ", postCode=" + postCode + ", country=" + country + "]";
	}
	
}

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值