15.WebService
1、WebService概述
是一种技术,跨平台的Web服务,可以进行远程调用。
常见的WebService接口
www.webxml.com.cn
JavaWebService的三种实现规范
JAX-WS:基于SOAP
JAX-RS:基于RESTFUL风格
… …
JAXM&SAJJ
SOAP协议:Simple Object Access Protocol
以XML为数据传输格式,HTTP为传输协议的一种数据传输方式
WSDL:WebService Definition Language
WebService接口的说明文档
应用
… …
创建WebService的客户端
A:
通过JDK的wsimport工具解析WSDL,生成源代码/字节码文件
将生成的源代码复制到客户端的src目录下
B:
eclipse
创建WebService的服务端
创建接口
案例1:访问WebService定义的接口
//访问天气预报
package com.zuxia.client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Service;
import cn.com.WebXml.WeatherWSSoap;
public class TestMainClient {
public static void main(String[] args) throws Exception {
//url配置好的wsdl路径(网页路径)
URL url = new URL("http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl");
//参数1:发布网站的路径(时间)namespese,target(标签)... 参数2:找service标签中的name属性
QName qName = new QName("http://WebXml.com.cn/","WeatherWS");
//创建Service
Service service = new Service(url, qName);
//创建调用接口 参数:WeatherWSSoap找binding中对应的type
WeatherWSSoap wws = (WeatherWSSoap) service.getPort(WeatherWSSoap.class);
//调用wws中的方法 没有付费用户不用填写ID-->null
String[] strs = wws.getWeather("北京", null);
//循环遍历
for(String str : strs) {
System.out.println(str);
}
}
}
案例2:访问方式2
package com.zb.client;
import javax.xml.namespace.QName;
import org.apache.axis.client.Service;
import com.ws.point.service.UserServiceImpl;
public class TestMain {
public static void main(String[] args) throws Exception {
Service service = new Service("http://192.168.43.201:8081/?wsdl", new QName("http://service.point.ws.com/", "UserServiceImplService"));
UserServiceImpl usi = (UserServiceImpl)service.getPort(UserServiceImpl.class);
String str = usi.getMsg("哈哈哈哈哈");
System.out.println(str);
}
}
案例3:发布接口
第一步:发布
package com.zb.main;
import javax.xml.ws.Endpoint;
import com.zb.service.UserServiceImpl;
public class PublishMyWebService {
public static void main(String[] args) {
//发布接口
//Endpoint:发布WebService的工具类
//publicsh:发布(发布的地址,需要占用一个端口,当目标用户访问该服务,具体的服务类)
Endpoint.publish("http://192.168.43.209:8081/", new UserServiceImpl());
}
}
第二步:自定义接口
//定义抽象类
package com.zb.service;
import javax.jws.WebService;
@WebService
public interface UserService {
public String getMsg(String name);
}
//定义实现类
package com.zb.service;
import javax.jws.WebService;
@WebService
public class UserServiceImpl implements UserService{
@Override
public String getMsg(String name) {
return name+"你好!";
}
}
2、代理
增强某个类的某个方法
静态代理
动态代理
AOP,TransactionManager
案例:
//打包好的架包,可以以这种方式进行调用使用该架包
package com.zb.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class TestMain {
public static void main(String[] args) {
//创建计算器类
Calc c = new CalcImpl();
//新建一个代理对象
Calc c2 = (Calc)Proxy.newProxyInstance(c.getClass().getClassLoader(),c.getClass().getInterfaces(),(proxy, method, args2)-> {
System.out.println("执行方法:"+method.getName());
System.out.println("参数列表:"+Arrays.asList(args2));
Integer i = (Integer)method.invoke(c, args2);
System.out.println("代理中获得的执行结果为:"+i);
return i;
});
//int res = c.jia(22, 33);
int res = c2.cheng(11, 22);
System.out.println(res);
}
}
3、练习:
1、创建WebService提供如下功能,并创建客户端调用
提供一个学籍信息核实接口,根据用户传递的学生学号,如果存在于数据库中则返回true,否则返回false
提供一个在校人数查询,获取数据库中所有在读学生数量
提供一个在校平均年龄查询,获取数据库中所有在校学生的平均年龄
提供一个毕业生毕业时间查询,根据传递的学号,反馈该生毕业时间
提供一个在校学生生源地统计功能,根据输入的省份,返回该省份中在本校就读学生人数。
提供一个专业信息查询,根据专业返回该专业的学生人数
提供一个在校生性别分布查询,返回在校男女比例(男生人数多余女生则返回正整数,否则返回负整数)
提供一个数组的排序服务,要求传递排序规则为true则升序排序,false则降序排序
2、预习Struts2
Struts2是什么
如何搭建一个基础的Struts2应用程序
使用Struts2成功响应一个登陆的请求