日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

将Java服务公开为Web服务

發(fā)布時間:2023/12/3 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将Java服务公开为Web服务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本教程解決了開發(fā)人員面臨的最實際的情況。 大多數(shù)時候,我們可能需要將某些現(xiàn)有服務(wù)公開為Web服務(wù)。 在項目生命周期的不同階段可能會遇到這種情況。 如果這是初始階段,那么您幾乎是安全的,您可以為此做好充分的準(zhǔn)備。 但是,將要發(fā)生的情況是,僅在一半的開發(fā)完成或系統(tǒng)在生產(chǎn)環(huán)境中運(yùn)行后才提出此要求。

如果在最初的項目體系結(jié)構(gòu)中未考慮Web服務(wù),這將不會有些棘手。 您可能涉及不同種類的項目體系結(jié)構(gòu),并使用不同種類的技術(shù)。 作為開發(fā)人員,由于可能存在很多依賴關(guān)系,因此您不能更改某些體系結(jié)構(gòu)和配置。

Internet上的大多數(shù)教程都介紹了創(chuàng)建Web服務(wù)的基本內(nèi)容。 有時,“ Hello world”應(yīng)用程序或某個時候可能是像這樣的簡單計算器。 這些教程非常有助于您對Web服務(wù)有基本的了解。 但是現(xiàn)實世界的場景要比這復(fù)雜十倍,并且在遵循此類教程時必須面對困難。
實際情況

在本教程中,我將解釋“我們?nèi)绾握嬲鉀Q您的主管提出的現(xiàn)實世界的要求”。 我將解釋最近遇到的相同情況。
一個醫(yī)療保健組織在島上經(jīng)營著許多藥房。 他們有一個處理所有庫存,定價和開票,發(fā)行藥房物品等的Web應(yīng)用程序。他們需要通過Web服務(wù)公開藥房物品的價格,以便藥房中的客戶應(yīng)用程序可以通過Web服務(wù)訪問這些產(chǎn)品。 他們的Web應(yīng)用程序是在struts2,Spring和休眠的集成環(huán)境中開發(fā)的。 它具有所有Spring管理的DAO類以及服務(wù)類。 該應(yīng)用程序使用spring的自動接線技術(shù),組件掃描,事務(wù)管理等。在這種背景下,我需要將藥房價格作為Web服務(wù)公開。 那就是我們當(dāng)前藥房服務(wù)中的某些方法需要通過網(wǎng)絡(luò)服務(wù)公開給外部。

我將向您展示,如何通過對現(xiàn)有項目進(jìn)行最小的修改來實現(xiàn)這種要求。
附加圖書館

我將使用JAX-WS實現(xiàn)Web服務(wù)。 我在項目中使用了JAX-WS 2.2。 您可以從此處下載所需的JAX-WS版本。 這提供了一些可用于生成Web服務(wù)及其客戶端內(nèi)容的工具。 下載所需的庫版本后,將其解壓縮到本地計算機(jī)中的某些位置。 我已將其放在主文件夾中。
即:/home/semika/jaxws-ri-2.2

實施網(wǎng)絡(luò)服務(wù)

我已經(jīng)有了用于Web的內(nèi)部使用的Spring托管服務(wù)類和用于藥房項目的DAO類。 那些沒有暴露在外面。 假設(shè),我們需要公開findAll()方法,該方法以Web服務(wù)的形式返回“ PharmacyService”接口的“ PharmacyItem”列表。

為了方便起見,我將向您展示“ PharmacyServiceImpl” java類,該類用于執(zhí)行常規(guī)藥房項目操作。 這是通常的Springman豆。 請記住,此類的方法目前只能用于我們的Web應(yīng)用程序的內(nèi)部操作。 這些沒有作為Web服務(wù)公開。
PharmacyServiceImpl.java

