WebService入门篇
首先新建一個webservice服務器端的程序。注意的是要使用jdk6及其以上版本。
?
將一個項目如下:
????????
內部代碼如下:
package cn.itcast.server;
?
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
?
@WebService
public class Hello {
????? /**
????? ?* Endpoint Web服務端點
????? ?* 使用在此類定義的靜態方法創建端點。一個端點總是綁定到一個Binding
????? ?* 和一個實現者,這兩項都是在創建端點時設置的。
????? ?*
????? ?* 端點要么處于已發布狀態,要么處于未發布狀態??梢允褂胮ublish方法
????? ?* 開始發布端點,此時端點開始接受傳入請求。相反,可以使用stop方法停
????? ?* 止接受傳入請求并取消端點。一旦停止,就不能再次發布端點。
????? ?*
????? ?* 可以在端點上設置Executor以便更好地控制用來指派傳入請求的線程。例如
????? ?* ,通過創建ThreadPoolExecutor并向端點注冊可以啟動帶有特定參數的線程池。
????? ?*
????? ?* 處理程序鏈可以使用所含的Binding來設置。
????? ?*
????? ?* 端點可以使一個數據文檔(如WSDL和XMLSchema文檔)列表與之綁定。發布時,
????? ?* JAX-WS實現將根據實現者上存在的注釋,盡可能多地重用這些元數據,
????? ?* 而不是生成新的數據
????? ?*
????? ?* address:一個URI,指定要使用的地址和傳輸協議
????? ?* implementor:端點實現者,表示是哪個類實現的服務。
????? ?*/
????? publicString sayHi(String name){
?????????????? System.out.println("姓名? name = " + name);
?????????????? return"歡迎訪問我:hi!" + name;
????? }
?????
????? publicstatic void main(String[] args) {
//這里的地址可以是隨便寫的,表示的意思是訪問這個webservice的地址是多少。//當然也可以把這個地址改成一個確定的ip地址。
//注意后面的鏈接地址是在程序中定義的address,要注意的是端口號不能和本機程序中的端口號重名。
?????????????? Endpoint.publish("http://localhost:8888/one",new Hello());
????? }
}
?
@WebService:說明把這個類發布出去的時候是以網絡的方式發不出去的。
這個方法一定是public 的,并且還要是非靜態的。
?
接著可以在瀏覽器地址上輸入:http://localhost:8888/one,這時候就可以看到可以被訪問到了,
當訪問:http://localhost:8888/one?wsdl時可以看到webservice使用說明書。
常見錯誤:
錯誤1:
2013-6-12 11:01:53com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
信息: Dynamically creating request wrapper Classcn.itcast.server.jaxws.SayHi
2013-6-12 11:01:53com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass
信息: Dynamically creating response wrapper bean Classcn.itcast.server.jaxws.SayHiResponse
Exception in thread"main" com.sun.xml.internal.ws.server.ServerRtException: Server Runtime Error:java.net.BindException: Address already in use: bind
????? atcom.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(UnknownSource)
????? at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(UnknownSource)
????? atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(UnknownSource)
????? atcom.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(UnknownSource)
????? at javax.xml.ws.Endpoint.publish(UnknownSource)
????? at cn.itcast.server.Hello.main(Hello.java:35)
Caused by: java.net.BindException: Address already in use: bind
????? at sun.nio.ch.Net.bind(Native Method)
????? atsun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
????? at sun.nio.ch.ServerSocketAdaptor.bind(UnknownSource)
????? atsun.net.httpserver.ServerImpl.<init>(Unknown Source)
????? atsun.net.httpserver.HttpServerImpl.<init>(Unknown Source)
????? atsun.net.httpserver.DefaultHttpServerProvider.createHttpServer(Unknown Source)
????? at com.sun.net.httpserver.HttpServer.create(UnknownSource)
????? ... 6 more
出現這種錯誤的原因是因為已經有一個在運行了,也就是說重新運行程序了。
?????? 錯誤2
2013-6-12 11:01:53com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
信息: Dynamically creating request wrapper Classcn.itcast.server.jaxws.SayHi
2013-6-12 11:01:53 com.sun.xml.internal.ws.model.RuntimeModelergetResponseWrapperClass
信息: Dynamically creating response wrapper beanClass cn.itcast.server.jaxws.SayHiResponse
Exception in thread "main" com.sun.xml.internal.ws.server.ServerRtException: Server Runtime Error:java.net.BindException: Address already in use: bind
????? atcom.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(UnknownSource)
????? atcom.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(UnknownSource)
????? atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(UnknownSource)
????? atcom.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(UnknownSource)
????? atjavax.xml.ws.Endpoint.publish(Unknown Source)
????? atcn.itcast.server.Hello.main(Hello.java:35)
Caused by: java.net.BindException: Address already in use: bind
????? atsun.nio.ch.Net.bind(NativeMethod)
????? atsun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
????? atsun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
????? atsun.net.httpserver.ServerImpl.<init>(Unknown Source)
????? atsun.net.httpserver.HttpServerImpl.<init>(Unknown Source)
????? atsun.net.httpserver.DefaultHttpServerProvider.createHttpServer(Unknown Source)
????? atcom.sun.net.httpserver.HttpServer.create(Unknown Source)
????? ...6 more
關于jdk中的bin中,native2ascii.exe,這是一個轉換ascii的工具。
(1)查看java的jdk是否是jdk6,可以在cmd命令中使用java –version.
(2)通過命令的方式進入jdk的bin目錄,命令如下:C:\Users\Administrator>setpath=C:\Program Files (x86)\java\jdk1.6.0_25\bin;
(3)進入之后點擊:keytool,可以擁有加密。
?(4)如果使用webservice需要使用的是:wsimport.exe
?-d:在哪里生成輸出文件
-p:指定目標包,通過-p可以生成一個自定義包結構
-s:指定在哪里生成源文件。
?
以下是將wsdl文件放置到指定目錄下的方式,下面的命令表示的意思是將文件放在D:\ws目錄中。
C:\Users\Administrator>D:
D:\>cdws
//下面使用jdk中的wsimport.exe工具將文件放在當前文件目錄(當前目錄通過”.”來表示)。
D:\ws>wsimport-d . http://localhost:8888/one?wsdl
?
通過這種方式就可以生成class文件。D盤中的ws目錄里的內容如下:
?
獲得java文件的方式:
在命令行中輸入:D:\ws>wsimport-s . http://localhost:8888/one?wsdl
接著ws目錄就可以看到如下:
?
??? 通過這種方式就可以得到客戶端的代碼。
??? 創建客戶端代碼,然后將代碼拷貝到src中,然后并移動到指定包下。
???
當想看webservice使用說明書的時候,最先看里面的<service name=“HelloService”>,表示的意思是使用HelloService來調用,如果看到上面使用的代碼,是可以看到有一個HelloService.java類的。
<servicename="HelloService">
<portname="HelloPort"binding="tns:HelloPortBinding">
<soap:address location="http://localhost:8888/one"/>
</port>
</service>
如上表示的soap:address location=“http://localhost:8888/one”,表示的是注冊地址。
?
提供webservice接口的網站:http://www.36wu.com/Service.aspx
下面的一個網站提供了很多接口服務
http://www.webxml.com.cn/zh_cn/information.aspx
?
下面是關于webservice方面的其它一些知識點
WebService
day01
1.概述
JDK1.6_1.3以上的版本才能使用
通過IE訪問時,http請求行中:Connection:keep-Alive
webService的規范就是http規范+soap規范
WebService的框架:
??? 云計算、云查殺、SOA(面向服務的框架)
webService只采用http post方式傳輸數據,不使用get方式
??? (http的contentType:applicaiton-x-www-urlencoded)
??? 根據contentType判斷soap版本:
??? Text/xml:charset=UTF-8?? ==>soap1.1
??? application/soap+xml ==>soap1.2
?
???
注意:wsimport.exe只能編譯soap1.1的版本,不能編譯soap1.2
2.helloworld
??? 1.一個類上添加注解@WebService
??? @WebService的成員變量可以查看API。
??? 2.類中使用Endpoint,并調用Endpoint的publish()方法將此類發布
!!! 注意:要發布的這個類,至少包含一個public 且非static類型的方法.
??? publish()中的參數可以指定發布的路徑==>如:http://192.168.1.100:8888/one
??? 發布后會生成一個使用說明書(.xml文件)
??? 3.wsimport生成客戶端代碼
??? 4.通過客戶端代碼調用sayHi()
??? ...
??? Hello? hello = new HelloService().getHelloPort();==>
??? hello.sayHi("張無忌");
?
3.webService的使用說明書:
對象被發布后會生成一個使用說明書(.xml文件)
??? http://192.168.1.249:8888/one?wsdl
??? wsdl==>web servicedescript language
??? 1.<servicename="HelloService">
?????? <portname="HelloPort" binding="tns:HelloPortBean">
?????????? <soap:addresslocation="http://192.168.1.100:8888/one" >
?????? </port>
??? </service>
??? 2.<bindingname="" type="tns:Hello"/>
??? 3.<portTypename="">
??????
??? </portType>
?
weblogic和oracle裝完之后默認會修改我們的環境變量(如jdk等).
所以JDK等的版本也會被更改,我們可以通過環境變量手工改過來.
4.jdk/bin/keytool.exe工具?? ???
5.jdk/bin/keytool.exe/wsimport.exe工具
??? 使用方法: wsimport [options]<WSDL_URI>
??? option:
?????? -p <pkg>????? ?specifies the target package
?????? -d<directory>??????????? specifywhere to place generated output files
?????? -s<directory>??????????? specifywhere to place generated source files
??? wsimport -d .http://...==>生成路徑中對應的類的.class文件
??? wsimport -s .http://...==>生成路徑中對應的類的.java文件
?
!!! 注意:wsimport.exe只能編譯soap1.1的版本,不能編譯soap1.2
?
soap協議==>基于xml編碼的文本協議
6.
webService只采用http post方式傳輸數據,不使用get方式
??? (http的contentType:applicaiton-x-www-urlencoded)
??? 根據contentType判斷soap版本:
??? Text/xml:charset=UTF-8?? ==>soap1.1
??? application/soap+xml ==>soap1.2
webService傳遞參數
??? (http中傳遞參數 ...get/?name=zhangsan&age=88)
??? <? xmlversion=1.0?>
??? <name>zhangsan</name>
??? <age>88</age>
?
7.???外部程序訪問我們的程序,訪問的實際是Service層???11:42
?
?
8.
??? 1.找到查詢手機歸屬地的說明書
?????? 說明書中的<soap12..>或<soap>可以查看soap的版本
?????? wsimport只能編譯1.1
??? 2.將說明書保存為phone.wsdl
??? 3.使用wsimport生成.java源文件
??? (wsimport -s .http://192.168....)
??? wsimport -s .F:\phone.wsdl
??? 4.新建一個工程,將生成.java文件復制到工程中
??? 5.工程中新建Main.java,里面新建main方法,方法中
???
??? <wsdl:servicename="MobileCodeWS"..="">?? ==>查看類名
??? 調用:
??? MobileCodeWSSoapmobileCodeWSSoap = new MobileCodeWS().getMobileCodeWSSoap();
???
??? <wsdl:operationname="getMobileCodeInfo"...>? ===>查看方法名
??? 調用:
??? mobileCodeWSSoap.getMobileCodeInfo("15801551555",userId);
???
?
?
?
======================
API
javax.xml.ws.Endpoint類==>Web 服務端點。
??? abstract? void publish(Object serverContext)
?????? ? 在提供的服務器上下文中發布此端點。
??? abstract? void publish(String address)
?????? ? 在給定地址處發布此端點。
??? static Endpointpublish(String address, Object implementor)
?????? ? 在給定地址處針對指定的實現者對象創建并發布端點。
javax.jws.@WebService注解==>將 Java 類標記為實現Web Service,或者將 Java 接口標記為定義Web Service 接口。
??? StringendpointInterface
?????? ? 定義服務抽象 Web Service 協定的服務端點接口的完整名稱。
??? String name
?????? ? Web Service 的名稱。
??? String portName
?????? ? Web Service 的端口名稱。
??? String serviceName
?????? ? Web Service 的服務名稱。
??? String targetNamespace
?????? ? 如果 @WebService.targetNamespace 注釋是關于某一服務端點接口的,則 targetNamespace 用于 wsdl:portType(以及關聯的 XML 元素)的名稱空間。
??? String wsdlLocation
?????? ? 描述服務的預定義 WSDL 的位置
?
面試的時候會遇到的問題:
1、webservice就是在各個獨立的應用程序之間架起了通訊的橋梁。
?
2、webservice的內部實現原理
WebService實質就是通過HTTP協議發格式的XML格式。我們將這種格式的XML數據叫做SOPA.
?
webservice的框架有:
CXF,axis,axis2,xfire
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的WebService入门篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MULE ESB环境搭建和例子(通过装插
- 下一篇: 数组倒置解决方案