asp模版网站如何做优化,长沙网站排名公司哪家好,wordpress插表格,app界面生成器本教程解决了开发人员面临的最实际的情况。 大多数时候#xff0c;我们可能需要将某些现有服务公开为Web服务。 在项目生命周期的不同阶段可能会遇到这种情况。 如果这是初始阶段#xff0c;那么您几乎是安全的#xff0c;您可以为此做好充分的准备。 但是#xff0c;将要发… 本教程解决了开发人员面临的最实际的情况。 大多数时候我们可能需要将某些现有服务公开为Web服务。 在项目生命周期的不同阶段可能会遇到这种情况。 如果这是初始阶段那么您几乎是安全的您可以为此做好充分的准备。 但是将要发生的情况是仅在一半的开发完成或系统在生产环境中运行后才提出此要求。 如果在最初的项目体系结构中未考虑Web服务这将不会有些棘手。 您可能涉及不同种类的项目体系结构并使用不同种类的技术。 作为开发人员由于可能存在很多依赖关系因此您不能更改某些体系结构和配置。 Internet上的大多数教程都介绍了创建Web服务的基本内容。 有时“ Hello world”应用程序或某个时候可能是像这样的简单计算器。 这些教程非常有助于您对Web服务有基本的了解。 但是现实世界的场景要比这复杂十倍并且在遵循此类教程时必须面对困难。 实际情况 在本教程中我将解释“我们如何真正解决您的主管提出的现实世界的要求”。 我将解释最近遇到的相同情况。 一个医疗保健组织在岛上经营着许多药房。 他们有一个处理所有库存定价和开票发行药房物品等的Web应用程序。他们需要通过Web服务公开药房物品的价格以便药房中的客户应用程序可以通过Web服务访问这些产品。 他们的Web应用程序是在struts2Spring和休眠的集成环境中开发的。 它具有所有Spring管理的DAO类以及服务类。 该应用程序使用spring的自动接线技术组件扫描事务管理等。在这种背景下我需要将药房价格作为Web服务公开。 那就是我们当前药房服务中的某些方法需要通过网络服务公开给外部。 我将向您展示如何通过对现有项目进行最小的修改来实现这种要求。 附加图书馆 我将使用JAX-WS实现Web服务。 我在项目中使用了JAX-WS 2.2。 您可以从此处下载所需的JAX-WS版本。 这提供了一些可用于生成Web服务及其客户端内容的工具。 下载所需的库版本后将其解压缩到本地计算机中的某些位置。 我已将其放在主文件夹中。 即/home/semika/jaxws-ri-2.2 实施网络服务 我已经有了用于Web的内部使用的Spring托管服务类和用于药房项目的DAO类。 那些没有暴露在外面。 假设我们需要公开findAll方法该方法以Web服务的形式返回“ PharmacyService”接口的“ PharmacyItem”列表。 为了方便起见我将向您展示“ PharmacyServiceImpl” java类该类用于执行常规药房项目操作。 这是通常的Springman豆。 请记住此类的方法目前只能用于我们的Web应用程序的内部操作。 这些没有作为Web服务公开。 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 ListPharmacyitem findAll() throws ServiceException {return pharmacyItemDao.findAllPharmacyItems();}
} 如您所见我在实现类中具有“ PharmacyItemDao”的自动连线实例。 众所周知这是一个Spring托管服务实现类。 接下来我们将为上面的spring托管服务bean实现Web服务端点类以将其方法公开为Web服务方法。 为了清楚起见我创建了一个单独的类作为Web服务端点。 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(serviceNamepharmacyItemService)
public class PharmacyItemServiceEndPoint {WebMethodpublic ListPharmacyitem findAll() throws DataAccessException {ApplicationContext context new ClassPathXmlApplicationContext(applicationContext.xml); PharmacyItemService pharmacyItemService (PharmacyItemService)context.getBean(pharmacyItemService);return pharmacyItemService.findAll();}
} 如您在这里看到的我正在使用pharmacyItemServicebean我们的Web应用程序使用它来访问相关的服务方法。 “ pharmacyItemService”是一种常用的Spring mange bean用于执行日常药房项目操作。 没什么特别的。 特别注意指示此类的WebService和WebMethod注释用作Web服务端点。 在这里我通过应用程序上下文获取服务类实例。 此外我们可以通过扩展spring提供的 SpringBeanAutowiringSupport 的端点类来使用Spring自动连接Web服务端点类。 在这种情况下我们不需要像上面所做的那样创建应用程序上下文实例。 我无法完成这项工作这就是为什么我使用了上述技术。 使用“ SpringBeanAutowiringSupport ”在部署Web服务时说明如下我遇到了一个异常很难解决。 所以我选择了这项技术。 无论如何我不喜欢上面的内容:)。 生成Web服务 我正在使用JAX-WS提供的apt wsgen和wsimport工具来生成JAX-WS服务中使用的可移植工件。 “ build.xml ”文件的相关ant目标如下。 您可能需要在“ build.xml”文件顶部声明的以下属性。 属性 property nametomcat.home value/home/semika/apache-tomcat-7.0.25 /
property namejaxws.home value/home/semika/jaxws-ri-2.2 /
property namebuild.classes.home value${basedir}/WEB-INF/classes /
property namejava.home value/home/semika/java/jdk1.6.0_30 类路径 path idproject.class.pathpathelement location${java.home}/../lib/tools.jar /fileset dir${jaxws.home}/libinclude name*.jar //filesetpathelement location${basedir}/WEB-INF/classes /fileset dir${basedir}/WEB-INF/lib includes*.jar /
/path JAX-WS apt工具目标 target nameapt dependsjavactaskdef nameapt classnamecom.sun.tools.ws.ant.Aptclasspath refidproject.class.path //taskdefapt forktruedebugtrueverbosetruedestdir${basedir}/WEB-INF/classessourcedestdir${basedir}/WEB-INF/srcsourcepath${basedir}/WEB-INF/srcclasspathpath refidproject.class.path //classpathoption keyr value${basedir}/WEB-INF /source dir${basedir}/WEB-INF/srcinclude name**/*.java//source/apt
/target 如果您想进一步了解JAX-WS提供的apt工具请查看this 。 运行apt目标时它将扫描源路径src文件夹并为使用WebService注释的类生成所需的* .class和* .java文件。 在这种情况下适用于“ PharmacyItemServiceEndPoint.java”。 如果查看“ PharmacyItemServiceEndPoint”所在的包则可以看到它创建了一个名为“ jaxws ”的新包。 在该程序包中我可以看到以下三个Java文件。 DataAccessExceptionBean.java FindAll.java FindAllResponse.java 这些类由该工具生成并且根据您的服务实现和Web服务涉及的相关类而有所不同。 实际上您不必担心这些生成的东西。 同样您可以在/ WEB-INF / classes文件夹下看到相关的* .class文件。 JAX-WS wsgen工具目标 target namewsgen dependsapt taskdef namewsgen classnamecom.sun.tools.ws.ant.WsGenclasspath pathproject.class.path//taskdefwsgen xendorsedtrueseicom.slauto.service.ws.PharmacyItemServiceEndPointdestdir${basedir}/WEB-INF/classes resourcedestdir${wsdl.dir}sourcedestdir${basedir}/WEB-INF/src keeptrueverbosetruegenwsdltrueclasspath refidproject.class.path//wsgen
/target wsgen工具将为我们的端点Web服务类生成WSDL文件。 运行此目标后请查看$ {wsdl.dir}的位置。 您可以看到我们的WSDL文件已经生成。 如果您想进一步了解JAX-WS提供的wsgen工具请研究this 。 部署Web服务 我想用通常的服务器启动来部署Web服务。 因此我必须将以下配置添加到web.xml文件中。 listenerlistener-classcom.sun.xml.ws.transport.http.servlet.WSServletContextListener/listener-class
/listener
servletservlet-namepharmacyItemService/servlet-nameservlet-classcom.sun.xml.ws.transport.http.servlet.WSServlet/servlet-classload-on-startup1/load-on-startup
/servlet
servlet-mappingservlet-namepharmacyItemService/servlet-nameurl-pattern/pharmacyItemService/url-pattern
/servlet-mapping 正如我之前告诉您的那样当部署具有从 SpringBeanAutowiringSupport 扩展的端点类的Web服务时它给出了一个例外。 因此我决定通过应用程序上下文获取服务bean。 如果您能解决这种情况请直接发布。 而且您需要在WEB-INF文件夹下创建sun-jaxws.xml并声明Web服务端点如下所示。 ?xml version1.0 encodingUTF-8?
endpoints xmlnshttp://java.sun.com/xml/ns/jax-ws/ri/runtime version2.0 endpointnamepharmacyItemServiceimplementationcom.slauto.service.ws.PharmacyItemServiceEndPointurl-pattern/pharmacyItemService/
/endpoints 我正在使用apache tomcat 7.0.25部署Web服务。 您需要告诉tomcat启动tomcat时可以在哪里找到JAX-WS库。 您可以编辑位于CATALINA_HOME / conf文件夹中的“ catalina.properties ”文件。 查找common.loader属性。 大多数情况如下。 common.loader${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar 对其进行如下修改。 common.loader${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/home/semika/jaxws-ri-2.2/lib/*.jar 如您所见我已经在逗号分隔列表的末尾添加了我的JAX-WS库路径。 这些类对tomcat内部类和tomcat容器中部署的所有Web应用程序均可见。 现在您可以将.war文件复制到tomcat的webapps文件夹中然后启动tomcat。 您的Web服务应已部署。 为了确认您的Web服务已正确部署您可以检查它的WSDL 。 对于WSDL文件您应该以以下格式检查URL。 http// localhost8080 / 您的上下文名称 / pharmacyItemServicewsdl 如果您可以在浏览器中看到WSDL文件则说明您已经完成您已经成功部署了Web服务。 生成Web服务客户端 现在我们已经部署了Web服务。 接下来我们将看到如何编写客户端类以使用Java程序访问Web服务。 您可以创建一个简单的Java项目并在其中使用以下build.xml文件。 我已经放置了完整的build.xml文件用于客户端生成。 我正在使用JAX-WS附带的wsimport工具来生成Web服务客户端工件。 ?xml version1.0 encodingutf-8 ?
project nameWS-client defaultwsimport basedir.property namejaxws.home value/home/semika/jaxws-ri-2.2 /property namejava.home value/home/semika/java/jdk1.6.0_30/path idjaxws.classpathpathelement location${java.home}/../lib/tools.jar /fileset dir${jaxws.home}/libinclude name*.jar //fileset/pathtarget namewsimport taskdef namewsimport classnamecom.sun.tools.ws.ant.WsImportclasspath pathjaxws.classpath//taskdefwsimport xendorsedtruedebugtrueverbosetruekeeptruedestdirsrcpackagecom.slauto.servicewsdlhttp://localhost:8080/slautomanage/pharmacyItemService?wsdl/wsimport/target
/project 如果您想进一步了解wsimport工具可以查看this 。 运行上述目标后只需看看在wsimport属性下指定的包即可。 您将看到生成的一组Java文件。 您可以将它们编译并捆绑到单个client.jar文件中并且可以与需要此Web服务的任何Java项目一起使用。 我创建了一个非常简单的java类以通过Web服务获取药房信息。 客户端程序 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();ListPharmacyItem pharmacyItems ep.findAll();for (PharmacyItem pharmacyItem : pharmacyItems) {System.out.println(pharmacyItem.getCode()); }}} 太好了吗 运行该课程后您将看到显示的药房商品代码列表。 这些药房信息通过具有复杂环境的Web应用程序部署的Web服务来传递。 就是本教程中的内容。 希望对您有所帮助如果您从本教程中学习到一些东西请不要忘了发表评论。 参考 如何将现有服务公开为Web服务 从我们的JCG合作伙伴 Semika loku kaluge在Code Box博客上获得。 翻译自: https://www.javacodegeeks.com/2012/06/expose-java-service-as-web-service.html