/*** */ package com.slauto.service.pharmacy.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.slauto.exceptions.ServiceException; import com.slauto.model.pharmacy.PharmacyItem; import com.slauto.persist.pharmacy.api.PharmacyItemDao; import com.slauto.service.pharmacy.api.PharmacyItemService;/*** @author semika**/ @Service('pharmacyItemService') public class PharmacyItemServiceImpl implements PharmacyItemService {@Autowiredprivate PharmacyItemDao pharmacyItemDao;@Overridepublic List<Pharmacyitem> findAll() throws ServiceException {return pharmacyItemDao.findAllPharmacyItems();} }

如您所見,我在實現(xiàn)類中具有“ PharmacyItemDao”的自動連線實例。 眾所周知,這是一個Spring托管服務(wù)實現(xiàn)類。

接下來,我們將為上面的spring托管服務(wù)bean實現(xiàn)Web服務(wù)端點類,以將其方法公開為Web服務(wù)方法。 為了清楚起見,我創(chuàng)建了一個單獨的類作為Web服務(wù)端點。

PharmacyItemServiceEndPoint.java

package com.slauto.service.ws; import javax.jws.WebMethod; import javax.jws.WebService;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.slauto.exceptions.DataAccessException; import com.slauto.model.pharmacy.PharmacyItem; import com.slauto.service.pharmacy.api.PharmacyItemService;/*** @author semika**/ @WebService(serviceName='pharmacyItemService') public class PharmacyItemServiceEndPoint {@WebMethodpublic List<Pharmacyitem> findAll() throws DataAccessException {ApplicationContext context = new ClassPathXmlApplicationContext('applicationContext.xml'); PharmacyItemService pharmacyItemService = (PharmacyItemService)context.getBean('pharmacyItemService');return pharmacyItemService.findAll();} }

如您在這里看到的,我正在使用'pharmacyItemService'bean,我們的Web應(yīng)用程序使用它來訪問相關(guān)的服務(wù)方法。 “ pharmacyItemService”是一種常用的Spring mange bean,用于執(zhí)行日常藥房項目操作。 沒什么特別的。 特別注意,指示此類的@WebService@WebMethod注釋用作Web服務(wù)端點。

在這里,我通過應(yīng)用程序上下文獲取服務(wù)類實例。 此外,我們可以通過擴(kuò)展spring提供的' SpringBeanAutowiringSupport '的端點類,來使用Spring自動連接Web服務(wù)端點類。 在這種情況下,我們不需要像上面所做的那樣創(chuàng)建應(yīng)用程序上下文實例。 我無法完成這項工作,這就是為什么我使用了上述技術(shù)。

使用“ SpringBeanAutowiringSupport ”,在部署Web服務(wù)時(說明如下),我遇到了一個異常,很難解決。 所以我選擇了這項技術(shù)。 無論如何,我不喜歡上面的內(nèi)容:)。
生成Web服務(wù)

我正在使用JAX-WS提供的apt , wsgen和wsimport工具來生成JAX-WS服務(wù)中使用的可移植工件。 “ build.xml ”文件的相關(guān)ant目標(biāo)如下。
您可能需要在“ build.xml”文件頂部聲明的以下屬性。

屬性:

<property name='tomcat.home' value='/home/semika/apache-tomcat-7.0.25' /> <property name='jaxws.home' value='/home/semika/jaxws-ri-2.2' /> <property name='build.classes.home' value='${basedir}/WEB-INF/classes' /> <property name='java.home' value='/home/semika/java/jdk1.6.0_30'>

類路徑:

<path id='project.class.path'><pathelement location='${java.home}/../lib/tools.jar' /><fileset dir='${jaxws.home}/lib'><include name='*.jar' /></fileset><pathelement location='${basedir}/WEB-INF/classes' /><fileset dir='${basedir}/WEB-INF/lib' includes='*.jar' /> </path>

JAX-WS apt工具目標(biāo):

