WebService學習
WebService和Cxf框架
WebService是用來調用遠程service的方法的。
Webservice需要遠程發布必須jdk1.7及以上版本
我們要發布遠程方法需要Endpoint這個抽象類 但是它有靜態方法 利用他的靜態方法publish進行發布
[email protected]類是遠程發布的類 [email protected]
以下是簡單的實例:
創建遠程連接的類
package cn.et; import javax.xml.ws.Endpoint; public class TestJaxWS {public static void main(String[] args){ /** * 調用它的靜態方法 * * 第一個參數就是你發布遠程能訪問的 協議、地址、 端口 * * 第二個參數是你需要發布的類 */ Endpoint.publish("http://127.0.0.1:8888/test", new Animal()); } }
創建實體類:
package cn.et; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class Animal { @WebMethod public void run(){ System.out.println("動物在跑"); } }
我們應該發布接口的 但是這個只能發布實現類 因此我就發布著實現類了 但是最後給客服端的只有接口
運行main發布 然後我們可以檢查一下是否發布成功需要用我們的地址加上?wsdl http://127.0.0.1:8888/test?wsdl
訪問出來是一個xml文件。
wsdl 是用來描述的 用來描述你的發布的方法有哪些
是WebService的描述語言 用戶在網絡上發布的web服務後不會告知第三方的具體實現
用戶如果需要調用方法必須使用webservice發布方發布的地址?wsdl去查看
查看會得到一個xml文件 客服端就可以通過這個地址的xml文件生成調用的Java代碼
jdk就提供了將這種xml文件轉成我們能夠調用的java代碼 命令如下:
首先dos命令進入jdk安裝的bin目錄下
按如下指令進行編輯:
wsimport -d 生成調用方代碼目錄 -p 生成包名 -keep wsdl路徑
-keep 表示要生成源碼
圖例:
出現上述圖示,則表示ldk將xml文件轉換成調用的java代碼成功。
web服務分為
提供方 提供一些方法 通過http協議暴露給調用方調用
調用方 通過wsdl地址解析被調用的方法信息從而調用方法
上面為提供方做的
調用方的使用
調用方我們來做一個關於手機號碼歸屬地的查詢
我們可以去web服務的一個網站去找我們需要的wsdl路徑
wsimport -d "E:\weathWebService\src" -p cn.et.ws -keep http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
首先得到它提供的接口
生成成功後你的路徑下面就會有一些類:
創建測試類:
package cn.et.ws.test; import cn.et.ws.MobileCodeWS; import cn.et.ws.MobileCodeWSSoap; public class Test { public static void main(String[] args) { //找到提供的接口方法 MobileCodeWS mws = new MobileCodeWS(); //創建接口對象實際調用的發布方的實現類 MobileCodeWSSoap mcw = mws.getMobileCodeWSSoap(); //輸入號碼進行查詢 String phon = mcw.getMobileCodeInfo("132******10", null); //輸出控制臺 System.out.println(phon); } }
測試結果如下:
Cxf
Cxf是webservice的一個框架關於Cxf的一些使用
使用Cxf做一個發布者(提供方)
首先添加如下依賴:
<!-- 定義的一個版本號 可以通過el表達式來取 --> <properties> <version>2.7.18</version> </properties> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <!-- 上面定義了一個<properties></properties> 版本號--> <version>${version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>${version}</version> </dependency> <!-- 日誌打印log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
創建實體類:
package cn.et.cxf; /** *計算機實現類 * */ public class CalcuServiceImpl implements CalcuService { /* (non-Javadoc) * @see cn.et.cxf.CalcuService#cal(int, int, java.lang.String) */ public String cal(int i,int j,String sign){ if(sign.equals("+")){ return (i+j)+""; }else if(sign.equals("-")){ return (i-j)+""; }else if(sign.equals("*")){ return (i*j)+""; }else if(sign.equals("/")){ return (i/j)+""; } return "不在計算範圍內"; } }
暴露的接口
Endpoint時註解寫在實現類中的 現在我們要寫在接口中,如下所示:
package cn.et.cxf; import javax.jws.WebMethod; import javax.jws.WebService; /** * 計算機接口 * * Endpoint時註解寫在實現類中的 現在我們要寫在接口中 * */ @WebService public interface CalcuService { /** * 兩位數的簡單計算機 * i 第一個數 * j 第二個數 * sign 表示使用什麽進行運算 * */ @WebMethod public abstract String cal(int i, int j, String sign); }
創建發布類:
package cn.et.cxf; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; /** * * 發布類 * * */ public class PubTest { public static void main(String[] args) { //借助對象用來發布 JaxWsServerFactoryBean jwfb = new JaxWsServerFactoryBean(); //設置地址 jwfb.setAddress("http://127.0.0.1:8888/calcu"); //設置調用方調用接口時 真實調用的方法 也就是實現類 jwfb.setServiceBean(new CalcuServiceImpl()); //設置暴漏的接口 這裏必須有暴露的接口 我們之前用Endpoint時候可以不用。 jwfb.setServiceClass(CalcuService.class); //發布出去 會返回service jwfb.create(); } }
使用Cxf做一個調用方
第一種方式
包路徑和提供方的路徑一致並且知道接口的情況下就可以使用這種方式
調用方知道接口
接口如下:
package cn.et.cxf; import javax.jws.WebMethod; import javax.jws.WebService; /** * 計算機接口 * * Endpoint時註解寫在實現類中的 現在我們要寫在接口中 * */ @WebService public interface CalcuService { /** * 兩位數的簡單計算機 * i 第一個數 * j 第二個數 * sign 表示使用什麽進行運算 * */ public abstract String cal(int i, int j, String sign); }
調用方調用:
package cn.et.cxf; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; /** * * 這種方式是我們知道接口之後我們就可以用這種方法。 * * */ public class ReceTestInter { public static void main(String[] args) { JaxWsProxyFactoryBean jwfb=new JaxWsProxyFactoryBean(); //通過地址找到提供方 jwfb.setAddress("http://127.0.0.1:7878/calcu"); //設置暴漏的接口 jwfb.setServiceClass(CalcuService.class); CalcuService ca=(CalcuService)jwfb.create(); String val = ca.cal(1, 2, "+"); System.out.println(val); } }
第二種方式就是之前的通過命令下載提供方提供的接口
Cxf也提供了和java一樣的下載接口的命令
wsdl2java -d 生成的路徑 -p 包名 wsdl地址
註意想直接用這個命令需要配置環境變量 不然要去命令的路徑下執行此命令
wsdl2java -d "E:\CxfRece\src" -p cn.et.cxf.gen http://127.0.0.1:7878/calcu?wsdl
生成之後如下:
然後我們可以通過不用Cxf的方式也能實現這個功能:
package cn.et.cxf.gen; public class Test { public static void main(String[] args) { CalcuServiceService css = new CalcuServiceService(); CalcuService cs = css.getCalcuServicePort(); String val = cs.cal(12, 13, "+"); System.out.println(val); } }
我們還可以通過遠程只要知道wsdl地址 知道方法幹什麽用 知道傳參就可以遠程調用
package cn.et.cxf.invonk; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; /** * 動態 只要知道wsdl地址 知道方法 參數就可以直接調用提供方提供的方法 * * */ public class InvonkTest { public static void main(String[] args) throws Exception { JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(); Client client = factory.createClient("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); //動態調用web服務 只需要知道 wsdl地址 方法名 傳入的參數 Object[] result = client.invoke("getMobileCodeInfo", "13268506263",null); System.out.println(result[0]); } }
WebService學習