java6加入标准JAXB支持

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地 结合XML数据和处理函数。

java6中,作为标准,加入了对jaxb2.x的支持,相比1.x,使用更方便,生成的代码量也更简洁

java6中查看对jaxb的支持,命令行下输入:

xjc -version

output:
----------
xjc version "JAXB 2.1.10 in JDK 6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build JAXB 2.1.10 in JDK 6)

通过XSD文件生成Java文件,这里以JPA配置文件为例:

xjc -p com.xxx.packagename -d e:/tmp/jaxb/src /orm_1_0.xsd

生成如下文件:

parsing a schema...
compiling a schema...
AccessType.java
AssociationOverride.java
AttributeOverride.java
Attributes.java
Basic.java
CascadeType.java
........


再通过JAXB解晰xml或生成xml代码如下:

        //parse xml to java
        String contentFile = "/entity-cfg.xml";
        JAXBContext jaxbContext = JAXBContext.newInstance("com.xxx.xxxx",Xml2Java.class.getClassLoader());
        StreamSource streamSource = new StreamSource(new FileReader(new File(contentFile)));
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
       
        com.xxx.xxxx.EntityMappings entityMappings = (com.xxx.xxxx.EntityMappings)unmarshaller.unmarshal(streamSource);
        List<com.xxx.xxxx.Entity> entitys = entityMappings.getEntity();
        for(com.xxx.xxxx.Entity entity:entitys){
            System.out.println(entity.getClazz());
        }
       
        //marshal java object to xml
        Object o = entityMappings;
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        String xmlFile = "/em.xml";
        marshaller.marshal(o, new FileOutputStream(xmlFile));

Java6 Hello WebServcie

package com.azulstudio.jwssample;

public interface IHello {

                String sayHello(String name);

}

--------------------------------

package com.azulstudio.jwssample;

import javax.jws.WebMethod;

import javax.jws.WebService;

import javax.jws.soap.SOAPBinding;

 

 

 

@WebService(name="IHello", serviceName="HelloService")

@SOAPBinding(style=SOAPBinding.Style.RPC)

public class HelloImpl implements IHello {

                @WebMethod(operationName="sayHello")

                public String sayHello(String name) {

                                System.out.println("HelloImpl.sayHello method called");

                                return "hello from server !!"+name;

                }

 

}

--------------------------------------------------------------------

import javax.xml.ws.Endpoint;

import com.azulstudio.jwssample.HelloImpl;

import com.azulstudio.jwssample.IHello;

public class Test {

                public static void main(String[] args) {

                                IHello iHello = new HelloImpl();

                                try{

                                                Endpoint endpoint = Endpoint.publish("http://localhost:8080/Hello", iHello);

                                }

                                catch(Exception e){

                                                e.printStackTrace();

                                }

                }

 

}

----------------------------------------------------------------------------------------------------------

 

 

import java.io.OutputStream;

import java.net.URL;

import javax.xml.namespace.QName;

import javax.xml.soap.MessageFactory;

import javax.xml.soap.SOAPBody;

import javax.xml.soap.SOAPBodyElement;

import javax.xml.soap.SOAPConnection;

import javax.xml.soap.SOAPConnectionFactory;

import javax.xml.soap.SOAPEnvelope;

import javax.xml.soap.SOAPHeader;

import javax.xml.soap.SOAPHeaderElement;

import javax.xml.soap.SOAPMessage;

import javax.xml.soap.SOAPPart;

 

public class TestClient {

                public static void main(String[] args) throws Exception {

                                SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();

                                SOAPConnection connection = factory.createConnection();

                                MessageFactory mFactory = MessageFactory.newInstance();

                                SOAPMessage message = mFactory.createMessage();

                                SOAPPart part = message.getSOAPPart();

                                SOAPEnvelope envelope = part.getEnvelope();

                                SOAPHeader header = message.getSOAPHeader();

                                SOAPBody body = envelope.getBody();

                                SOAPHeaderElement headerElementRoot = header.addHeaderElement(new

                                                                                 QName("http://jwssample.azulstudio.com/", "c", "ns1")); 

                                SOAPBodyElement bodyElementRoot = body.addBodyElement(new     

                                                                                 QName("http://jwssample.azulstudio.com/", "sayHello", "ns1")); 

                                bodyElementRoot.addChildElement(new QName("arg0")).addTextNode("fffffffffff");

 

                                SOAPMessage reMessage = connection.call(message, new URL("http://localhost:8080/Hello"));

                                OutputStream os = System.out;

                                reMessage.writeTo(os);

                                connection.close();

                }

}

------------------------------------------------------------------------------------------------------------------------------------------------

针对Java 6 WS客户端及服务端的最简单实例

访问 http://localhost:8080/Hello?wsdl

WSDL文件如下:

<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://jwssample.azulstudio.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://jwssample.azulstudio.com/" name="HelloService">
<types></types>
<message name="sayHello">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="sayHelloResponse">
<part name="return" type="xsd:string"></part>
</message>
<portType name="IHello">
<operation name="sayHello">
<input message="tns:sayHello"></input>
<output message="tns:sayHelloResponse"></output>
</operation>
</portType>
<binding name="IHelloPortBinding" type="tns:IHello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"></soap:binding>
<operation name="sayHello">