<target name='apt' depends='javac'><taskdef name='apt' classname='com.sun.tools.ws.ant.Apt'><classpath refid='project.class.path' /></taskdef><apt fork='true'debug='true'verbose='true'destdir='${basedir}/WEB-INF/classes'sourcedestdir='${basedir}/WEB-INF/src'sourcepath='${basedir}/WEB-INF/src'><classpath><path refid='project.class.path' /></classpath><option key='r' value='${basedir}/WEB-INF' /><source dir='${basedir}/WEB-INF/src'><include name='**/*.java'/></source></apt> </target>

如果您想進(jìn)一步了解JAX-WS提供的apt工具,請查看this 。 運(yùn)行apt目標(biāo)時,它將掃描源路徑(src文件夾),并為使用@WebService注釋的類生成所需的* .class和* .java文件。 在這種情況下,適用于“ PharmacyItemServiceEndPoint.java”。 如果查看“ PharmacyItemServiceEndPoint”所在的包,則可以看到它創(chuàng)建了一個名為“ jaxws ”的新包。 在該程序包中,我可以看到以下三個Java文件。
DataAccessExceptionBean.java
FindAll.java FindAllResponse.java

這些類由該工具生成,并且根據(jù)您的服務(wù)實現(xiàn)和Web服務(wù)涉及的相關(guān)類而有所不同。 實際上,您不必?fù)?dān)心這些生成的東西。
同樣,您可以在/ WEB-INF / classes文件夾下看到相關(guān)的* .class文件。

JAX-WS wsgen工具目標(biāo):

<target name='wsgen' depends='apt'> <taskdef name='wsgen' classname='com.sun.tools.ws.ant.WsGen'><classpath path='project.class.path'/></taskdef><wsgen xendorsed='true'sei='com.slauto.service.ws.PharmacyItemServiceEndPoint'destdir='${basedir}/WEB-INF/classes' resourcedestdir='${wsdl.dir}'sourcedestdir='${basedir}/WEB-INF/src' keep='true'verbose='true'genwsdl='true'><classpath refid='project.class.path'/></wsgen> </target>

wsgen工具將為我們的端點Web服務(wù)類生成WSDL文件。 運(yùn)行此目標(biāo)后,請查看$ {wsdl.dir}的位置。 您可以看到我們的WSDL文件已經(jīng)生成。 如果您想進(jìn)一步了解JAX-WS提供的wsgen工具,請研究this 。
部署Web服務(wù)

我想用通常的服務(wù)器啟動來部署Web服務(wù)。 因此,我必須將以下配置添加到web.xml文件中。

<listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet><servlet-name>pharmacyItemService</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>pharmacyItemService</servlet-name><url-pattern>/pharmacyItemService</url-pattern> </servlet-mapping>

正如我之前告訴您的那樣,當(dāng)部署具有從' SpringBeanAutowiringSupport '擴(kuò)展的端點類的Web服務(wù)時,它給出了一個例外。 因此,我決定通過應(yīng)用程序上下文獲取服務(wù)bean。 如果您能解決這種情況,請直接發(fā)布。

而且,您需要在WEB-INF文件夾下創(chuàng)建sun-jaxws.xml并聲明Web服務(wù)端點,如下所示。

<?xml version='1.0' encoding='UTF-8'?> <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'> <endpointname='pharmacyItemService'implementation='com.slauto.service.ws.PharmacyItemServiceEndPoint'url-pattern='/pharmacyItemService'/> </endpoints>

我正在使用apache tomcat 7.0.25部署Web服務(wù)。 您需要告訴tomcat啟動tomcat時可以在哪里找到JAX-WS庫。 您可以編輯位于CATALINA_HOME / conf文件夾中的“ catalina.properties ”文件。 查找common.loader屬性。 大多數(shù)情況如下。

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar

