一.回顾
soap :简单对象访问协议 http+xml
Soa :面向服务的架构,它是一种思想
二.带接口webservice发布
1.service接口@WebService
@WebService
public interface JobService {
public String getJob();
}
2serviceImpl@WebService(endpointInterface=”com.kinth.service”)
@WebService(endpointInterface="com.kinth.JobService")//设置服务端点接口 ,指定对外提供服务的接口
public class JobServiceImpl implements JobService {
@Override
public String getJob() {
return "JEE研发工程师|Android研发工程师|数据库工程师|前端工程师|测试工程师|运维工程师";
}
public void say(){
System.out.println("早上好!");
}
}
3main中Endpoint.publish(address, jobService);
public static void main(String[] args) {
JobService jobService=new JobServiceImpl();
String address="http://192.168.0.199:9999/jobservice";
Endpoint.publish(address, jobService);
System.out.println("wsdl地址:"+address+"?WSDL");
}
可以给下载的类打成jar包,类似linux:
jar cvf jobService.jar ./cn
测试:导入工程,新建服务,获取访问方式,获取方法,输出
三、 jsp+ajax+servlet+webservice 远程访问天气预报服务
step:
1. 了解第三方天气预报webservice服务
广东 广州 东莞 深圳, 温度信息
2. wsimport 生成本地代理
3. 准备一个index.jsp 页面,显示城市信息 ,下拉城市,显示天气信息
<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>
4 准备一个weatherServlet ,通过它来访问webservcie
servlet:init一个服务,setCharacterEncoding,获取访问方式和方法,获取ajax过来的城市信息入参,printWriter写回去,ajax发送请求返回值取得值,写回去。
5.servlet注册
四.cxf框架发布webservice
1.cxf:为BUS,类似于Spring的 ApplicationContext,内置jetty。
2.cxf支持注解方式发布,可显示webservice服务列表。
可添加拦截器,输入输出拦截器,用户权限验证拦截器
1. ServerFactoryBean
- 不设置注解也可以发布webservice服务, 不支持注解
- 不支持拦截器的添加
2. JaxWsServerFactoryBean
- 支持注解
- 可以添加拦截器
3. webservice 访问流程:
1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手
2. 通过soap协议实现通信 ,采用post请求 , 数据封装在满足soap规约的xml中
3. 返回数据 同样采用的是soap通信, 数据封装在满足soap规约的xml中
发布:添加Jar,此时impl不用Enpoint注解
LanguageService languageService=new LanguageServiceImpl();
JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();
//Endpoint :地址 , 实现对象
bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
bean.setServiceBean(languageService);//服务的实现bean
//添加输入拦截器 :输入显示日志信息的拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//添加输出拦截器 :输出显示日志信息的拦截器
bean.getOutInterceptors().add(new LoggingOutInterceptor());
bean.create();//创建,发布webservice
五.CXF+Spring发布WebService
step:
1. 添加cxf.jar ,spring.jar,servlet.jar
2. 编写业务类,通过CXF来发布webservice
员工管理:
方法 :添加员工、查询员工
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();
}
业务实现类:
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;
}
}
3添加一个CXF请求的 Servlet,用来处理webservice的请求
过滤的地址/ws/*
4.配置Spring的配置文件: applicationContext.xml ,把cxf的bean在spring配置
添加命名空间约束
<bean id="employeeManagerImpl" class="com.kinth.EmployeeManagerImpl"></bean>
<!-- 配置cxf 地址: http://192.168.0.199:8080/CXF_Server/ws/employeeManager
组成 : http://192.168.0.199:808 +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>
5.在web.xml中配置 CXF的 Servlet , 添加spring的监听
<!-- 添加 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>
- 通过wsimport生成本地代理 ,访问webservice
六.WebService测试:eclipse launch web servcie explorer
可看请求的客户端和服务端输出,免每次wsimport