java學習

          java學習

           

          soap消息的分析和消息的創建和傳遞和處理



          @WebService
          public interface IMyService {
           @WebResult(name="addResult")
           public int add(@WebParam(name="a")int a,@WebParam(name="b")int b);
           
           @WebResult(name="user")
           public User addUser(@WebParam(name="user")User user);
           
           @WebResult(name="user")
           public User login(@WebParam(name="username")String username,
                 @WebParam(name="password")String password)throws UserException;
           
           @WebResult(name="user")
           public List<User> list(@WebParam(header=true,name="authInfo")String authInfo);
          }

          @XmlRootElement
          public class User {
           private int id;
           private String username;
           private String nickname;
           private String password;
           public int getId() {
            return id;
           }
           public void setId(int id) {
            this.id = id;
           }
           public String getUsername() {
            return username;
           }
           public void setUsername(String username) {
            this.username = username;
           }
           public String getNickname() {
            return nickname;
           }
           public void setNickname(String nickname) {
            this.nickname = nickname;
           }
           public String getPassword() {
            return password;
           }
           public void setPassword(String password) {
            this.password = password;
           }
           public User(int id, String username, String nickname, String password) {
            super();
            this.id = id;
            this.username = username;
            this.nickname = nickname;
            this.password = password;
           }
           public User() {
            super();
           }
           
           
           
          }

          public class MyServer {

           public static void main(String[] args) {
            Endpoint.publish("http://localhost:8989/ms", new MyServiceImpl());
           }

          }



          --

           

          @WebService(endpointInterface="org.soap.service.IMyService")
          @HandlerChain(file="handler-chain.xml")
          public class MyServiceImpl implements IMyService {
           private static List<User> users = new ArrayList<User>();
           
           public MyServiceImpl() {
            users.add(new User(1,"admin","","111111"));
           }

           @Override
           public int add(int a, int b) {
            System.out.println("a+b="+(a+b));
            return a+b;
           }

           @Override
           public User addUser(User user) {
            users.add(user);
            return user;
           }

           @Override
           public User login(String username, String password) throws UserException{
            for(User user:users) {
             if(username.equals(user.getUsername())&&password.equals(user.getPassword()))
              return user;
            }
            throw new UserException("");
           }

           @Override
           public List<User> list(String authInfo) {
            System.out.println(authInfo);
            return users;
           }

          }

          public class TestSoap {
           
           private static String ns = " private static String wsdlUrl = "http://localhost:8989/ms?wsdl";
                 
                  public static void main(String[] args){
                      TestSoap.test03();
                  }

           @Test
           public static void test01() {
            try {
             //1???????創建消息工廠???
             MessageFactory factory = MessageFactory.newInstance();
             //2????根據消息工廠創建SoapMessage
             SOAPMessage message = factory.createMessage();
             //3?????創建SOAPPart
             SOAPPart part = message.getSOAPPart();
             //4??獲取SOAPENvelope
             SOAPEnvelope envelope = part.getEnvelope();
             //5??可以通過SoapEnvelope有效的獲取相應的Body和Header等信息
             SOAPBody body = envelope.getBody();
             //6???根據Qname創建相應的節點(QName就是一個帶有命名空間的節點)????????????)
             QName qname = new QName("     "add","ns");//<ns:add xmlns="http://java.zttc.edu.cn/webservice"/>
             //?如果使用以下方式進行設置,會見<>轉換為&lt;和&gt
             //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) {
             e.printStackTrace();
            }
           }
           
           @Test//基于soap的消息傳遞
           public static 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");//<nn:add xmlns="xx"/>
             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("\n----------------------------------------");
             
             //??將響應的消息轉換為dom對象??
             Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
             String str = doc.getElementsByTagName("addResult").item(0).getTextContent();
             System.out.println(str);
            } catch (SOAPException e) {
             e.printStackTrace();
            } catch (IOException e) {
             e.printStackTrace();
            }
           }
           
           @Test
           public static 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","張三","11111");
                                  //編排user對象
             JAXBContext ctx = JAXBContext.newInstance(User.class);
             Marshaller mar = ctx.createMarshaller();
                                  //不會再創建xml的頭信息
             mar.setProperty(Marshaller.JAXB_FRAGMENT, true);
             StringWriter writer= new StringWriter();
             mar.marshal(user, writer);
             System.out.println("writer====="+writer);
             //4、封裝相應的part addUser
             String payload = "<xs:addUser xmlns:xs=\""+ns+"\">"+writer.toString()+"</xs:addUser>";
             System.out.println("payload====="+payload);
             StreamSource rs = new StreamSource(new StringReader(payload));
             
             //5?通過dispatch傳遞payload
             Source response = (Source)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 nl = (NodeList)xpath.evaluate("http://user", result.getNode(),XPathConstants.NODESET);
             User ru = (User)ctx.createUnmarshaller().unmarshal(nl.item(0));
             System.out.println(ru.getNickname());
            } catch (IOException e) {
             e.printStackTrace();
            } catch (JAXBException e) {
             e.printStackTrace();
            } catch (TransformerConfigurationException e) {
             e.printStackTrace();
            } catch (TransformerFactoryConfigurationError e) {
             e.printStackTrace();
            } catch (TransformerException e) {
             e.printStackTrace();
            } catch (XPathExpressionException e) {
             e.printStackTrace();
            }
           }

          posted on 2013-08-13 10:04 楊軍威 閱讀(1422) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 仁寿县| 邵武市| 沙河市| 铜陵市| 临夏县| 无为县| 安阳市| 贵州省| 肇州县| 嘉峪关市| 依兰县| 昌宁县| 年辖:市辖区| 云龙县| 永州市| 罗山县| 星子县| 酉阳| 伊宁市| 杂多县| 金寨县| 台北县| 湘阴县| 广平县| 礼泉县| 凌海市| 蓬安县| 安溪县| 龙州县| 台南市| 嘉荫县| 乐安县| 上思县| 辽阳县| 峡江县| 浦城县| 五莲县| 淮南市| 夏津县| 东海县| 石家庄市|