對其進(jìn)行如下修改。

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/home/semika/jaxws-ri-2.2/lib/*.jar

如您所見,我已經(jīng)在逗號分隔列表的末尾添加了我的JAX-WS庫路徑。 這些類對tomcat內(nèi)部類和tomcat容器中部署的所有Web應(yīng)用程序均可見。 現(xiàn)在,您可以將.war文件復(fù)制到tomcat的webapps文件夾中,然后啟動tomcat。 您的Web服務(wù)應(yīng)已部署。 為了確認(rèn)您的Web服務(wù)已正確部署,您可以檢查它的WSDL 。 對于WSDL文件,您應(yīng)該以以下格式檢查URL。

http:// localhost:8080 / <您的上下文名稱> / pharmacyItemService?wsdl

如果您可以在瀏覽器中看到WSDL文件,則說明您已經(jīng)完成,您已經(jīng)成功部署了Web服務(wù)。

生成Web服務(wù)客戶端

現(xiàn)在,我們已經(jīng)部署了Web服務(wù)。 接下來,我們將看到如何編寫客戶端類以使用Java程序訪問Web服務(wù)。 您可以創(chuàng)建一個簡單的Java項目,并在其中使用以下build.xml文件。 我已經(jīng)放置了完整的build.xml文件用于客戶端生成。 我正在使用JAX-WS附帶的wsimport工具來生成Web服務(wù)客戶端工件。

<?xml version='1.0' encoding='utf-8' ?> <project name='WS-client' default='wsimport' basedir='.'><property name='jaxws.home' value='/home/semika/jaxws-ri-2.2' /><property name='java.home' value='/home/semika/java/jdk1.6.0_30'/><path id='jaxws.classpath'><pathelement location='${java.home}/../lib/tools.jar' /><fileset dir='${jaxws.home}/lib'><include name='*.jar' /></fileset></path><target name='wsimport'> <taskdef name='wsimport' classname='com.sun.tools.ws.ant.WsImport'><classpath path='jaxws.classpath'/></taskdef><wsimport xendorsed='true'debug='true'verbose='true'keep='true'destdir='src'package='com.slauto.service'wsdl='http://localhost:8080/slautomanage/pharmacyItemService?wsdl'></wsimport></target> </project>

如果您想進(jìn)一步了解wsimport工具,可以查看this 。 運(yùn)行上述目標(biāo)后,只需看看在wsimport屬性下指定的包即可。 您將看到生成的一組Java文件。 您可以將它們編譯并捆綁到單個client.jar文件中,并且可以與需要此Web服務(wù)的任何Java項目一起使用。
我創(chuàng)建了一個非常簡單的java類,以通過Web服務(wù)獲取藥房信息。

客戶端程序

package com.slauto.client;import java.util.List;import com.slauto.service.PharmacyItem; import com.slauto.service.PharmacyItemService; import com.slauto.service.PharmacyItemServiceEndPoint;/*** @author semika**/ public class Client {/*** @param args*/public static void main(String[] args) {PharmacyItemService p = new PharmacyItemService();PharmacyItemServiceEndPoint ep = p.getPharmacyItemServiceEndPointPort();List<PharmacyItem> pharmacyItems = ep.findAll();for (PharmacyItem pharmacyItem : pharmacyItems) {System.out.println(pharmacyItem.getCode()); }}}

太好了嗎? 運(yùn)行該課程后,您將看到顯示的藥房商品代碼列表。 這些藥房信息通過具有復(fù)雜環(huán)境的Web應(yīng)用程序部署的Web服務(wù)來傳遞。
就是本教程中的內(nèi)容。 希望對您有所幫助,如果您從本教程中學(xué)習(xí)到一些東西,請不要忘了發(fā)表評論。

參考: 如何將現(xiàn)有服務(wù)公開為Web服務(wù)? 從我們的JCG合作伙伴 Semika loku kaluge在Code Box博客上獲得。


翻譯自: https://www.javacodegeeks.com/2012/06/expose-java-service-as-web-service.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的将Java服务公开为Web服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。