webservice笔记(全)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现webservice应用常用的有JAX-WS,注解和CXF框架的方式
提问:什么是webservice?
答:就是基于web的服务,它使用http方式,接收和响应外部系统的请求,从而实现远程调用。
特点:可以将自已写好的服务发布到互联网上让别人去调用,也可以调用别人机器上发布的webservice服务,就像调用自已写好的代码一样。
方法一:基于JAX-WS方式发布和调用
1.新建一个web service project
2.新建一个类,如计算器类,完成加,减,乘,除功能
3.将这个项目发布
点在src上-右键-new other->web service-选择将指定类发布那个单选按钮
4.导入jax-ws支持的包webservices-api.jar和webservices-extra-api.jar
5.启动tomcat,测试是否发布成功(weatherDemo指的项目名,ComputerPort指的url-pattern 在浏览器中输入:http://localhost:8080/weatherDemo/ComputerPort?wsdl
如果看到wsdl的xml文档,说明计算器类发布成功
6.写另一个项目,用来测试
点在src-右键-new other->web service client-->把wsdl url设为:http://localhost:8080/weatherDemo/ComputerPort?wsdl
其它地方都默认
7.在需要用的地方调用:如在main方法中测试:
ComputerService cs = new ComputerService();
ComputerDelegate del = cs.getComputerPort();
System.out.println("加:"+del.add(5, 2));
System.out.println("减:"+del.jian(5, 2));
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
方法二:基于注解的方式发布和调用
与web服务相关的类都位于javax.jws.*包中,jdk1.6以后的版本自带,主要用到以下类:
第一步: 在类上添加@WebService(targetNamespace="http://localhost:8080/personService",serviceName="PersonService")
@SOAPBinding(style=Style.RPC)注解,类中所有非静态方法都将对外公布,用在类上指定将此类发布成一个web service类;在方法上加@WebMethod
第二步: Endpoint-此类为端点服务器,它的publish方法将一个已经添加有@WebService注解对象绑定到一个地址的端口上.
注意:不支持静态方法和final的方法
如果某个非静态方法不想对外公布,可以在方法上添加@WebMethod(exclude=true),阻止对外公开
如果一个类上,被添中了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败
第三步:测试是否服务发布成功 http://localhost:9999/one?wsdl
例子:
//1、添加注解
@WebService
public class OneService {
//2、至少包含一个可以对外公开的服务
public String sayHello(String name){
System.err.println("invoke "+name);
return "Hello "+name;
}
public static void main(String[] args) {
//3、第一个参数称为Binding即绑定地址,
//第二个参数是实现者,即谁提供服务
Endpoint.publish("http://localhost:9999/on
e", new OneService());
}
}
客户端如何调用?
第一步:新建一个客户端的项目上,可以是java project或其它项目都可以
第二步:通过wsimport -s . http://localhost:9999/one?wsdl生成客户端调用的代码,将调用的代码拷贝到客户端的项目src目录下
第三步:调用服务
HelloService hs = new HelloService();
HelloDelegate helloDel = hs.getHelloServicePort();
System.out.println(helloDel.sayHello());
//////////////////////////////////////////////////////////////
方法三:使用CXF发布服务和调用服务
发布服务:以查询员工和保存员工为例
准备工作:先新建一个项目,javaproject或webproject都可以,导入cxf相关的jar包到项目lib
步聚:
1.定义一个员工类
Employee,提供empno,empName,age三个属性,生成getter/setter方法
2.定义一个员工的服务接口EmployeeService,提供如下方法
public Employee getEmployeeById(int empno);
public void saveEmployee(Employee emp);
3.定义一个员工服务的实现类EmployeeServiceImpl实现EmployeeService接口
public Employee getEmployeeById(int empno) {
Employee emp = new Employee();
emp.setEmpno(empno);
emp.setEmpName("kelly");
emp.setAge(30);
return emp;
}
public void saveEmployee(Employee emp) {
System.out.println(emp.getEmpno()+" "+emp.getEmpName()+" "+emp.getAge());
}
4.发布web 服务,将EmployeeServiceImpl中的方法"暴露"出去
public static void main(String[] args) {
EmployeeService esi = new EmployeeServiceImpl();
ServerFactoryBean server = new ServerFactoryBean();
server.setServiceClass(EmployeeService.class);
server.setServiceBean(esi);
server.setAddress("http://localhost:8080/employeeService");
server.create();
}
调用服务:
在客户端中调用, 以处以main方法来调
public static void main(String[] args) {
ClientProxyFactoryBean client = new ClientProxyFactoryBean();
client.setServiceClass(EmployeeService.class);
client.setAddress("http://localhost:8080/employeeService");
EmployeeService empService = (EmployeeService)client.create();
Employee emp = empService.getEmployeeById(100);
empService.saveEmployee(emp);
//System.out.println(emp.getEmpno()+" "+emp.getEmpName());
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
cxf与spring整合
服务器端项目:
1.新建一个web project,导入spring支持,导入cxf的支持到lib目录下
2.在web.xml配置spring监听和cxf
vlet
3.在applicationContext.xml中引入cxf的命名空间
xmlns:jaxws="/jaxws"
/jaxws
/schemas/jaxws.xsd
/bindings/soap
/schemas/configuration/soap.xsd "
4.
a.定义一个员工类
Employee,提供empno,empName,age三个属性,生成getter/setter方法
b.定义一个员工的服务接口EmployeeService,提供如下方法
@WebService(serviceName="EmployeeService",targetNamespace="/ws/employee")
public interface EmployeeService {
public Employee getEmployeeById(int empno);
public void saveEmployee(Employee emp);
}
c.定义一个员工服务的实现类EmployeeServiceImpl实现EmployeeService接口
@WebService(targetNamespace="/ws/employee")
public class EmployeeServiceImpl implements EmployeeService {
public Employee getEmployeeById(int empno) {
Employee emp = new Employee();
emp.setEmpno(empno);
emp.setEmpName("kelly");
emp.setAge(30);
return emp;
}
public void saveEmployee(Employee emp) {
System.out.println(emp.getEmpno()+" "+emp.getEmpName()+" "+emp.getAge());
}
}
5.在applicationContext.xml配置服务bean即EmployeeServiceImpl类
6.发布项目到tomcat下,看是否报错,测试发布是否成功
测试地址: http://localhost:8080/EmployeeCXFSpring/employeeService?wsdl
cxf与spring整合
客户端项目:
1.新建项目,java project或web project均可
2.导入spring支持和CXF的相关支持到客户端项目中
3.启动服务器端项目,测试服务器端项目是否可用,测试地址: http://localhost:8080/EmployeeCXFSpring/employeeService?wsdl
4.定义Employee实体类
5.定义EmployeeService接口,与服务器端接口包路径一致,注意多出注解部分
@WebService(serviceName="EmployeeService",targetNamespace="/ws/employee")
public interface EmployeeService {
public Employee getEmployeeById(int empno);
public void saveEmployee(Employee emp);
}
6.在applicationContext.xml中配置CXF和bean
a.导入CXF命名空间同服务端一样,拷贝上面的
b. 配置客户端bean
7.在客户端写测试类,调用bean
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
EmployeeService empService = (EmployeeService)ctx.getBean("empServiceClient");
Employee emp = empService.getEmployeeById(100);
empService.saveEmployee(emp);
}