jax-ws handler 的詳解及簡(jiǎn)單實(shí)例
jax-ws handler 的詳解及簡(jiǎn)單實(shí)例
aop技術(shù)一般用于某個(gè)對(duì)象的函數(shù)調(diào)用的日志,認(rèn)證等。
webservice是遠(yuǎn)程的函數(shù)調(diào)用,也需要類(lèi)似的aop方法,舉例jax-ws的webservice,handler就相當(dāng)于aop。
舉一例jax-ws handler例子
先寫(xiě)個(gè)webservice
import javax.jws.HandlerChain; import javax.jws.WebMethod; import javax.jws.WebService; @WebService @HandlerChain(file="handlers.xml") public class Hello { @WebMethod() public String sayHello(String name) { return "Hello " + name + "."; } }
超級(jí)傻瓜的webservice,唯一特別的就是@HandlerChain標(biāo)注,其中的handlers.xml是一個(gè)描述jax-ws 的handler鏈的xml文件,這個(gè)文件可以放在與此源文件同一目錄下。
來(lái)看一下handlers.xml的內(nèi)容
<?xml version="1.0" encoding="UTF-8"?> <handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-name>ServiceSOAPHandler</handler-name> <handler-class>com.ws.handler.HelloHandler</handler-class> </handler> </handler-chain> </handler-chains>
其中定義了handler鏈,鏈里只有一個(gè)handler,也可以包括多個(gè)handler
再看看handler的具體實(shí)現(xiàn):
import java.util.Set; import javax.xml.namespace.QName; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; public class HelloHandler implements SOAPHandler<SOAPMessageContext> { @Override public boolean handleMessage(SOAPMessageContext context) { System.out.println(context.get(MessageContext.WSDL_SERVICE).toString()); return true; } @Override public boolean handleFault(SOAPMessageContext context) { // TODO Auto-generated method stub return true; } @Override public void close(MessageContext context) { // TODO Auto-generated method stub } @Override public Set<QName> getHeaders() { // TODO Auto-generated method stub return null; } }
一個(gè)handler必須實(shí)現(xiàn)SOAPHandler或LogicalHandler接口,至于他們兩者的區(qū)別,與Handler接口的關(guān)系,以及<>中的XXXContext的意義,請(qǐng)參考jaxws的spec,這里只是helloworld例子。
所有接口定義的方法實(shí)際上我就實(shí)現(xiàn)了一個(gè),打印了被調(diào)用的webservice的名字,實(shí)際上可以在這里做很多事情,比如修改soap中的內(nèi)容,添加或刪除xml的標(biāo)簽,添加刪除soap附件,獲取soap相關(guān)的字段,更形象的功能可以有加解密,日志等等。
最后還要做一些相關(guān)配置文件修改:
在web.xml中添加:
<listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>wsservlet</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>wsservlet</servlet-name> <url-pattern>/helloservice</url-pattern> </servlet-mapping>
實(shí)際上當(dāng)有類(lèi)標(biāo)有@webservice的標(biāo)注,容器會(huì)自動(dòng)把他變成一個(gè)webservice,但是我試過(guò)這里必須要用上面這種方法,也就是利用jaxws的運(yùn)行時(shí)以wsservlet來(lái)匹配請(qǐng)求,并且在之前就通過(guò)wsservletcontextlistener在初始上下文時(shí)就指定加載某個(gè)類(lèi)作為webservice,這個(gè)listener會(huì)自動(dòng)檢測(cè)webroot下(和web.xml同一目錄)的名為sun-jaxws.xml的文件,其中包含了webservice具體實(shí)現(xiàn)的表述。
在這里sun-jaxws.xml的內(nèi)容為:
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="helloservice" implementation="com.ws.service.Hello" url-pattern="/helloservice" /> </endpoints>
這其中指定的那個(gè)實(shí)現(xiàn)可以是一個(gè)有@Webservice的類(lèi),也可以是實(shí)現(xiàn)Provider接口的類(lèi),相關(guān)Provider可以查看官方spec,它是jax-rs的基礎(chǔ)。
打包,部署,我是部署在glassfish里的,找個(gè)webservice的測(cè)試工具,eclipse jee套裝里有自帶的webservice客戶(hù)端測(cè)試的。
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Intellij IDEA 2017.3使用Lombok及常用注解介紹
這篇文章主要介紹了Intellij IDEA 2017.3使用Lombok及常用注解介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Spring Boot 動(dòng)態(tài)數(shù)據(jù)源示例(多數(shù)據(jù)源自動(dòng)切換)
本篇文章主要介紹了Spring Boot 動(dòng)態(tài)數(shù)據(jù)源示例(多數(shù)據(jù)源自動(dòng)切換),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02MyBatis實(shí)戰(zhàn)之Mapper注解的示例
本文主要介紹了MyBatis實(shí)戰(zhàn)之Mapper注解的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載
這篇文章主要為大家詳細(xì)介紹了java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05SpringBoot中的maven插件spring-boot-maven-plugin使用
這篇文章主要介紹了SpringBoot中的maven插件spring-boot-maven-plugin使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java?代碼本地設(shè)置Hadoop用戶(hù)名密碼的方法
在Hadoop環(huán)境中,通常使用Kerberos進(jìn)行身份驗(yàn)證,這篇文章主要介紹了Java?代碼本地設(shè)置Hadoop用戶(hù)名密碼的方法,需要的朋友可以參考下2024-08-08