webservice2015.12.26课堂笔记
J2EE学习笔记知识点精粹(servlet,websoket,webservice,Jax-rs,EJB,JPA)

说明:在编程中我们会在某个类、方法或变量前面加上@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一种新的协议。
webservice 学习笔记

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开发笔记 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.}。
Java+WebService整理笔记

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 笔记

<!--之后hander-->
<responseFlow>
<hander type="myHander"/>
</responseFlow>
</service>
</deployment>
c.WSDD的高级特性
1.Hander的高级特性
hander其实是个拦截去,使用hander可以在客户调用服务之前或之后执行一些操作,如记录一个webservice被调用的次数。
hander实例代码如下:
public class MyHander extends BasicHander{
2.chain的高级特性
他的作用是实现一连串的hander,其实simpleChain也是一个hander它继承了BaiscHander
chain的实例代码如下:
public class Mychain extends simpleChain{
public MyChain(){
MyHander hander1=new MyHander();
server-config.wsdd文件
访问:通过http://localhost:8080/axis/servlet/AxisServlet或http://loclhost:8080/axis/services
客户端调用:同即时发布
取消webservice:同样在WEB-INF目录下编写一个undeploy.wsdd文件,内容如下
<hander name="myHander" type="java:MyHander">
WebService_CXF学习

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接口_学习笔记

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" : ""}}。
webservice实例

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"目录下的例程看起。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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第十步:测试测试服务是否发布成功测试查询界面,功能是否正常。