webService服务地址:http://www.webxml.com.cn
一:接收服务
步骤:得到服务地址----wsimport代理-------打jar包------放到项目中-------通过wsdl元素调用相关的方法得到数据
wsdl描述图:
- wsimport 命令的位置:
C:\Program Files\Java\jdk1.7.0_04\bin
- 要求:
1. jdk的 版本要在 jdk 1.6.21及以上
2. 操作系统安装的jdk版本 与 MyEclispe 及 默认指定的版本要一致
- wsimport使用:
记得设置jdk\bin 环境变量 指定path
语法 wsimport [opations] <wsdl_uri>
- wsdl_uri:wsdl 的统一资源标识符
- d :指定要输出的文件的位置
- s :表示要解析java的源码 ,默认解析出的是class字节码
- p : 指定输出的包名
命令行: jar cvf jobService.jar ./cn
例子:接收天气服务
①打开http://ws.webxml.com.cn/WebServices/WeatherWS.asmx网页,点击服务说明,得到http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL地址
②打开cmd命令,输入wsimport http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL
如果显示找不到类,那么就是你的环境变量配错了,也或者是你JDK和JRE装在了同一个目录下导致找不到tools.jar
如果显示如下:
那么需要打开网页http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL,如何把网页内容右键保存为xml文件,例如保存为s.xml,然后把提示的15行、61行、101行去掉保存,然后打开cmd命令,输入wsimport -s ./ -p cn.it.ws /s.xml,如下:
然后再打jar包: jar cvf myWeather.jar ./cn,打完后把jar复制到醒目的lib目录下,下面就可以利用这个jar包开发得到想要的数据了
写WeatherServlet类:
package cn.it.ws.weather;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.com.webxml.ArrayOfString;
import cn.com.webxml.WeatherWS;
import cn.com.webxml.WeatherWSSoap;
public class WeatherServlet extends HttpServlet {
private WeatherWS ws;
public WeatherServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String cityCode=request.getParameter("city");
System.out.println("获取城市的id"+cityCode);
//通过webservice获取远程的天气预报信息
WeatherWSSoap weatherWSSoap = ws.getWeatherWSSoap();
List<String> weathers = weatherWSSoap.getWeather(cityCode, "").getString();
String weather=weathers.get(8);//取得温度信息
//把结果回显给页面
response.setContentType("text/html;charset=UTF-8");
PrintWriter printWriter=response.getWriter();
printWriter.write(weather);
printWriter.flush();
printWriter.close();
}
public void init() throws ServletException {
// Put your code here
ws=new WeatherWS();
}
}
jsp:index.jsp,这里用到jquery,需要把jquery-1.8.2.js引入
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript" src="jquery-1.8.2.js"></script>
</head>
<body>
<select id="province">
<option value="31124">广东省</option>
</select>
<select id="city">
<option value="2350">广州</option>
<option value="2419">深圳</option>
<option value="2351">东莞</option>
</select>
<hr/>
<span>XXXX</span>
<script type="text/javascript">
$("#city").change(function(){
var city=$("#city option:selected").val();
$.post("weatherServlet",{"city":city},function(backdata){
$("span").text(backdata).css("color","blue");
});
});
</script>
</body>
</html>
二:发布服务
使用WebService注解来修改WSDL文件
WSDL文件的内容,一般由服务默认生成,但为了更好的向开发人员提供使用说明书,一般应做一些简单的修改。至少不应该暴露我们的包结构。而targetNamespace默认情况下为倒置的包名,这已经暴露了我们的包结构。通过在类文件上添加以下注解,可以修改wsdl生成的各元素,而不是直接去修改wsdl文件,直接去修改wsdl文件是无效的。
WebService的注解包括:
1. @WebService-定义服务 --类上
2. @WebMethod-定义方法 - 方法
3. @WebResult-定义返回值 – 返回值
4. @WebParam-定义参数 – 参数
WebService注解的使用
1. 通过WebService的注解,可以更加形像的描述Web服务。从而生成WSDL文档。
2. 当修改了WebService注解之后,同时会影响客户端生成的代码。
3. 调用的方法名和参数名也发生了变化。
4. 即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成(注意是生成而不是下载)。否则调用将会失败。
5. 生成本地调用代码,依然使用wsimport工具
@WebService注解:
1. @WebService 标注要暴露为Web Services的类或接口 ,用于修饰类或接口,包含的属性有:
2. targetNamespace属性:定义命名空间,默认为”http://”+”包名倒排”
3. name属性:Web Service 的名称,默认为发布服务的类名。
4. serviceName: ws服务的名词,默认在类名后面添加了service
5. endpointInterface属性:定义服务抽象 Web Service协定的服务端点接口的完整名称,接口也必须声明WebService注解,包括方法的注解必须也要添加到接口中,否则会无效,而且WS在没有注解的情况下.生成WS的时候会自动生成一个注解.所以可以不用指定接口
@WebMethod
1. 此注解用在方法上,用于修改对外暴露的方法
2. operationName属性:与此方法匹配的 wsdl:operation的名称
3. exclude属性:标注此方法是否被暴露,默认为false
注意:如果所有方法上都没有指定@WebMethod,则默认是所有的方法都是对外暴露的方法。如果有任一方法指定了@WebMethod,则只有指定这个注解的才是对外暴露的方法。
@WebResult
@WebResult 定义返回值,返回值类型不能为接口类或抽象类,而且必须有个不带参的构造函数,包含属性
name属性:返回值的名称
一个添加注解的案例:
// 修改web服务的名称,和命名空间
@WebService(name="Hello",targetNamespace="http://icast.cn")
public class HelloWorld {
@WebMethod(operationName="aaa")
// 修改webResult 和 webParam会影响到JS的调用模式
public @WebResult(name="returnName") String sayHi(@WebParam(name="yourname") String name){
return "Hello" + name;
}
public static void main(String[] args){
// 发布一个web服务,指定IP和实现者
Endpoint end=Endpoint.publish("http://127.0.0.1:4567/hello",new HelloWorld());
}
}
CXF特点:
1. 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty2. 支持注解的方式来发布webservice
3. 能够显示一个webservice的服务列表
4. 能够添加拦截器:输入拦截器、输出拦截器 :
输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器
实现步骤:
1. 添加cxf.jar 包(集成了Spring.jar、servlet.jar ),spring.jar包 ,servlet.jar 包
2. 编写业务类,通过CXF来发布webservice
3. 添加一个CXF请求的 Servlet,用来处理webservice的请求
4. 配置Spring的配置文件: applicationContext.xml ,把cxf的bean在spring配置
5. 在web.xml中配置 CXF的 Servlet , 添加spring的监听
6. 通过wsimport生成本地代理 ,访问webservice
例子:
1.导入依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.it.cxf</groupId>
<artifactId>spring-cxf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- 添加Spring支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 添加cxf支持 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.5</version>
</dependency>
</dependencies>
</project>
2.整合文件applicationContext-cxf.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<bean id="employeeManagerImpl" class="cn.it.ws.cxf.b.EmployeeManagerImpl"></bean>
<!-- 配置cxf
地址: http://192.168.114.10:8080/CXF_Server/ws/employeeManager
组成 : http://192.168.114.10:8080 +CXF_Server( 项目名)+ws(过滤的路径)+/employeeManager(自定义部分)
服务类 :
服务的实现类:
拦截器
-->
<jaxws:server address="/employeeManager" serviceClass="cn.it.ws.cxf.b.EmployeeManager">
<jaxws:serviceBean>
<ref bean="employeeManagerImpl"/>
</jaxws:serviceBean>
<!-- 配置输入显示日志信息的拦截器 -->
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:outInterceptors>
</jaxws:server>
</beans>
3.web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>CXF_Server</display-name>
<!-- 添加 CXF 的Servlet ,处理 webservice的请求 -->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<!-- Spring 监听添加 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
4.EmployeeManager:
package cn.it.ws.cxf.b;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import cn.it.ws.cxf.bean.Employee;
@WebService(serviceName="EmployeeService")
public interface EmployeeManager {
public abstract void add(@WebParam(name="employee")Employee employee);
public abstract @WebResult(name="employees")List<Employee> query();
}
5.EmployeeManagerImpl:
package cn.it.ws.cxf.b;
import java.util.ArrayList;
import java.util.List;
import cn.it.ws.cxf.bean.Employee;
/**员工管理的业务实现类
*
*/
public class EmployeeManagerImpl implements EmployeeManager {
private List<Employee> employees=new ArrayList<>();
@Override
public void add(Employee employee){
//添加到集合中
employees.add(employee);
}
@Override
public List<Employee> query(){
return employees;
}
}
6.Employee:
package cn.it.ws.cxf.bean;
public class Employee {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
7.通过web service exprlorer测试
http://127.0.0.1:8080/spring-cxf/ws/employeeManager?wsdl