01--
SEI(Service Endpoint Interface)
SIB(Service implementation Bean)
CXF Axis Metro
**************************************************************
02--
wsimport -d d:/webservice/01/ -keep -verbose http://localhost:8888/ns?wsdl
wsimport -d d:/webservice/01/ -p test -verbose http://localhost:8888/ns?wsdl //-p 有包
wsimport -d d:/webservice/01/ -p test -keep -verbose http://localhost:8888/ns?wsdl
![]()
**************************************************************
03--
localhost:8888/ns?xsd=1
localhost:8888/ns?wsdl
TCPMon 消息监控
![]()
**************************************************************
09--
package org.itat.xml;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.junit.Test;
public class TestJaxb {
@Test
public void test01(){
try {
JAXBContext ctx = JAXBContext.newInstance(Student.class);
Marshaller marshaller = ctx.createMarshaller();
Student stud = new Student(1,"zhangsan",21,new Classroom(1,"jisuanji",2010));
marshaller.marshal(stud, System.out);
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void test02(){
String xml="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><student><age>21</age><classroom><grade>2010</grade><id>1</id><name>jisuanji</name></classroom><id>1</id><name>zhangsan</name></student>";
try {
JAXBContext ctx = JAXBContext.newInstance(Student.class);
Unmarshaller um = ctx.createUnmarshaller();
Student stu = (Student) um.unmarshal(new StringReader(xml));
System.out.println(stu.getName()+","+stu.getClassroom().getName());
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
**************************************************************
10--
package org.itat.stax;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import org.junit.Test;
public class TestStax {
@Test
public void test01(){
XMLInputFactory factory = XMLInputFactory.newFactory();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
try {
XMLStreamReader reader = factory.createXMLStreamReader(is );
while(reader .hasNext()){
int type = reader.next();
if(type ==XMLStreamConstants.START_ELEMENT){
System. out.println(reader .getName());
} else if (type ==XMLStreamConstants.CHARACTERS){
System. out.println(reader .getText().trim());
} else if (type ==XMLStreamConstants.END_ELEMENT){
System. out.println("/" +reader .getName());
}
}
} catch (XMLStreamException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(is !=null)
try {
is.close();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Test
public void test02(){
XMLInputFactory factory = XMLInputFactory.newFactory();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
try {
XMLStreamReader reader = factory.createXMLStreamReader(is );
while(reader .hasNext()){
int type = reader.next();
if(type ==XMLStreamConstants.START_ELEMENT){
String name = reader .getName().toString();
if(name .equals("book")){
System. out.println(reader .getAttributeName(0)+":"+ reader.getAttributeValue(0));
}
}
}
} catch (XMLStreamException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(is !=null)
try {
is.close();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Test
public void test03(){
XMLInputFactory factory = XMLInputFactory.newFactory();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
try {
XMLStreamReader reader = factory.createXMLStreamReader(is );
while(reader .hasNext()){
int type = reader.next();
if(type ==XMLStreamConstants.START_ELEMENT){
String name = reader .getName().toString();
if(name .equals("title")){
System. out.println(reader .getElementText()+":");
} if(name .equals("price")){
System. out.println(reader .getElementText()+"\n");
}
}
}
} catch (XMLStreamException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(is !=null)
try {
is.close();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Test
public void test04(){
XMLInputFactory factory = XMLInputFactory.newFactory();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
try {
XMLEventReader reader = factory.createXMLEventReader(is );
while(reader .hasNext()){
XMLEvent event = reader .nextEvent();
if(event .isStartElement()){
String name = event.asStartElement().getName().toString();
if(name .equals("title")){
System. out.println(reader .getElementText()+":");
} if(name .equals("price")){
System. out.println(reader .getElementText()+"\n");
}
}
}
} catch (XMLStreamException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(is !=null)
try {
is.close();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Test
public void test05(){
XMLInputFactory factory = XMLInputFactory.newFactory();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
try {
XMLEventReader reader = factory.createFilteredReader(factory .createXMLEventReader(is),new EventFilter() {
@Override
public boolean accept(XMLEvent event) {
if(event .isStartElement()){
String name = event.asStartElement().getName().toString();
if(name .equals("title")|| name.equals("price" ))return true;
}
return false ;
}
});
while(reader .hasNext()){
XMLEvent event = reader .nextEvent();
if(event .isStartElement()){
String name = event.asStartElement().getName().toString();
if(name .equals("title")){
System. out.println(reader .getElementText()+":");
} if(name .equals("price")){
System. out.println(reader .getElementText()+"\n");
}
}
}
} catch (XMLStreamException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(is !=null)
try {
is.close();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
**************************************************************
11--
@Test
public void test06(){
XMLInputFactory factory = XMLInputFactory.newFactory();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml" );
try {
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse( is);
XPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
NodeList list = (NodeList)xpath.evaluate("//book[@category='WEB']" , doc,XPathConstants.NODESET);
for(int i =0;i <list .getLength();i++){
Element e = (Element) list.item( i);
System. out.println(e .getElementsByTagName("title").item(0).getTextContent());
}
} catch (ParserConfigurationException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XPathExpressionException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(is !=null)
try {
is.close();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
**************************************************************
14--
public class TestSoap {
@Test
public void test01(){
try {
//1、创建消息工厂
MessageFactory factory = MessageFactory.newInstance();
//2、根据消息工厂创建SoapMessage
SOAPMessage message = factory .createMessage();
//3、创建SOAPart
SOAPPart part = message .getSOAPPart();
//4、获取SOAPENvelope
SOAPEnvelope envelope = part .getEnvelope();
//5、可以通过SoapEnvelope有效的获取相应的Body和Header等信息
SOAPBody body = envelope .getBody();
//6、根据Qname创建相应的节点
QName qname = new QName("http://java.zttc.edu.cn/webservice" ,"add" ,"ns" );
body.addBodyElement(qname ).setValue("1234234");
//如果使用以下方式进行设置,会将<>转换为< >
//body.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
SOAPBodyElement ele = body .addBodyElement(qname);
ele.addChildElement("a" ).setValue("22");
ele.addChildElement("b" ).setValue("33");
//打印消息信息
message.writeTo(System.out);
} catch (SOAPException e ) {
e.printStackTrace();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
**************************************************************
15--soap消息的传递和处理--MESSAGE
private String ns = "http://service.soap.org/";
private String wsdlUrl = "http://localhost:8989/ms?wsdl";
@Test
public void test02(){
try {
//1、创建服务(Service)
URL url = new URL(wsdlUrl);
QName sname = new QName(ns,"MyServiceImplService");
Service service = Service.create( url,sname );
//2、创建Dispatch
Dispatch<SOAPMessage> dispatch = service .createDispatch(new QName(ns,"MyServiceImplPort" ),
SOAPMessage. class, Service.Mode.MESSAGE);
//3、创建SOAPMessage
SOAPMessage msg = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = msg .getSOAPPart().getEnvelope();
SOAPBody body = envelope .getBody();
//4、创建QName来指定消息中传递数据
QName ename = new QName(ns,"add", "nn");
SOAPBodyElement ele = body .addBodyElement(ename);
ele.addChildElement("a" ).setValue("22");
ele.addChildElement("b" ).setValue("33");
msg.writeTo(System.out);
System. out.println("\n invoking...." );
//5、通过Dispatch 传递消息,会返回响应消息
SOAPMessage response = dispatch .invoke(msg);
response.writeTo(System.out);
System. out.println();
//将响应的消息转换为 dom对象
Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
String str = doc.getElementsByTagName("addResult" ).item(0).getTextContent();
System. out.println(str );
} catch (MalformedURLException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SOAPException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
**************************************************************
16----soap消息的传递和处理--PAYLOAD
@Test
public void test03(){
try {
//1、创建服务(Service)
URL url = new URL(wsdlUrl);
QName sname = new QName(ns,"MyServiceImplService");
Service service = Service.create( url,sname );
//2、创建Dispatch(通过源数据的方式传递)
Dispatch<Source> dispatch = service .createDispatch(new QName(ns,"MyServiceImplPort" ),
Source. class, Service.Mode.PAYLOAD);
//3、根据用户对象创建相应的 xml
User user = new User(3,"zs", "张三","1111" );
JAXBContext ctx = JAXBContext.newInstance(User. class);
Marshaller mar = ctx .createMarshaller();
mar.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
mar.marshal(user , writer );
//4.封装相应的part addUser
String payload = "<nn:addUser xmlns:nn=\""+ns+"\">"+ writer.toString()+"</nn:addUser>" ;
System. out.println(payload );
StreamSource rs = new StreamSource(new StringReader(payload));
//5.通过dispatch传递 payload
Source response = dispatch .invoke(rs);
//6.将Source转化为Dom进行操作,使用Transform对象转换
Transformer tran = TransformerFactory.newInstance().newTransformer();
DOMResult result = new DOMResult();
tran.transform(response , result );
//7.处理相应信息(通过 xpath处理)
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList n1 = (NodeList) xpath.evaluate("//user" , result.getNode(),XPathConstants.NODESET);
User ru = (User) ctx.createUnmarshaller().unmarshal(n1 .item(0));
System. out.println(ru .getNickname());
} catch (MalformedURLException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JAXBException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerConfigurationException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XPathExpressionException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
**************************************************************
17--List--head
@Override
public List<User> list(String authInfo ) {
System. out.println(authInfo );
return users ;
}
@Test
public void test04(){
try {
//1、创建服务(Service)
URL url = new URL(wsdlUrl);
QName sname = new QName(ns,"MyServiceImplService");
Service service = Service.create( url,sname );
//2、创建Dispatch
Dispatch<SOAPMessage> dispatch = service .createDispatch(new QName(ns,"MyServiceImplPort" ),
SOAPMessage. class, Service.Mode.MESSAGE);
//3、创建SOAPMessage
SOAPMessage msg = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = msg .getSOAPPart().getEnvelope();
SOAPBody body = envelope .getBody();
//3.2 处理header信息
SOAPHeader header = envelope .getHeader();
if(header == null) header = envelope .addHeader();
QName hname = new QName(ns,"authInfo", "nn");
header.addHeaderElement(hname ).setValue("aabbccdd");;
//4、创建QName来指定消息中传递数据
QName ename = new QName(ns,"list", "nn");
SOAPBodyElement ele = body .addBodyElement(ename);
msg.writeTo(System.out);
System. out.println("\n invoking...." );
//5、通过Dispatch 传递消息,会返回响应消息
SOAPMessage response = dispatch .invoke(msg);
response.writeTo(System.out);
System. out.println();
//将响应的消息转换为 dom对象
Document doc = response.getSOAPBody().extractContentAsDocument();
NodeList n1 = doc.getElementsByTagName("user" );
JAXBContext ctx = JAXBContext.newInstance(User. class);
for(int i =0;i<n1.getLength(); i++){
Node n = n1.item( i);
User u = (User) ctx.createUnmarshaller().unmarshal(n );
System. out.println(u .getNickname());
}
} catch (MalformedURLException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SOAPException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JAXBException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class Test {
public static void main(String[] args) {
MyServiceImplService mis = new MyServiceImplService();
IMyService ms = mis.getMyServiceImplPort();
java.util.List<User> users = ms .list(null, "ddd").getUser();
for(User u : users){
System. out.println(u .getNickname());
}
}
}
**************************************************************
18--Exception
@Override
public User login(String username , String password) throws UserException {
for(User user :users){
if(username .equals(user.getNickname())&& password.equals(user .getPassword()))
return user ;
}
throw new UserException("用户不存在");
}
@Test
public void test05(){
try {
//1、创建服务(Service)
URL url = new URL(wsdlUrl);
QName sname = new QName(ns,"MyServiceImplService");
Service service = Service.create( url,sname );
//2、创建Dispatch
Dispatch<SOAPMessage> dispatch = service .createDispatch(new QName(ns,"MyServiceImplPort" ),
SOAPMessage. class, Service.Mode.MESSAGE);
//3、创建SOAPMessage
SOAPMessage msg = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = msg .getSOAPPart().getEnvelope();
SOAPBody body = envelope .getBody();
//4、创建QName来指定消息中传递数据
QName ename = new QName(ns,"login", "nn");
SOAPBodyElement ele = body .addBodyElement(ename);
ele.addChildElement("username" ).setValue("ss");
ele.addChildElement("password" ).setValue("dd");
msg.writeTo(System.out);
System. out.println("\n invoking...." );
//5、通过Dispatch 传递消息,会返回响应消息
SOAPMessage response = dispatch .invoke(msg);
response.writeTo(System.out);
System. out.println();
} catch(SOAPFaultException e ){
System. out.println(e .getMessage());
}
catch (MalformedURLException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SOAPException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
--Client
public class Test {
public static void main(String[] args) {
MyServiceImplService mis = new MyServiceImplService();
IMyService ms = mis.getMyServiceImplPort();
try {
ms.login( "22", "ee" );
} catch (UserException_Exception e ) {
System. out.println(e .getMessage());
//e.printStackTrace();
}
}
}
**************************************************************
19--Error
1.写配置文件
handler-chain.xml
<?xml version="1.0" encoding= "UTF-8" standalone ="yes"?>
<javaee:handler-chains
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<javaee:handler-chain>
<javaee:handler>
<javaee:handler-class> org.soap.service.handler.HeaderHandler</javaee:handler-class >
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>
2.配置MyServiceImplService
@WebServiceClient(name = "MyServiceImplService" , targetNamespace = "http://service.soap.org/" , wsdlLocation = "http://localhost:8989/ms?wsdl" )
@HandlerChain(file="handler-chain.xml" )
public class MyServiceImplService
3.写 HeaderHandler 类
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
System. out.println("handler" );
return true ;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
System. out.println("error" );
return false ;
}
**************************************************************
20--服务器端 客户端写 Handler 添加头部
客户端:
handler-chain.xml
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
String ns = "http://service.soap.org";
Boolean out = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(out ){
SOAPMessage message = context .getMessage();
//1、判断message中是否存在header
SOAPEnvelope enve = message.getSOAPPart().getEnvelope();
SOAPHeader header = enve .getHeader();
if(header ==null) header = enve.addHeader();
QName qname = new QName(ns,"licenseInfo", "ns");
header.addHeaderElement(qname ).setValue("123123");
}
} catch (SOAPException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true ;
}
服务器端 :
handler-chain.xml
@WebService(endpointInterface="org.soap.service.IMyService" /*,targetNamespace="http://www.zttc.edu.cn"*/ )
@HandlerChain(file="handler-chain.xml" )
public class MyServiceImpl implements IMyService{
public class LicenseHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
Boolean out = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(!out ){
SOAPMessage message = context .getMessage();
SOAPEnvelope enve = message.getSOAPPart().getEnvelope();
SOAPHeader header = enve .getHeader();
/*if(header==null){
trow new UserException("没有验证,无法通过处理");
}*/
if(header !=null){
NodeList n1 = (NodeList)header.getElementsByTagName("ns:licenseInfo" );
System. out.println(n1 .getLength());
Node node = n1 .item(0);
System. out.println(node .getTextContent());
}
}
} catch (SOAPException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true ;
}
**************************************************************
21--过滤验证
客户端:
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
String ns = "http://service.soap.org";
Boolean out = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(out ){
SOAPMessage message = context .getMessage();
//1、判断message中是否存在header
SOAPEnvelope enve = message.getSOAPPart().getEnvelope();
SOAPBody body = enve .getBody();
Node node = body .getChildNodes().item(0);
String pn = node.getLocalName();
if("list" .equals(pn)||"addUser".equals( pn)){
SOAPHeader header = enve .getHeader();
if(header ==null) header = enve.addHeader();
QName qname = new QName(ns,"licenseInfo" ,"ns" );
header.addHeaderElement(qname ).setValue("123123");
}
}
} catch (SOAPException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true ;
}
服务器端 :
public class LicenseHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
Boolean out = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(!out ){
SOAPMessage message = context .getMessage();
SOAPEnvelope enve = message.getSOAPPart().getEnvelope();
SOAPHeader header = enve .getHeader();
SOAPBody body = enve .getBody();
Node bn = body.getChildNodes().item(0);
String partname = bn .getLocalName();
if("list" .equals(partname)|| "addUser".equals(partname )){
if(header ==null){
//添加一个错误信息
System. out.println("ttt" );
SOAPFault fault = body .addFault();
fault.setFaultString("头部信息不能为空" );
throw new SOAPFaultException(fault);
}
Iterator<SOAPHeaderElement> iterator = header.extractAllHeaderElements();
if(!iterator .hasNext()){
SOAPFault fault = body .addFault();
fault.setFaultString("头部信息不正确" );
throw new SOAPFaultException(fault);
}
}
}
} catch (SOAPException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true ;
}
**************************************************************
22--契约优先的 编写方式
1、先写scheme或者wsdl文件
2、根据文件生成一个客户端代码
3、编写实现类(在实现类指定wsdlLocation)
4、发布服务
**************************************************************