<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://jwssample.azulstudio.com/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://jwssample.azulstudio.com/"></soap:body>
</output>
</operation>
</binding>
<service name="HelloService">
<port name="IHelloPort" binding="tns:IHelloPortBinding">
<soap:address location="http://localhost:8080/Hello"></soap:address>
</port>
</service>
</definitions>

一些特殊字符的中英文读法[转]

 

特殊字符 英文名 中文名 注解
~ tilde 波浪号
` back quote 反引号 键盘上,用Shift + ~ 输入此字符
! exclamation 感叹号/惊叹号
@ at 一般读作“小老鼠” 邮件地址中一般读作“小老鼠”或者直接像英文一样读作 “at”
# number sign / pound / sharp / hash 井号 英语国家是hash,美语是pound,音乐里作sharp,C#
$ dollar sign 美元符号
% percent 百分号
^ caret 脱字符号 / 插入符号
& ampersand / 引用 C语言中,读作“取地址,引用”,逻辑语言中,表示“与”
* asterisk / star / multiply 星号 star(美语),数学公式中作multiply
( left parenthesis / opening parentheses 左括号 / 开括号
) right parenthesis / close parentheses 右括号 /闭括号
_ underscore / underline 下划线
- minus / negative / dash / hyphen 减号/负号/破折号/连字符 数学公式中作minus
+ plus / positive 加号/正(数) 数学公式中作positive
= equal 等于号/等号
{ left  brace / opening brace 左大括号
} right brace / closing brace 右大括号
[ left  bracket / opening bracket 左中括号
] right bracket / closing bracket 右中括号
| bar / pipe / vertical bar 竖线
\ backslash / escape 反斜杠
: colon 冒号
; semicolon 分好
“ ” double quote / quotation mark 双引号 / 引号
‘ ’ (single) quote / apostrophe 撇号 / 单引号
< less 小于号
> greater 大于号
, Comma 逗号
. period / dot / point
? question mark 问号
/ slash / slant 斜杠
ellipsis 省略号

 

通过JMS访问activemq

JMS之于MQ正如JDBC之于各种DB

以下以activemq为例,记录集中发送和接收message的典型方式

发送
-----------------------------------------------------------------

public class JmsSender {
        public static void main(String[] args) throws JMSException {
                // ConnectionFactory
                ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                                ActiveMQConnection.DEFAULT_USER,
                                ActiveMQConnection.DEFAULT_PASSWORD,
                                "tcp://127.0.0.1:61616"); 

                Connection connection = connectionFactory.createConnection();
                connection.start(); 

                Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); 

                Destination destination = session.createQueue("my-queue"); 

                MessageProducer producer = session.createProducer(destination); 

                producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 

                sendMsg(session, producer);
                session.commit();
                connection.close();
        } 

        public static void sendMsg(Session session, MessageProducer producer) throws JMSException { 

                TextMessage message = session.createTextMessage("Hello ActiveMQ!"); 

                producer.send(message);
                System.out.println("");
        }
}

接收
---------------------------------------------------------

public class JmsReceiver {
        public static void main(String[] args) throws JMSException { 

                ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                                ActiveMQConnection.DEFAULT_USER,
                                ActiveMQConnection.DEFAULT_PASSWORD,
                                "tcp://127.0.0.1:61616"); 

                Connection connection = connectionFactory.createConnection();
                connection.start(); 

                Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); 

                Destination destination = session.createQueue("my-queue"); 

                MessageConsumer consumer = session.createConsumer(destination);
                while (true) {
                        TextMessage message = (TextMessage) consumer.receive(1000);
                        session.commit();
                        if (null != message)
                                System.out.println("message received:" + message.getText());
                        else
                                break;
                }
                session.close();
                connection.close();
        }
}

通过spring模板类访问
---------------------------------------------------------

public static void main(String args[]) {

		ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

		JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");

		jmsTemplate.send(new MessageCreator() {
			public Message createMessage(Session session) throws JMSException {
				MapMessage mm = session.createMapMessage();
				mm.setLong("count", new Date().getTime());
				return mm;
			}
		});
	}

--------------------------------------------

public static void main(String args[]){

		ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

		JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");

		while(true) {
			Map<String, Object> mm =  (Map<String, Object>) jmsTemplate.receiveAndConvert();

			System.out.println("message received:" + new Date((Long)mm.get("count")));
		}
	}

------------------------------------------------

配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

<!--
    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="tcp://localhost:61616" />
            </bean>
        </property>
    </bean>
-->
    <bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616" />
    </bean>
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactory" />
        <property name="defaultDestination" ref="destination" />
        <property name="messageConverter">
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
        </property>
    </bean>  

    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="my-queue" />
    </bean>  

</beans>

关于xml解析方案的选择

JDom  Dom4j  xstream digester or Castor ?

日常开发中遇到越来越多的xml文档,java中如何对这些xml文档进行解析.   google了下, 收集了几篇文章如下:

http://lavasoft.blog.51cto.com/62575/307808     Castor实现XML与Java的互转

http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html  xStream完美转换XML、JSON

http://www.cnblogs.com/hoojo/archive/2011/04/25/2026819.html  用Castor 处理XML文档

http://blog.csdn.net/thunder09/article/details/5555946  打造完美的xml技术解决方案(dom4j/xstream)