webservice2015.12.26课堂笔记
- 格式:docx
- 大小:441.27 KB
- 文档页数:33
说明:在编程中我们会在某个类、方法或变量前面加上@x,来表明这个类、方法或变量具有x属性。
1.Servlet1).Servlet 是什么?Java Servlet 是运行在Web 服务器或应用服务器上的程序,它是作为来自Web 浏览器或其他HTTP 客户端的请求和HTTP 服务器上的数据库或应用程序之间的中间层。
2).Servlet 有以下几点优势(1).性能明显更好。
(2).Servlet 在Web 服务器的地址空间内执行。
这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
(3).Servlet 是独立于平台的,因为它们是用Java 编写的。
(4).服务器上的Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。
因此,Servlet 是可信的。
(5).Java 类库的全部功能对Servlet 来说都是可用的。
它可以通过sockets 和RMI 机制与applets、数据库或其他软件进行交互。
3).Servlet 架构过程为:(1) 客户端发送请求至服务器端;(2) 服务器将请求信息发送至Servlet;(3) Servlet 生成响应内容并将其传给服务器。
响应内容动态生成,通常取决于客户端的请求;(4) 服务器将响应返回给客户端。
4).servlet生命周期(1).客户端请求该Servlet;(2).加载Servlet 类到内存;(3).实例化并调用init()方法初始化该Servlet;(4).service()(根据请求方法不同调用doGet() 或者doPost(),此外还有doGet()、doPut()、doTrace()、doDelete()、doOptions());(5).destroy()。
5).看一下老师ppt和教程(这个很不错/holandstone/article/details/16844957)想学的更好就看servlet-api.chm2.web socket(1).web socket:是HTML5一种新的协议。
1、WebService调用方法:在reference处右击然后再选择“Add Service reference”,(呵呵,地球人都知道),关键是代码处怎么调用,如果当前项目是Web Application或web site,则调用代码为创建的“Service名字.Service里面的类名”,如:ServiceReference2.WebService1 service = new ServiceReference2.WebService1();service.HelloWorld();如果当前项目是App Application中ClassLibrary,则调用代码为创建的“Service名字.Service里面类的SoapClient类名”(注:SoapClient类是你在添加Web引用时,当前项目自动为你生成的),代码举例如下:ServiceReference2.WebService1SoapClient service =new ServiceReference2.WebService1SoapClient ();service .HelloWorld();2、Web Service相关配置问题,当我们在引用WebService时,系统会自己为我们生成相关配置信息,如web Service的url,通信协议格式,但需要注意的,如果我们引用WebService的项目是一个ClassLibrary项目,则我们需要在将ClassLibrary项目的app.config的system.serviceModel节内容,复制到调用ClassLibrary项目的App Application 或Web Application项目的配置文件中,否则运行时会报找不到“endpoint”节错误,这实际上跟数据库连接配置的原理是一样的。
数据访问层在程序发布时,只会去读取整个运行项目的.config文件,不会再读取数据访问层项目的config文件。
WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单关键字: webservice cxf soaWebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web 系统,这样的业务需求自然需要通过WebService进行信息数据的操作。
下面就将我们在开发中摸索的一点经验教训总结以下,以供大家参考.在WebService开发笔记 2 -- VS 2005 访问WebServcie更简单中作一个跨平台访问WebServcie服务的例子....在WebService开发笔记 3 -- 增强访问 WebService 的安全性通过一个简单的用户口令验证机制来加强一下WebService的安全性....我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate;1.首先集成Apacha CXF WebService 到 Spring 框架中;apache cxf 下载地址:/dist/incubator/cxf/2.0.4-incubator/apache -cxf-2.0.4-incubator.zip在spring context配置文件中引入以下cxf配置Xml代码1.<import resource="classpath*:META-INF/cxf/cxf.xml"/>2.<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml"/>3.<import resource="classpath*:META-INF/cxf/cxf-servlet.xml"/>在web.xml中添加过滤器:Xml代码1.<servlet>2.<servlet-name>CXFServlet</servlet-name>3.<servlet-class>4. org.apache.cxf.transport.servlet.CXFServlet5.</servlet-class>6.</servlet>7.<servlet-mapping>8.<servlet-name>CXFServlet</servlet-name>9.<url-pattern>/services/*</url-pattern>10.</servlet-mapping>2.开发服务端WebService接口:Java代码1./**2. * WebService接口定义类.3. *4. * 使用@WebService将接口中的所有方法输出为Web Service.5. * 可用annotation对设置方法、参数和返回值在WSDL中的定义.6. */7.@WebService8.public interface WebServiceSample {9.10.11. /**12. * 一个简单的方法,返回一个字符串13. * @param hello14. * @return15. */16. String say(String hello);17.18. /**19. * 稍微复杂一些的方法,传递一个对象给服务端处理20. * @param user21. * @return22. */23. String sayUserName(24. @WebParam(name = "user")25. UserDTO user);26.27. /**28. * 最复杂的方法,返回一个List封装的对象集合29. * @return30. */31. public32. @WebResult(partName="o")33. ListObject findUsers();34.35.}由简单到复杂定义了三个接口,模拟业务需求;3.实现接口Java代码1./**2. * WebService实现类.3. *4. * 使用@WebService指向Interface定义类即可.5. */6.@WebService(endpointInterface = ".examples.webservice.WebServiceSample")7.public class WebServiceSampleImpl implements WebServiceSample {8.9. public String sayUserName(UserDTO user) {10. return "hello "+user.getName();11. }12.13. public String say(String hello) {14. return "hello "+hello;15. }16.17. public ListObject findUsers() {18. ArrayList<Object> list = new ArrayList<Object>();19.20. list.add(instancUser(1,"lib"));21. list.add(instancUser(2,"mld"));22. list.add(instancUser(3,"lq"));23. list.add(instancUser(4,"gj"));24. ListObject o = new ListObject();25. o.setList(list);26. return o;27. }28.29. private UserDTO instancUser(Integer id,String name){30. UserDTO user = new UserDTO();31. user.setId(id);32. user.setName(name);33. return user;34. }35.}4.依赖的两个类:用户对象与List对象Java代码1./**2. * Web Service传输User信息的DTO.3. *4. * 分离entity类与web service接口间的耦合,隔绝entity类的修改对接口的影响.5. * 使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定.6. *7. */8.@XmlAccessorType(XmlAccessType.FIELD)9.@XmlType(name = "User")10.public class UserDTO {11.12. protected Integer id;13.14. protected String name;15.16. public Integer getId() {17. return id;18. }19.20. public void setId(Integer value) {21. id = value;22. }23.24. public String getName() {25. return name;26. }27.28. public void setName(String value) {29. name = value;30. }31.}关于List对象,参照了有关JWS的一个问题中的描述:DK6.0 自带的WebService 中 WebMethod的参数好像不能是ArrayList 或者其他List传递List需要将List 包装在其他对象内部才行 (个人理解如有不对请指出) ,我在实践中也遇到了此类问题.通过以下封装的对象即可以传递List对象.Java代码1./**2. * <p>Java class for listObject complex type.3. *4. * <p>The following schema fragment specifies the expected content contained within this class.5. *6. * <pre>7. * <complexType name="listObject">8. * <complexContent>9. * <restriction base="{/2001/XMLSchema}anyType">10. * <sequence>11. * <element name="list" type="{/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>12. * </sequence>13. * </restriction>14. * </complexContent>15. * </complexType>16. * </pre>17. *18. *19. */20.@XmlAccessorType(XmlAccessType.FIELD)21.@XmlType(name = "listObject", propOrder = { "list" })22.public class ListObject {23.24. @XmlElement(nillable = true)25. protected List<Object> list;26.27. /**28. * Gets the value of the list property.29. *30. * <p>31. * This accessor method returns a reference to the live list,32. * not a snapshot. Therefore any modification you make to the33. * returned list will be present inside the JAXB object.34. * This is why there is not a <CODE>set</CODE> method for the list property.35. *36. * <p>37. * For example, to add a new item, do as follows:38. * <pre>39. * getList().add(newItem);40. * </pre>41. *42. *43. * <p>44. * Objects of the following type(s) are allowed in the list45. * {@link Object }46. *47. *48. */49. public List<Object> getList() {50. if (list == null) {51. list = new ArrayList<Object>();52. }53. return this.list;54. }55.56. public void setList(ArrayList<Object> list) {57. this.list = list;58. }59.60.}5.WebService 服务端 spring 配置文件 ws-context.xmlXml代码1.<beans xmlns="/schema/beans"2.xmlns:xsi="http://www.w/2001/XMLSchema-instance"3.xmlns:jaxws="/jaxws"4.xsi:schemaLocation="/jaxws http://cxf./schemas/jaxws.xsd /sch ema/beans /schema/beans/spring-b eans.xsd"5.default-autowire="byName"default-lazy-init="true">6.7.<jaxws:endpoint id="webServiceSample"8.address="/WebServiceSample"implementor=".coral.biz.examples.webservice.WebServiceSampleImpl"/>9.10.</beans>WebService 客户端 spring 配置文件 wsclient-context.xmlXml代码1.<beans xmlns="/schema/beans"2.xmlns:xsi="http://www.w/2001/XMLSchema-instance"3.xmlns:jaxws="/jaxws"4.xsi:schemaLocation="/jaxws http://cxf./schemas/jaxws.xsd /sch ema/beans /schema/beans/spring-b eans.xsd"5.default-autowire="byName"default-lazy-init="true">6.7. <!-- ws client -->8.<bean id="identityValidateServiceClient"class=".coral.admin.service.IdentityValidateService"9.factory-bean="identityValidateServiceClientFactory"factory-method="create"/>10.11. <bean id="identityValidateServiceClientFactory"12. class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">13. <property name="serviceClass"14. value=".coral.admin.service.IdentityValidateService"/>15. <property name="address"16. value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>17. </bean>18.19.</beans>6.发布到tomcat服务器以后通过以下地址即可查看自定义的webservice接口生成的wsdl:http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl7.调用WebService接口的Junit单元测试程序Java代码1.package test.coral.sample;2.3.import org.springframework.test.AbstractDependencyInjectionSpringContextTests;4.5.import .examples.webservice.WebServiceSample;6.import erDTO;7.8.public class TestWebServiceSample extends9. AbstractDependencyInjectionSpringContextTests {10. WebServiceSample webServiceSampleClient;11.12. public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {13. this.webServiceSampleClient = webServiceSampleClient;14. }15.16. @Override17. protected String[] getConfigLocations() {18. setAutowireMode(AUTOWIRE_BY_NAME);19. //spring 客户端配置文件保存位置20. return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };21. }22.23. public void testWSClinet(){24. Assert.hasText(webServiceSampleClient.say(" world"));25. }26.}。
Web 服务概念Web服务建立于面向服务体系结构之上的,可以将软件组件(来自不同系统的应用函数,对象,)发布为服务Web服务基于专门使用XML的开发式标准和技术实现Web服务原因1.Web服务可以拆穿防火墙,通过基于XML的PRC机制调用2.Web服务提供基于XML消息交换的跨平台跨语言的解决方案3.Web服务可以使用轻量级结构简化应用系统集成,而不影响可伸缩性4.Web服务可以实现异源程序之间互操作Web服务基本模型服务提供方服务代理方服务请求方Web服务标准XML SOAP WSDL UDDIWeb服务面临的难题1.分布式事务2.服务质量3.安全性Web服务的优点1.提供简单的机制,使应用程序称为任何人可以随时随地通过任何设备访问的服务2.帮助实现企业内部,企业之间的通信3.Internate 中应用程序通行的灵活性,灵敏性4.可以通过代理动态定位和调用服务Web服务体系结构和技术Web服务体系结构概念1.SOAP 在服务提供方和服务请求方之间交换信息充当消息交换协议。
2.WSDL 是将web服务描述为操作集,并将输入输出描述为消息3.UDDI 一种通过注册表中注册Web服务并划分类别的机制Web服务通信模型1.基于PRC的通信模型基于PRC通信模型定义基于请求/响应得异步通信2.基于消息交换的通信模型基于消息交换的通信模型定义松散关联和文档驱动的通信。
调用基于消息交换的服务提供方的服务请求无需等待响应实现Web服务1.服务提供方创建基于SOAP服务的商业应用程序接口,发布到网络。
2.服务提供方使用服务代理基于WSDL服务描述,服务代理方通常是一个UDDI注册表3.UDDI注册表将服务描述存储为绑定的模版和到服务提供方环境的WSDL和URL 4.服务请求方通过UDDI注册表找到所需的服务和绑定的信息和URL找到服务提供方5.服务请求方使用绑定信息激活服务提供器检索已注册的WSDL服务描述,建立与SOAP 的服务间的通信。
WebService CXF学习(入门篇1):CXF由来WebService介绍WebService让一个程序可以透明地调用互联网程序,不用管具体的实现细节。
只要WebService公开了服务接口,远程客户端就可以调用服务。
WebService是基于http协议的组件服务,WebService是分散式应用程序的发展趋势。
WebService的开源实现WebService更多是一种标准,而不是一种具体的技术。
不同的平台,不同的语言大都提供WebService的开发实现。
在JA V A领域,WebService的框架很多,例如:AXIS,XFire,CXF等。
AXIS,XFire相对比较成熟,资料相对较多。
在这里我们只对CXF进行讲解,其他大家想学习到互联网找相关资料学习。
CXF框架由来ApacheCXF项目是由ObjectWeb Celtix和CodeHaus XFire合并成立。
ObjectWeb Celtix是由IONA公司赞助,于2005年成立的开源Java ESB产品,XFire则是业界知名的SOAP堆栈。
合并后的ApacheCXF融合该两个开源项目的功能精华,提供了实现SOA所需要的核心ESB功能框架,包括SOA服务创建,服务路由,及一系列企业级QoS功能。
ApacheCXF架框的目标1.概述<>高性能<>可扩展<>直观易用2.支持标准<> JAX-WS, JSR-181, SAAJ, JAX-RS<> SOAP 1.1, 1.2, WS-I BasicProfile, WS-Security, WS-Addressing, WS-RM, WS-Policy<> WSDL 1.1<> MTOM3.传输方式,绑定,数据绑定,传送数据格式<> 绑定: SOAP, REST/HTTP<> 数据绑定: JAXB 2.x, Aegis, XMLBeans, SDO<> 传送数据格式: XML, JSON, FastInfoset<> 传输方式: HTTP, Servlet, JMS4.部署灵活<> 轻量级: 可以将服务部署到Tomcat或其支持Spring的容器中<> JBI整合: 部署一个服务引擎到JBI容器,例如:ServiceMix, OpenESB or Petals<> J2EE集成: 可以将服务部署到J2EE应用服务器上,例如:Geronimo, JOnAS, JBoss, WebLogic, 及WebSphere<> Java 客户端/服务端可以独立性5.支持多种编程语言<> 完全支持JAX-WS 2.x 客户端/服务端模式<> JAX-WS 2.x synchronous, asynchronous and one-way API's<> JAX-WS 2.x Dynamic Invocation Interface (DII) API<> 支持wrapped and non-wrapped 数据格式<> XML messaging API<> 支持JavaScript 和ECMAScript 4 XML (E4X)<> 支持CORBA<> 支持JBI及ServiceMix6.可编程环境<> Java to WSDL<> WSDL to Java<> XSD to WSDL<> WSDL to XML<> WSDL to SOAP<> WSDL to serviceWebService CXF学习(入门篇2):HelloWorld理论联系实际,单单只讲理论那就成了纸上谈兵,用一个HelloWorld Demo可来说明事更加直观。
webservice_rest接⼝_学习笔记1、声明WebClientUtil⼯具类public class WebClientUtil {public static String doPost(String url,Map<String, Object> params,String token,String contentType,int connectTimeout,int readTimeout,String dataType) throws Exception{System.out.println("调⽤:-" + url + "接⼝,参数列表:-" + params);String parameterData = null;OutputStream outputStream = null;OutputStreamWriter outputStreamWriter = null;InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader reader = null;StringBuffer resultBuffer = new StringBuffer();String tempLine = null;if (params != null){parameterData = "";if("json".equals(dataType)){parameterData = JSON.toJSONString(params);}else{for (String key : params.keySet()) {parameterData = parameterData + (parameterData.equals("") ? "" : "&") + key + "=" + URLEncoder.encode(String.valueOf(params.get(key)), "UTF8"); }}}HttpURLConnection httpURLConnection = getHttpURLConn(url, parameterData,"POST",token,contentType,connectTimeout,readTimeout);if (parameterData != null){outputStream = httpURLConnection.getOutputStream();outputStreamWriter = new OutputStreamWriter(outputStream);outputStreamWriter.write(parameterData.toString());outputStreamWriter.flush();}inputStream = httpURLConnection.getInputStream();inputStreamReader = new InputStreamReader(inputStream);reader = new BufferedReader(inputStreamReader);while ((tempLine = reader.readLine()) != null) {resultBuffer.append(tempLine);}closeStream(outputStream,outputStreamWriter,inputStream,inputStreamReader,reader);return resultBuffer.toString();}public static String doGet(String url, Map<String, Object> params,String token,String contentType,int connectTimeout,int readTimeout,String dataType) throws Exception{System.out.println("调⽤:-" + url + "接⼝,参数列表:-" + params);String parameterData = null;OutputStream outputStream = null;OutputStreamWriter outputStreamWriter = null;InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader reader = null;StringBuffer resultBuffer = new StringBuffer();String tempLine = null;if (params != null){parameterData = "";if("json".equals(dataType)){parameterData = JSON.toJSONString(params);}else{for (String key : params.keySet()) {parameterData = parameterData + (parameterData.equals("") ? "" : "&") + key + "=" + URLEncoder.encode(String.valueOf(params.get(key)), "UTF8"); }}}HttpURLConnection httpURLConnection = getHttpURLConn(url,parameterData, "GET",token,contentType,connectTimeout,readTimeout); inputStream = httpURLConnection.getInputStream();inputStreamReader = new InputStreamReader(inputStream);}closeStream(outputStream, outputStreamWriter, inputStream, inputStreamReader, reader);return resultBuffer.toString();}private static HttpURLConnection getHttpURLConn(String url, String parameterData,String mode,String token,String contentType,int connectTimeout,int readTimeout)throws MalformedURLException, IOException, ProtocolException{URL localURL = new URL(url);if("GET".equals(mode)){localURL = new URL(url+"?"+parameterData);}URLConnection connection = localURL.openConnection();HttpURLConnection httpURLConnection = (HttpURLConnection)connection;httpURLConnection.setDoOutput(true);if(connectTimeout > 0){httpURLConnection.setConnectTimeout(connectTimeout);//设置连接超时}if(readTimeout > 0){httpURLConnection.setReadTimeout(readTimeout);//设置读取超时}httpURLConnection.setRequestMethod(mode);httpURLConnection.setRequestProperty("Accept","*");httpURLConnection.setRequestProperty("connection","Keep-Alive");httpURLConnection.setRequestProperty("Accept-Charset","utf-8");if(StrUtil.isNotNull(contentType)){httpURLConnection.setRequestProperty("Content-Type",contentType);}else{httpURLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");}if(StrUtil.isNotNull(token) && !"null".equals(token)){httpURLConnection.setRequestProperty("Authorization","Bearer "+token);}httpURLConnection.setRequestProperty("Content-Length",String.valueOf(parameterData == null ? 0 : parameterData.length()));//设置是否从httpUrlConnection读⼊,默认情况下是true;httpURLConnection.setDoInput(true);//Post 请求不能使⽤缓存httpURLConnection.setUseCaches(false);return httpURLConnection;}private static void closeStream(OutputStream outputStream, OutputStreamWriter outputStreamWriter, InputStream inputStream, InputStreamReader inputStreamReader, BufferedReader reader){if (outputStreamWriter != null) {try{outputStreamWriter.close();}catch (IOException e){e.printStackTrace();}}if (outputStream != null) {try{outputStream.close();}catch (IOException e){e.printStackTrace();}}if (reader != null) {try{reader.close();}catch (IOException e){e.printStackTrace();if (inputStreamReader != null) {try{inputStreamReader.close();}catch (IOException e){e.printStackTrace();}}if (inputStream != null) {try{inputStream.close();}catch (IOException e){e.printStackTrace();}}}public static void main(String[] args) throws Exception{String url = "http://127.0.0.1:8080/rdpe-shanxi/rest/commonApiRestful.action";Map<String,Object> params = new HashMap<String,Object>();Map<String,Object> sss = new HashMap<String,Object>();Map<String,Object> bbb = new HashMap<String,Object>();bbb.put("identitycard","BMP20190515170343351");sss.put("action", "txMktSmsSend");sss.put("params",JSON.toJSONString(bbb));params.put("jsonStr",JSON.toJSONString(sss));System.out.println(WebClientUtil.doPost(url,params,"","",3000,3000,""));}public static String invokeQueryByBcapOpen(String requesturl,Map<String,Object> params,String requestmode,String contentType,String token,String dataType,int connectTimeout,int readTimeout) throws Exception {String resultJson="";if("GET".equals(requestmode)){resultJson = WebClientUtil.doGet(requesturl, params, token, contentType, connectTimeout, readTimeout, dataType);}else if("POST".equals(requestmode)){resultJson = WebClientUtil.doPost(requesturl, params, token, contentType, connectTimeout, readTimeout, dataType);}return resultJson;}2、声明接⼝调⽤类package com.bonc.business.restful;import ng.reflect.Method;import java.util.HashMap;import java.util.Map;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSON;import com.bonc.business.db.F;import com.bonc.business.db.TxException;import com.bonc.business.entity.SysParam;import com.bonc.business.tools.ConfigUtil;import com.bonc.business.tools.Encypt;import com.bonc.business.tools.JsonBody;import com.bonc.business.tools.ParamVo;import com.bonc.business.tools.httpclient.WebClientUtil;* Function: 统⼀对外服务RestFul 接⼝. <br/>*/@CrossOrigin@Controller@RequestMapping(value = "/rest")public class CommonApiRestFul {private static final boolean encyptbase64=Boolean.parseBoolean(ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "encyptbase64")); private static final String url = ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "market_helper.url");private static final String requestmode=ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "market_helper.requestmode");private static final String contentType=ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "market_helper.contentType");private static final String token="";private static final String dataType="json";private static final int connectTimeout=30000;private static final int readTimeout=30000;@ResponseBody@RequestMapping(value = "/commonApiRestful.action", method = RequestMethod.POST, produces = CST.PRODUCES_JSON)public Object commonApiRestful(HttpServletRequest request,String jsonStr,HttpServletResponse response) {response.setHeader("Access-Control-Allow-Origin", "*");System.out.println(jsonStr);Map<String,Object> params = new HashMap<String,Object>();params.put("jsonStr",jsonStr);WebClientUtil wc = new WebClientUtil();String resultJsonStr = "";try {resultJsonStr = wc.invokeQueryByBcapOpen(url, params, requestmode, contentType, token, dataType, connectTimeout, readTimeout);} catch (Exception e) {e.printStackTrace();String code = CST.RES_EXCEPTION;String msg = "调⽤接⼝执⾏出错!"+e.getMessage();resultJsonStr = Ajax.responseString(code,msg,"",null);if(encyptbase64){resultJsonStr = Encypt.setEncString(resultJsonStr);}}return resultJsonStr;}}package com.bonc.business.restful;import ng.reflect.Method;import java.util.Map;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ng.StringUtils;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSON;import com.bonc.business.db.F;import com.bonc.business.db.TxException;import com.bonc.business.entity.SysParam;import com.bonc.business.tools.ConfigUtil;import com.bonc.business.tools.Encypt;import com.bonc.business.tools.JsonBody;import com.bonc.business.tools.ParamVo;* Function: 统⼀对外服务RestFul 接⼝. <br/>*/@CrossOrigin@Controller@RequestMapping(value = "/rest")public class CommonApiRestFul2 {/* @Resourceprivate SystemConfigService systemConfigService;@Resourceprivate BaseInterfaceLogService baseInterfaceLogService;@Resourceprivate ExecutorAsynTaskService executorAsynTaskService;*///是否开启传输数据过程中数据加密解密private static final boolean encyptbase64=Boolean.parseBoolean(ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "encyptbase64")); //private static final boolean encyptbase64=false;@ResponseBody@RequestMapping(value = "/commonApiRestful2.action", method = RequestMethod.POST, produces = CST.PRODUCES_JSON)public Object commonApiRestful2(HttpServletRequest request,@RequestBody String jsonStr,HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*");// JsonBody res = new JsonBody();String resultJsonStr="";String code=CST.RES_SECCESS;String msg="调⽤接⼝执⾏成功";Object obj=null;String interfacelogid = "";String resmethod = "";String resparams = "";String createStaff = "";System.out.println(jsonStr);boolean flag = true;try {if(StringUtils.isBlank(jsonStr)){code = CST.RES_EXCEPTION;msg = "不得传⼊空值参数jsonStr";flag = false;}if(flag){//将json参数转换成mapMap<String, Object> requestform = JSON.parseObject(jsonStr, Map.class);if(encyptbase64){jsonStr = Encypt.setDesString(requestform.get("jsonStr")+"");}else{jsonStr = requestform.get("jsonStr")+"";}Map<String, Object> form = JSON.parseObject(jsonStr, Map.class);if(form.containsKey("action")){if(StringUtils.isBlank(form.get("action")+"")){code = CST.RES_EXCEPTION;msg = "接⼝的action参数不能为空";flag = false;}}else{code = CST.RES_EXCEPTION;msg = "传输的json格式参数⽆效,没有action";flag = false;}if(form.containsKey("params")){if(StringUtils.isBlank(form.get("params")+"")){code = CST.RES_EXCEPTION;msg = "接⼝的params参数不能为空";flag = false;}}else{code = CST.RES_EXCEPTION;msg = "传输的json格式参数⽆效,没有params";if(flag){resmethod = (String) form.get("action");resparams = form.containsKey("params")?form.get("params").toString():"";ParamVo vo = new ParamVo();vo.put("paramCode","interfaceconfig");vo.put("paramKey",form.get("action"));//SysParam sysParam = this.systemConfigService.getSysParaByUnionKey(vo);Object result = null;if(true){//校验传参是否有效//Map<String, Object> params = JSON.parseObject(form.get("params")+"", Map.class);/*if(params.containsKey("createStaff") || params.containsKey("userId") || params.containsKey("staffId")){if(StringUtils.isNotBlank(params.get("createStaff")+"")){createStaff = (String) params.get("createStaff");}else if(StringUtils.isNotBlank(params.get("userId")+"")){createStaff = (String) params.get("userId");}else if(StringUtils.isNotBlank(params.get("staffId")+"")){createStaff = (String) params.get("staffId");}}JsonBody check = new JsonBody(params);if(!check.isValid(sysParam.getParamExt1(),"{\"alias\":\"1\"}")){code = CST.RES_EXCEPTION;msg = (String) check.get("_invalidMessage");flag = false;}*/if(flag){//定义的service层处理⽅法类路径://com.bonc.rdpe.service.BusiProcessMonitorService.getBusiProcessMonitorByParamsString paramValue = "com.bonc.business.service.services.TriggerRestfulService.getTriggerInfoList";String[] splitstrs = paramValue.split("\\.");String beanName = splitstrs[splitstrs.length-2];Object service = CrontabTask.getBean(beanName.substring(0, 1).toLowerCase()+beanName.substring(1, beanName.length()));vo = new ParamVo();vo.setParam(JSON.parseObject(form.get("params")+"",Map.class));Class serviceBean = Class.forName(paramValue.substring(0,stIndexOf(".")));Method m =serviceBean.getMethod(paramValue.substring(stIndexOf(".")+1,paramValue.length()),Class.forName("com.bonc.business.tools.ParamVo")); result = m.invoke(service,vo);try{Map<String,Object> resMap = (Map<String, Object>) result;code = (String) resMap.get("code");msg = (String) resMap.get("msg");obj = resMap.get("data");}catch(Exception ex){obj = result;}}}else{code = CST.RES_EXCEPTION;msg = "⽆此服务接⼝,请联系接⼝提供⽅解决!";}}}} catch (Exception e) {e.printStackTrace();code = CST.RES_EXCEPTION;msg = e.getMessage();if(e.getMessage().indexOf("syntax error")!=-1){msg = "传输的参数不是约定的有效的json格式字符串,请检查json字符串是否包含action和params!";}else{msg += "调⽤接⼝执⾏出错!";}}//插⼊接⼝调⽤⽇志信息} catch (TxException e) {e.printStackTrace();}*/resultJsonStr = Ajax.responseString(code,msg,interfacelogid,obj);if(encyptbase64){resultJsonStr = Encypt.setEncString(resultJsonStr);}return resultJsonStr;}}3、postman检测接⼝是否可以正常调⽤http://127.0.0.1:8080/rdpe-shanxi/rest/commonApiRestful.action?jsonStr={ "action": "txMktSmsSend","params": {"pageNo" : 3,"busiCode" : "","triggerCount" : "","eventType" : ""}}。
Web Service实现包--AXIS2学习笔记一教程来源:作者:栏目:JAVA教程更新时间:较新字体尺寸:缩小放大我比较懒惰,不想把user guide全部翻译,就记录一些点吧。
Axis2是全新设计的,在2004年的“Ax is峰会”上,大家决定采用新的架构来让Axis更加的富有弹性,更有效率,并且更加的可配置。
Axis2现在具有的一些feature: SpeedLow memory foot printAXIOM - AXis Object ModelHot DeploymentAsynchronous Web ServicesMEP Support - Message Exchange PatternsFlexibilityStabilityComponent-oriented deploymentTransport frameworkWSDL support有些feature现在看不懂,还是先动手做一下,感性认识一下吧第一步:下载AXIS2。
/axis2/download.cgi。
很有趣,在apache 的Web Service 的Project目录下面还看不到AXIS2。
要下那个binary的版本,因为里面有例程。
第二步:Copy axis2.war到$TOMCAT_HOME/webapps目录下面。
Tomcat好像只能用JDK1.4,我在JDK1.5 用不出来。
第三步:打开http://localhost:8080/axis2,就可以看到axis2的Welcome页面了。
点一下Validate 和Services,看是不是都没有错误。
都没有错误的话,就表示deploy成功了。
那个adminstration页面可以通过上传文件来hot deploy Web service,可以用来remote deploy。
第四步:研究例程。
先从"samples/userguide/src"目录下的例程看起。
W e b S e r v i c e技术讲解(总10页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除Web Service技术讲解1.1、Web Service基本概念Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。
面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。
是XML Web Service 的通信协议。
当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。
SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。
大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。
在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。
UDDI 利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。
它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
黑马程序员Webservice笔记一:Webservice第一天1.1:webservice介绍大家提出问题:1.1.1学习目标●什么是WebService?●它能做什么?●为什么要学习WebService?●学习WebService要达到什么目的?•会做?会说?还是一种思想?●学会使用JAX-WS开发webservice●学会看懂和使用wsdl 说明书●知道什么是soap协议(webservice的生活中的例子:/(便民查询网站))便民查询网站的设计思想:1.1.2 webservice的作用:WebService,顾名思义就是基于Web的服务。
它使用Web(HTTP)方式,接收和响应外部系统的某种请求。
从而实现远程调用.我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S 程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下别人服务器上的一段代码而已。
学习WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样.。
webservice可以实现跨平台远程调用,从而实现异构程序之间的通信,特定需求下可以实现远程数据共享、软件重用、分布式程序集成。
webservice 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
它采用标准SOAP协议(Simple Object Access Protocol) ,协议传输webservice数据,是w3c标准。
xml和XSD(XML Schema Datatypes)是webservice的基础,是w3c标准,采用wsdl作为描述语言即webservice使用说明书webservice的优缺点:优点:1、采用xml支持跨平台远程调用。
WebService1.什么是webservice?这个技术很牛,很流行。
世界上的顶级公司,不管是微软、IBM还是SUN,都开始把Web Service频繁地挂在嘴边。
大多数媒体也开始鼓吹Web Service是多么的好,多么的有前途或者“钱”途……但Web Service到底是什么呢?从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web 进行调用的API。
这就是说,你能够用编程的方法通过Web调用来实现某个功能的应用程序。
Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。
你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
Web service平台也必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。
最后,我们还必须有一种方法来对这个Web service 进行远程调用。
这种方法实际是一种远程过程调用协议(RPC)。
为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。
2.XML和XSD可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。
除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。
XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。
例如,整形数到底代表什么?16位,32位,还是64位?这些细节对实现互操作性都是很重要的。
W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。
它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。
Web service平台就是用XSD来作为其数据类型系统的。
当你用某种语言(如或C#)来构造一个Web service时,为了符合Web service标准,所有你使用的数据类型都必须被转换为XSD类型。
WebService Webservice:跨语言跨平台的远程调用技术1课程计划第一天:入门1、远程调用的案例1)案例分析,分析一个便民查询网站2)使用socket实现远程通信3)Webservice实现远程通信4)技术对比,socket和webservice2、什么是webservicea)在java语言中webservice三种规范。
Jax-ws、jax-rs、SAAJb)Webservice的三要素。
Soap、wsdl、uddic)Webservice的应用场景3、Wsdl,阅读方法4、Soapa)Soap1.1b)Soap1.25、案例:区域查询系统第二天:高级知识1、webservice注解的使用2、Webservice的框架CXFa)Jax-ws类型webserviceb)Jax-rs类型的webservice3、CXF集成spring框架4、案例:便民查询网站的实现2远程调用的案例便民查询网站的分析天气信息必须通过远程调用的方式获得。
表现层 Action+jspService 层 业务逻辑Dao 层数据访问层数据库数据库中没有实时的天气信息数据气象局系统开发一个接口供第三方调用城市名称天气信息远程调用的方法2.1.1 Socket 实现远程调用2.1.1.1 实现步骤:服务端:第一步:创建一个java 工程第二步:使用ServerSocket 创建一个服务。
需要指定服务的端口号。
第三步:调用accept ()方法等待客户端建立连接。
第四步:建立连接后使用输入流读取客户端发送的城市名称 第五步:查询天气信息。
模拟。
第六步:使用输出流返回天气信息。
第七步:关闭输入输出流。
服务端不关闭连接,等待客户端关闭。
客户端:第一步:创建一个java 工程第二步:使用Socket 类和服务端建立连接。
需要指定ip 和端口。
第三步:使用输出流发送城市名称第四步:使用输入流读取服务端返回的结果 第五步:打印结果。
原理:Server端:Listener一直在8080端口上监听着,只要有“/IntegerCalculatorPort”的Soap消息就调用相应的Servlet(一个WebService对应着一个Servlet)来处理(这些都在Web.xml中设定好),对应的Servlet实现类会做如下处理:(1)找到给WebService对应的Port(Port和WebService是Binding在一起的);(2)在“sun-jaxws.xml”中找到给Port的实现类,即为XXXDelegate;(3)该Delegate的实现就是调用WebService的实现类;SP会发布出WebService的WSDL,Client主要是通过得到它来调用WebService;Client端:(1)在本地得到WSDL文档(或得到WSDL文档的URL);(2)通过XML解析来为该WebService设定本地代理;(3)通过创建的WebService的本地代理来调用该WebServiceJava _ws和XFire有何区别:1)用基于jax-ws的Client端调用基于XFire和jax-ws的WebService都没有问题;而用基于XFire的Client端调用基于XFire的WebService存在问题(什么原因目前还不明);2)基于Jax-ws的Client端只能通过解析WSDL文档的方式来调用WebService,不可以使用将WebService的接口抓到本地进行掉用的方式;基于XFire的Client端则能够通过两种方式来调用WebService:(但目前这两种方式只针对XFire发布的WebService)(1)将WebService的Interface抓到本地,进行调用;(2)通过得到WebService的WSDLFile或是WSDL的URL,解析WSDL来调用WebService;3)基于jax-ws的WebServiceClient端可以建立在任何Project中;基于XFire的WebServiceClient端则必须建立在WebServiceProject中;对于非WebServiceProject的Project要想调用基于XFire的WebService必须将其Interface抓到本地进行调用;4)基于Jax-ws发布的WebService只发布WSDL文档,基于XFire的WebService则会发布WSDl+服务接口;5)基于Jax-ws发布的WebService会显示的产生WSDL文档;基于XFire发布的WebService则只是在调用时由服务器产生临时的;Jax-ws设计了监听器机制;XFire没有;。
1.WebService的主要标准和技术:SOAP:简单对象访问协议。
UDDI:通用描述、发现和集成。
WSDL:Web服务定义语言。
ebXML:电子商务XML。
2.WebService基本操作模型:3.SOAP简介:SOAP:是一种基于XML的轻量级消息交换协议,利用SOAP可以在两个或多个对等实体之间进行信息交换。
(1).SOAP消息基本结构:<xml version=”1.0” ?><soap:Envelope xmlns:soap=”/2001/12/soap-envelope”soap:encodingStyle=”/2001/12/soap-encoding”> ——>SOAP信封<soap:Header> ——>SOAP消息头......</soap:Header><soap:Body> ——>SOAP消息体,包含所有的调用和响应信息……<soap:Fault> ——>可选的,处理错误消息……</soap:Fault></soap:Body><soap:Attachment/> ——>SOAP消息附件</soap:Envelope> ——>SOAP信封(2).SOAP消息组成元素:SOAP Envelope:SOAP信封,用于描述消息,标识SOAP内容和信封的处理信息。
SOAP Transport:定义HTTP和SMTP等底层传输协议的绑定。
SOAP Encoding:定义将应用程序特定数据类型的实例映射为XML元素的一组编码规则。
SOAP RPC:定义RPC请求和响应的表现形式,这些SOAP请求和响应被作为一种数据类型编码传递到SOAP消息正文中。
一个SOAP消息包括一个SOAP信封,带有0个到多个附件,SOAP信封包含消息头和消息主体。
Web Service学习笔记(1)Web Service的宗旨是创建不需要用户界面就能与其他应用程序交互的Web应用程序。
举例说明它的优点,假如你正在为一家股票投资公司创建网站,你并不需要把不同证劵交易所得数据库与自己的后台数据库进行整合,因为你的应用程序可以使用Web Service,并使用XML格式交换数据。
Web Service是松耦合的,它与服务器端和客户端使用的操作系统、编程语言都无关。
假如你既拥有客户端又有服务器端的访问和管理权,这种情况更适合用.NET 的Remoting技术,而不是Web service。
创建Web Service必须保证的是,服务器端和客户端都要支持HTTP、SOAP(简单对象访问协议)和XML等行业标准协议。
Web Service是如何工作的Web Service允许两个程序之间交换XML文档。
在这个架构的顶层,微软实现了一个远程过程调用(Remote Procedure Call,PRC)模型。
Web Service架构包括以下特性:1。
WebServcie的服务器端和客户端应用程序都能够连接到互联网。
2。
用于进行通信的数据格式必须遵守相同的开放标准,并且在大多数情况下,这个标准几乎总是SOAP。
3。
客户端和服务器端的系统是松耦合的。
即Web Service不关心客户端和服务器端所使用的操作系统、对象模型或者编程语言。
只要Web Service和使用Web Service的应用程序都能够发送和接收遵守适当协议标准的消息即可。
下图为Web Service流程的逻辑架构如图所示,一个Web Service使用着会向Web Service发出一个调用请求。
使用者会认为它通过Internet直接和Web Service进行交流,当然这实际上是个幻象。
实际上,真正的调用由代理类完成。
代理类对于Web Service使用者来说是一个本地类。
代理会处理所有的负责的复杂架构,包括通过Internet发送请求道服务器、从web Service取回结果并呈现给Web Service使用者。
/*title: web service入门学习笔记**date: 2007/01/16**author:laomai**url: /laomai/*/web service入门学习笔记最近要做一个java项目,里面用到了webservice技术,经过一个多月的磕磕绊绊的摸索,总算如了点门。
现将我的学习笔记贴出来,供大家参考。
说明,本笔记第七部分主要参考了/lin_bei/archive/2006/11/07/1371131.aspx的内容,由于这位兄弟翻译的不是很通顺,我就按照自己的理解来改编成了hellowrold的例子:-)。
其他部分为我原创,转载时请注明出处。
一、实验环境win2k + jdk1.6 + javee5.0 + Myeclipse5.1jdk和javee5.0均可从/javase/downloads/index.jsp下载,安装文件名为jdk-6-windows-i586.exejava_ee_sdk-5_02-windows.exe没有myeclipse的也可以用eclipse代替,只要ide能执行ant脚本就可以./*title: web service入门学习笔记(二)**date: 2007/01/16**author:laomai**url: /laomai/*/二、第一个最简单的例子jsee5安装以后会在系统中建立一个Application Server pe9,这是sun自带的网络服务器,和tomcat、weblogic的性质类似。
在D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws下有一个自带的web service入门例子,(D:\Sun\SDK\为我机器上javaee5的安装路径)我们就先实验它,来理解webservice的本质1、把jdk的安装路径如D:\Java\jdk1.6.0\bin 加到系统的path环境变量中2、运行sun自带的网络服务器,具体方法为开始-> 程序-> Sun Microsystems-> Application Server PE 9->Start Default Server然后当弹出的cmd窗口中出现提示“按任意键继续时”输入回车,窗口会关闭,此时在浏览器输入http://localhost:8080,应该出现如下内容:Sun Java System Application Server Platform Edition 9.0Your server is up and running!说明服务器已经启动了3、在Myeclipse打开刚才的例子目录D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws 下的build.xml文件,这个一个ant脚本,具体含义我们以后再讲,现在先执行它3、在build.xml文件中单击右键,在弹出菜单中选择"run as "-> "1 ant build ",此时build.xml 里的内容会被执行,在Myeclipse的console中会输出:buildfile: D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws\build.xmlinit:compile-deploy-service:[echo] d:/Sun/SDKget-artifacts-windows:get-artifacts-unix:get-artifacts:compile-client:[javac] Compiling 1 source file to D:\Sun\SDK\samples\javaee5\webser vices\hello-jaxws\buildrun-client-windows:[exec] Hello result = Hello Administrator!run-client-unix:run-client:all:BUILD SUCCESSFULTotal time: 43 seconds其中[exec] Hello result = Hello Administrator!的输出结果说明客户端调用服务器的webservice已经成功。
1第一天内容回顾●什么是webservice(重点理解)远程调用技术一个系统远程调用另一个系统的服务,获取业务数据。
WebserviceWebservice是一种使用http传输SOAP协议数据的远程调用技术●Webservice入门程序服务端(掌握)第一步:创建SEI接口第二步:创建SEI实现类,@WebService注解第三步:发布服务,Endpoint类的publish方法,两个参数:1.服务地址;2.服务实现类实例第四步:测试服务是否发布成功,阅读使用说明书,确定类、方法、参数和返回值存在,确定服务发布成功WSDL地址规则:服务地址+?wsdlWSDL阅读方式:从下往上,service->binding->portType,类、方法、参数和返回值客户端第一步:wsimport命令生成客户端代码第二步:创建服务视图,视图名是从service标签name属性获取第三步:获取实现类示例,类名从portType标签的name属性获取第四步:调用查询方法,方法名名从portType下的operation标签下的name属性获取Webservice优缺点:优点:跨平台、跨防火墙、支持面向对象缺点:性能差●Webservice应用场景(了解)宏观:软件集成和复用微观:适用:1.发布一个服务,客户端类型未知,不考虑性能,建议使用webservice2.如果服务端已确定使用webservice,客户端无法选择不适用:1.考虑性能,不建议使用webservice2.同构程序下不建议使用webservice●Webservice的三要素WSDL:(理解)定义:web服务描述语言,他是webservice服务端的使用说明书,它随服务端发布成功,自动生成XML文档,描述类、方法、参数和返回值文档结构:Service:视图、服务地址Binding:协议portType:服务类、方法和参数message:参数定义types:参数数据类型阅读方式:从下往上(掌握)SOAP:(理解)定义:简单对象访问协议,它是在http上传输XML格式的数据,它跨防火墙,跨平台,它不是webservice的专有协议,soap=http+xml协议的格式:必有:envelope和body非必有:header和faultSOAP1.1和SOAP1.2区别:相同:都是使用POST发送请求协议格式相同:都有envelope和body不同点:Content-type不同:SOAP1.1:text/xml;charset=utf-8SOAP1.2:application/soap+xml;charset=utf-8命名空间不同:UDDI:目录服务●Webservice四种客户端开发方式第一种:生成客户端调用方式第二种:service编程调用方式第三种:HttpURLConnection调用方式第四种:ajax调用方式●深入开发:使用注解修改WSDL内容@WebService@WebMethod@WebParam@WebResult如果使用说明书变化了,客户端必须重新生成如果使用说明书没有变化,服务端实现类变化,客户端不用重新生成CXF2课程安排●CXF的介绍、安装和配置●CXF开发SOAP协议的应用●CXF+Spring整合开发SOAP协议的应用●CXF开发REST的应用什么是REST●CXF+Spring整合开发REST的应用●综合案例:实现手机号归属地查询网站3CXF的介绍、安装和配置3.1CXF的介绍●CXF是一个开源的webservice框架,它有很多成熟的功能,实现快速开发●CXF支持协议:SOAP1.1/1.2、REST●CXF支持数据格式:XML,JSON(REST支持)3.2CXF的安装和配置3.2.1下载地址/download.html3.2.2目录介绍3.2.3安装和配置●第一步:安装JDK,建议安装1.7●第二步:解压压缩包apache-cxf-2.7.11.zip到指定目录●第三步:配置CXF_HOME●第四步:将CXF_HOME,JAVA_HOME添加到Path路径下●第五步:测试是否配置成功,在cmd命令行下,输入wsdl2java –h●第六步:在classpath下加入%CXF_HOME%\lib\cxf-manifest.jar,(如果不使用IDE,必须配置)4CXF开发SOAP协议的应用4.1需求服务端:发布天气查询服务,接收客户端的城市名,返回天气数据给客户端客户端:客户端发送城市名给服务端,接收服务端的天气数据,打印4.2实现4.2.1服务端开发步骤:第一步:引入jar包第二步:创建SEI接口,第三步:创建SEI实现类第四步:发布服务用JaxWsServerFactoryBean类发布服务,该种方式支持接口发布;Endpoint仅支持实现类发布。
参数设置:1.设置服务接口:setServiceClass方法2.设置服务实现类:setServiceBean方法3.设置服务地址:setAddress方法发布:create方法第五步:测试服务是否发布成功。
如果直接访问服务地址,会报如下异常,因为CXF实现的方式没有提供服务说明界面,如果想访问使用说明书,直接在服务地址后+?wsdl4.2.1.1CXF SOAP1.2服务端的发布●在接口上添加如下注解:@BindingType(SOAPBinding.SOAP12HTTP_BINDING)●重启服务端4.2.2客户端开发步骤:●第零步:引入jar包●第一步:wsdl2java命令生成客户端代码Wsdl2java和wsimport类似,他也是根据WSDL地址生成客户端一个工具,CXF提供 Wsdl2java常用的参数:1)-d:指定输出目录2)-p:指定生成代码的包名,如果不指定,默认使用WSDL的命名空间的倒序Wsdl2java的特点:支持SOAP1.1和SOAP1.2客户端的生成wsdl2java -p cn.itcast.costom.weather -d . http://127.0.0.1:12345/weather?wsdl●第二步:用JaxWsProxyFactoryBean类调用服务端参数设置:1)设置服务接口:setServiceClass2)设置服务地址:setAddress●第三步:获取服务接口的实现类调用JaxWsProxyFacotryBean的create方法●第四步:调用查询方法5CXF拦截器5.1特点●拦截器可以拦截请求和响应●拦截器可以有多个●拦截器可以自定义5.2使用CXF的拦截器5.2.1简单项目●拦截器必须加到服务端●必须在服务发布之前加入●加入如下代码●重新启动服务5.2.2Web项目6CXF+Spring整合开发SOAP协议的应用6.1服务端开发步骤第一步:创建web项目,引入jar包第二步:创建SEI接口第三步:创建SEI实现类第四步:配置spring配置文件,applicationContext.xml<jaxws:server>标签,对JaxWsServerFactoryBean类的一个封装<jaxws:endpoint>标签,对Endpoint类的一个封装第五步:web.xml配置spring监听器,默认去/WEB-INF/applicationContext.xml 配置spring的配置文件地址,context-param标签配置CXF的Servlet第六步:部署到tomcat下,启动tomcat第七步:测试服务是否发布成功WSDL地址规则:http://ip:端口号/项目名称/servlet拦截路径/服务名称?wsdl 说明地址:http://ip:端口号/项目名称/servlet拦截路径/6.2客户端开发步骤:第一步:引入jar包第二步:配置spring配置文件,applicationContext.xml<jaxws:client>标签,对JaxWsProxyFactoryBean类封装第三步:初始化spring的上下文ClassPathXmlApplicationContext类初始化上下文第四步:从上下文中获取服务接口的实例getBean方法获取第五步:调用查询方法7上午回顾●CXF安装和配置第一步:安装JDK,建议1.7第二步:解压缩压缩到指定目录下第三步:配置CXF_HOME第四步:将CXF_HOME、JAVA_HOME加入到Path第五步:在cmd命令下输入wsdl2java –h●CXF开发SOAP协议的应用服务端第一步:引入jar包第二步:创建SEI接口,加入@WebService第三步:创建SEI实现类第四步:发布服务,JaxWsServerFactoryBean发布服务,参数设置:1.设置服务接口:setServiceClass2.设置服务实现类:setServiceBean3.设置服务地址:setAddress发布方法:create第五步:测试客户端第一步:引入jar包第二步:使用JaxWsProxyFactoryBean调用服务参数设置:1.设置服务接口:setServiceClass2.设置服务地址:setAddress第三步:获取服务接口实例使用JaxWsProxyFactoryBean的create方法第四步:调用查询方法●CXF+Spring整合开发SOAP应用服务端:第一步:创建web项目,引入jar包第二步:创建SEI接口第三步:创建SEI实现类第四步:配置spring配置文件,applicationContext.xml<jaxws:server>第五步:配置web.xml第六步:部署到tomcat下,启动tomcat第七步:测试WSDL地址规则:http://ip:端口号/项目名称/servlet拦截路径/服务名称?wsdl客户端第一步:引入jar包第二步:生成客户端代码第三步:配置spring的配置文件,applicationContext.xml<jaxws:client>第四步:初始化spring上下文,ClassPathXmlApplicationContext第五步:从上下文中获取服务接口的实例第六步:调用查询方法8CXF开发REST的应用8.1什么是REST●REST是一种编程的风格,可以帮助我们精确定位网上的资源(接口、方法、参数),简单易用,效率高●REST支持的数据格式:JSON、XML●REST支持请求方式:GET/POST8.2需求●查询单个学生信息查询多个学生信息8.3实现8.3.1服务端开发步骤:第一步:引入jar包第二步:创建Student.java实体类POJO在Student类上加入@XMLRootElement,注解的意思就是可以实现Java对象和XML数据之间的一个转换第三步:创建SEI接口第四步:创建SEI实现类第五步:发布服务:JAXRSServerFactoryBean类发布服务设置参数:设置服务实现类:setServiceBean设置资源类:setResourceClasses设置服务地址:setAddress发布方法:create方法第六步:测试服务是否发布成功直接访问服务地址会报如下异常直接访问接口、方法、参数http://127.0.0.1:12345/user/student/queryList/110?_type=xml查询多个学生,返回xml如果服务端发布时指定以GET(POST)方式方法,客户端必须以GET(POST)方式访问,否则报如下异常如果在同一个方法上指定XML和JSON两种媒体类型,在GET请求下,默认返回XML;在POST请求下默认返回JSON8.3.2客户端9CXF+Spring整合开发REST应用9.1服务端开发步骤:第一步:创建web项目,引入jar包第二步:创建Student.java类第三步:创建SEI接口第四步:创建SEI实现类第五步:配置spring配置文件,applicationContext.xml<jaxrs:server>发布服务,对JAXRSServerFactoryBean类的封装第六步:配置web.xmlSpring监听器Spring配置文件地址配置CXF的servlet第七步:部署到tomcat下,启动tomcat第八步:测试REST服务的使用说明书地址:http://127.0.0.1:8080/ws_4_cxf_spring_rest_server/ws/user?_wadl 9.2客户端10综合案例:手机号归属地查询网站10.1需求●将公网手机号查询网站集成到自己的系统中●把自己的查询接口发布成对外的服务●提供查询手机号归属地界面10.2设计10.3实现开发步骤:第一步:创建web项目,引入jar包第二步:生成客户端代码第三步:创建SEI接口在接口上加入@WebService注解第四步:创建SEI实现类注入公网客户端:MobileCodeWSSoap调用公网客户端实现查询功能第六步:创建MobileServlet.java接收queryMobile.jsp界面的请求调用SEI接口查询手机号信息手机号信息放到request域中,转发到对应queryMobile.jsp界面第七步:配置spring配置文件,applicationContext.xml <jaxws:server>标签发布服务<jaxws:client>标签配置公网客户端第八步:配置web.xml配置Spring监听器配置spring配置文件位置配置cxf的servlet配置MobileServlet第九步:部署到tomcat下,启动tomcat第十步:测试测试服务是否发布成功测试查询界面,功能是否正常。