版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
⑥江彖大f
JIANGSUUNIVERSITY
题目:WebServices实验
报告
所属学院:计算机学院
专业班级:软件1201__________________
姓名:孙磊___________
学号:____________
题目一:
调用第三方webService的接口实现便民信息的查询,例如天气预报或者火车信息。
一.实验规定
编写客户端,调用第三方WebService提供的接口,实现对基本信息的查询。
二.运营环境
Windows8+Eclipse(JDK8.0)
三.实验原理及过程
1.新建JavaProject,项目名称为''天气查询",新建包com.soap(放置跟webs
ervice服务调用相关的类)和包com.ui(放置跟UI界面编程相关的类)。
2.在com.soap包下新建类名为WeatherServices的Java文献。该类的作用调用中国
天气网提供的免费接口"",实现对城市的天气的实时查询。
项目结构如图:
中间用到的方法重要有:
(1)getSoapRequest(String蓟
力src
»田.webxml
city).这个方法的作用是得到一个
/田com.soap
-团EmailServicejava
•团MobileService.java
•团WeatherServices.java
(2)getSoaplnputStream(Stri
,田com.ui
•JT|MainFrameJava
这个方法是通过调用上述免费接口获得
.JRESystemLibrary[JavaSE-1.8]
URLConnectiorr连接对象,并对Soap
输入流进行相关的设立,涉及编码格式等。
(3)getWeather(Stringcity)。解析xml,获取相应的信息。由于查询后返回的原
始结果是一个xml文档,因此需要对该文档进行DOM解析,从而获得我们需要的信息。
3.在com.soap包下新建Mobi1eService.java文献,用来实现对手机号码基本
信息的查询。使用的接口是:?wsdl
4.在com.soap包下新建EmailServiceJava,实现对邮箱地址的验证。采用的接口
是:
");
5.在com.ui包下新建类名为MainFrame的Java文献。实现客户端的可视化布局。
里面设计的重要函数涉及:
(1)MainFrame(Stringstring)«这是一个构造方法,对窗体进行简朴的初始化,以
及为相应的控件添加事件监听及响应。
四.运营效果
刍查询「胳
天气查询:
邮箱蛉证:
电话查商:
市
跳
£每
20
O「6
力
湿度
温
风
46气
02实8::.A98%
,
S翼
无
摩
外N/
23替
:
;
:
.不
要
背
需
数i
。
蠹
警
.适s
。
.。s不
日
内活
底
动
.不48
:g
.K0,
石动
4蓊
.降
存
至{
1至
。
.且
.>感
有
^水
车
I天
面
。
.弄
.o,,
霜
n油
粉底
质
清
用
.S1无
i,
.o度
易
.湿
。
g。x
S京
:无
。
蜃
弱
辐
:1嚓rT
。
,
适
天有
闷
SPF8热
:。
>,
6月2曰多云
21七/26七
南风转北风微风
题目二
自定义webservice,并将其发布,然后编写客户端,调用该webserviceo
实验规定
编写客户端,调用第三方WebService提供的接口,实现对基本信息的查询。
二.运营环境
Windows7旗舰版+Eclipse(JDK8.0)
三.实验原理及过程
该实验需要自己编写相应的服务器端和客户端。而我要实现的功能是在客户端窗体输入
学号,然后通过调用webservice来返回学号相应的学生的姓名。实现服务的发布的方式
有很多种,例如用Axis2来实现。其实,JDK自身就提供了WebService服务发布的
方法,就是jax-ws。具体实现的过程如下:
1.服务器端
(1)新建JavaProject,项目名称为:webServervices_student_serv
ero在该项下新建包com.webservice.server«
(2)在包中新建一个接口StudentInterface,在接口中声明一个查询的方法studen
tQuery(intnumber);
(3)新建StudentInterface接口的实现类StudentInterfacelmp,在类中实现
StudentInterface接口中的查询方法studentQuery(intnumber)»Main方
法中的Endpoint.publish(":54321/student",newStudentInterfacelmp())方法
是发布服务。其中:54321/student是在本地自定义的RUL,54321是服务的端标语。
(4)运营该程序,会看到会打印以下提醒信息,说明该服务已经启动:
靠Problems@Javadoc/Declaration国Console3柞Debug-X改IB,原厚南
Studentinterfaceimp[JavaApplication]G:\JDK\jre8\bin\javaw.exe(2015^5^286下午8:14:46)
耨10・・・
(5)接下来要做的就是要生成WSDL文献p在浏览器地址栏中输入:5432]/student?ws
d1,回车,会看到以下所示界面,说明已经将服务发布成功。
<?xmlversion="1.0"encoding="UTF-8"?>
<!-PublishedbyJAX-WSRI().Ri'sversionisJAX-WSRI2.2.9-bl30926.1035svn-revision#5f6196f2b90e9460065a4c2f4e30e06Sb245eSle.->
<!"GeneratedbyJAX-WSRI().RI*sversionisJAX-WSRI2.2.9-bl30926.1035svn-revision^5f6196f2b90e9460065a4c2f4e30e065b245eSle.—>
<definitionsxmlns="http://schemas.xmlsoap.org/wsdl/''name=StudentlnterfacelmpService'targetNamespace=:http://server.webservice.com/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:tns="http:〃server.w/,xmlns:soap=uhttp://schemas.xmlsoap.org/wsdl/soap/*
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"xfnlns:wspl_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsp="http://www.w3.org/ns/ws-policy"xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd''>
-<types>
■<xsd:schema>
<xsd:importschemaLocation="http://127.0.0.1:54321/student?xsd=l'namespace='http://server.webservice.com/,7>
</xsd:schema>
</types>
-<messagename="studentQuery>
<partname='parameters'element="tns:studentQuery7>
</message>
-〈messagename="studentQueryResponse">
<partname="parameters'elemenr="tns:studentQueryResponser/>
</message>
-<portTypename="Studentinterfaceimp">
-<operationname=studentQuery'>
<inputmessage="tns:studentQueryn<vsam:Action='http://server.webservice.com/StudentInterfaceImp/studentQueryRequest'/>
<outputmessage="tns:studentQueryResponse'wsam:Action="http://server.webservlce.com/StudentInterfaceImp/studentQueryResponse'7>
</operation>
</portType>
-<bindingtype='tns:StudentInterfaceImp'name='StudentInterfaceImpPortBinding>
<soap:bindingstyle='document1'transport=http://schemas.xmlsoap.org/soap/http7>
•<operationname='studentQuery'>
<soap:operationsoapAction="7>
-<input>
<soap:bodyuse="literal"/>
</input>
-<output>
<soap:bodyuse="literal7>
</output>
</operation>
〈/binding)
■<servicename="StudentlnterfacelmpService1>
-<portname=StudentlnterfacelmpPort1binding=tns:StudentInterfaceImpPortBinding>
<soap:addresslocations"http://127.0.0.1:5432l/student7>
</port>
</service>
</definitions>
2.客户端
⑴为了模拟远程调用,新建JavaProject,项目名称为:webServervices__stud
ent_c1iento在该项下新建包com.webservice.cliento由于采用的是jax・ws,所以在
客户端还需要用到按照上述的wsdl规格约束编译的.java文献。具体的实现如下:
1)新建一个java项目wsimport,该项目可以用来专门放置其他项目的编译文献。找
到该项目的src的绝对目录F:\Eclipseforjavaee\wsipport\src.
2)在cmd命令窗口运营cdF:\Ec1ipseforjavaee\wsipport\src,进入
该目录下;
3)接着输入命令:wsimport-s.:54321/student?wsdl。注意中间的空格,回车
后,结果如:
雷管理员:C:\Windows\system32\cmd.exe
有〈c〉2009MicrosoftCoi*poi*ation。
:\Users\SuperBy>cdF:\Eclipseforjauaee\wsipport\src
:Misers\SuperBy>£:
:XEclipseforjauaee\wsipport\src>dir
驱动器F中的卷是SoftwareFiles
卷的洋列号是A2FC-8A82
F:\Eclipseforjauaee\wsipport\src的目录
>015/05/1613:29<DIR>
>015/05/1613:29<DIR>
>015/05/1613:29<DIR>webseruices
00字节
359,484,405,760可用字节
F:\Eclipseforjauaee\A-JSipport\src>wsinport-s.http://:54321/student?
wsdl
正在解析WSDL...
怔在生成代码
正在编译代码...
:XEclipseforjauaee\wsipport\src>
*金webServervices_student_client
(2)返回wsimport项目,右键/0src
/田com.webservice.client
刷新,会看到多余来一个包,这个包>@Clientjava
,舟com.webservice.server
的名字和之前的服务器端的包名一
»[jjObjectFactory.java
»团
致。将该包原封不动复制到该客户端package-info.java
1>团Studentlnterfacelmp.java
的src目录下。t>团StudentlnterfacelmpService.java
>团StudentQuery.java
t>团StudentQueryResponse.java
(3)新建Client窗体类,实现客t>JRESystemLibrary[JavaSE-1,8]
四.运营效果
请输入学号进行查询
20
查间取消
你输入的学号是:20
查询结果为:张波
|=|回^-T
清输入字号进行查询
33
查询取消
你输入的学号是:33
查询结果为:渚蓉
实验感想
第一次接触WebService这个概念,感觉还是挺陌生的。之前有听说过便民查询
服务,并且也亲身用过。查阅了很多资料,才知道这些功能就是用WebService来实现的。
大约了解了相关的知识和调用第三方的服务接口的流程后,才知道,一个服务的发布和调用,
也是很简朴的。当然在整个过程中,还碰到过多次的失败,虽然不是很难的程序,但是假
如其中某一步没有按照对的的顺序来执行,会很容易犯错的。以下就来说说碰到的有一些问
题:
1.在发布服务的时候,未能成功的生成wsd1文献。分析因素重要有URL的端口没有设
立好,或者服务端的程序编写有误。当服务启动后,也就是服务端程序成功执行后,再在浏览
器的地址栏里输入url+?wsdl,会成功生成。
2.在解析命令窗口解析wsdl的时候,不会生成.java文献,或者生成的.java文献
所在的包名和原先的服务程序的包名不一致,说明解析有误,需要重新解析。在输入命令的时
候,wsimport-s.:54321?wsdI中间的空格不能少。
虽然这次的实验实现的功能比较简朴,但是它却涵盖了一个完整的webservice的发
布和调用的全过程,有了这次的实践。那么以后再做比较复杂的服务的时候也就不用紧张没
有头绪了。
附录:源代码(天气查询+自定义服务)
1.天气查询:
(1)WeatherService.java
packagecom.soap;
importjava.io.Inputstream;
importjava.io.0utputStream;
importjava.io.OutputStreamWriter;
importjava.net.URL;
importjava.net.URLConnection;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuiIderFactory;
importorg.w3c.dom.Document;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
publicclassWeatherServices{
。privatestaticStringgetSoapRequest(Stringcity){
。StringBui1derbuiIder=newStringBui1der();
builder.append("<?xmlversion=\"1.0\"encoding=\'*utf—8\"?>"
。。。<soap:Envelopexmlns:xsi=\"\""
+"xm1ns:xsd=\"\""
o。。+nxmlns:soap=\H\">H
。。o+"<soap:Body><getWeatherxmlns=\"\H>"
。。+*'<theCityCode>"+city+"</theCityCode></getWeat
her>"
。+"</soap:Body></soap:EnveIope>");
returnbuilder.toString();
°)
privatestaticInputStreamgetSoapInputStream(Stringcity)throws
Exception{
6try(
oo«>Stringsoap=getsoapRequest(city);
if(soap==null){
returnnu1I;
。URLurl=newURL(
。。"");
URLConnectionconnection=urLopenConnection();
。。connection.setUseCaches(faIse);
e。connection.setDoInput(true);
。0connection.setDoOutput(true);
”connection.setRequestProperty("Content-Length"Jnteger.to
String(soap.length()));
。。。connection.setRequestProperty("Content-Type","text/xm1;charset=u
tf-8");
o。connection.setRequestProperty("SoapAction",
,…");
。0utputStrearnout=connection.getOutputStream();
oooQutputStreamWriterwriter=newOutputStreamWriter(out,"utf-8
");
aowriter.write(soap);
。。writer.f1ush();
。writer.close();
ooout.c1ose();
InputStreamin=connection.getInputStream();
®returnin;
»}catch(Exceptione){
。e.printStackTrace();
returnnul1;
O0}
)
publicstaticStringgetWeather(Stringcity){
try(
。DocumentBui1derFactoryfactory=DocumentBuiIde
rFactory.newlnstance();
factory.setNamespaceAware(true);
。。DocumentBuilderbuilder=factory.newDocumentBui1der();
InputStreamis=getSoapInputStream(city);
。。Documentdoc=builder.parse(is);
。〃由于webservices调用后返回的xml的每个元素都是string
NodeListlist=doc.getElementsByTagName("string");
oStringBufferbuffer=newStringBuffer();
for(inti=0;i<1ist.getLength();i++){
。Nodenode=list.item(i);
。if(node.getLastChild().getNodeValue().equa1s("查询结果为空!”)){
oobuffer=newStringBuffer();
)
buffer.append(node.getFirstChi1d().getNodeVa1ue());
00}
。is.close();
3returnbuffer.toString();
oo}catch(Exceptione){
e«>e.printStackTrace();
a®®returnnull;
)
(2)MobileService.java
packagecom.soap;
importcn.com.webxml.MobileCodeWS;
import.webxml.MobileCodeWSSoap;
pub1icclassMobileService{
opublicstaticStringgetMobiIeCodeInfo(StringteIe,String
userID){
。。MobileCodeWScodeWS=newMobi1eCodeWS();
MobileCodeWSSoapcodeWSSoap=codeWS.getMobileCodeWS
Soap();
。Stringcodelnfo=codeWSSoap.getMobileCodeInfo(tele,nu1I);
System.out.println(codeInfo);
returncodeInfo;
°]
}
(3)EmailService.java
packagecom.soap;
importcn.com.webxml.Va1idateEmaiIWebService;
importcn.com.webxml.ValidateEmaiIWebServiceSoap;
publicclassEmailService{
opublicstaticStringchekEmailAddress(Stringemail){
Va1idateEmailWebServiceemaiIWebServicenewValidateEmai
IWebService();
ValidateEmailWebServiceSoapserviceSoap=emai1WebService.g
etValidateEmailWebServiceSoap();
。shortresult=serviceSoap.validateEmailAddress(email);
ooStringinfo=u";
eswitch(result){
3case0:
”info="请重新验证M;break;
case1:
。info="邮件地址合法”;break;
。case2:
-info="只是域名对的[break;
case3:
。oinfo="一个未知错误”;break;
oocase4:
oeinfo="邮件服务器没有找到";break;
case5:
。。info二”电子邮件地址错误";break;
6case6:
°°info="免费用户验证超过数量(50次/24小时”;break;
case7:
。info="商业用户不能通过验证”;break;
)
。returninfo;
)00
(4)MainFrame.java
packagecom.ui;
importjava.awt.BorderLayout;
importjava.awt.Button;
importjava.awt.FlowLayout;
importjava.awt.Label;
importjava.awt.TextArea;
importjava.awt.TextFieId;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowEvent;
importjavax.swing.Box;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JScro1IPane;
importjavax.swing.border.EmptyBorder;
importcom.soap.WeatherServices;
publicclassMainFrameextendsJFrameimp1ementsActionListener
(
staticStringinfo="";
。TextFieIdtfl;
Buttonbtl,bt2;
。LabeI1abeI;
JPane1contentPane;
。JScrollPanescro1IPane;
TextAreatextArea;
Boxboxl,box2;
。publicMainFrame(Stringstring){
osuper(string);
o©setLayout(newFlowLayout());
labe1=newLabe1(”输入城市名:”);
label.setVisib1e(true);
。tf1=newTextFie1d(5);tfl.setVisible(true);tf1.setEditab1e
(true);
btl=newButton(*'查询”);
oobtl.addActionListener(this);®bt1.setVisible(true);
oecontentPane=newJPane1();
®contentPane.setBorder(newEmptyBorder(5,5,5,5));
oocontentPane.setLayout(newBorderLayout(120,120));
othis,setContentPane(contentPane);
boxl=Box.createHorizontalBox();
。boxl.add(labe1);
oxi.add(tf1);
。boxl.add(btl);
contentPane.add(box1,BorderLayout.NORTH);
。scrol1Pane=newJScrollPane();
。scro1IPane.setEnabled(true);
contentPane.add(scro1IPane,BorderLayout.CENTER);
textArea=newTextArea();
scroUPane.setViewportView(textArea);
setBounds(500,200,400,450);
setVisible(true);
va1idate();〃保证组件具有有效的布局
}
。publicvoidactionPerformed(ActionEvente){
。if(e.getSource()==btl){
3。Stringcity=tf1.getText().toString();
。info=WeatherServices.getWeather(city);
。。。textArea.setText(info);。。。
O0}
if(e.getlD()==WindowEvent.WlNDOW_CLOSING)
。。aSystem,exit(0);
oo}
0)
■publicstaticvoidmain(String[]args){
。newMainFrame("天气查询");
)
)
2.自定义服务(学生查询)
(1)服务端
1)StudentlnterfaceImp
packagecom.webservice.server;
importjavax.jws.WebService;
importjavax.xml.ws.Endpoint;
*@author张波
*Studentinterfacelmp.java
*2023年5月28日
*/
@WebService
publicclassStudentInterfaceImpimplementsStudentlnterface{
Stringname[]={
。。"姜倩云","张丽梅","吴美庆","张忠敏","王雅蓉","葛红敏","赵斌灿","王严鑫",
"莫可宏","王猛","侯勇军","马铸辉","易鹏","罗路辉","闫治鹏","孙磊","李佳
玲”,
"王勃博康尧","张波","邓雷"」陈佳鑫","唐炜宁","葛龙","倪赛杰","陈成",
"刘浩浩","周子轩","宫蕊"文云丽","沈雪"刘冬媛",嘴蓉","钱苑","董樟
裕",
"马凌杰","王京源","陈辉云","罗建兴","陈晨","赵文宇","宗玮雯","赵贝贝
II
/
“黄豪琛娄宽任上海”王康”沈楠蒋宇","吕阳,丁王刚王扬吕中
剑“,
,1张军T卢惺鑫T姚礼宗“
°};
@Override
。publicStringstudentQuery(intnumber){
ooSystem.out.println(Mfromclient..."+"学号:"+number);
ooStringresu1t=name[number];
-System,out.println("toclient..."+"姓名:"+result);
。returnresult;
publicstaticvoidmain(String[]args){
Endpoint.publish(":54321/student”,newStudentlnterfaceImp());
ooSystem.out.print1n("发布成功…”);
°}
)
2)StudentInterfacelmp
packagecom.webservice.server;
publicinterfaceStudentInterface{
。publicStringstudentQuery(intnumber);
}
(2)客户端(Client.java)
packagecom.webservice.client;
importjavax.swingJFrame;
importjavax.swingJPane1;
importjavax.swing.border.EmptyBorder;
importjavax.swing.JLabel;
importjavax.swing.JTextField;
importjavax.swing.JButton;
importjavax.swing.JTextArea;
importjavax.swing.Box;
importjava.awt.event.ActionUstener;
importjava.awt.event.ActionEvent;
importjava.awt.Component;
importjava.awt.Co1or;
importcom.webservice.server.StudentlnterfaceImp;
importcom.webservice.server.StudentlnterfaceImpService;
publieclassClientextendsJFrame{
。privateJPanelcontentPane;
。privateJTextFie1dtextField;
oprivateJButtonsearch;
p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学生命教育校本教案修改版
- 武汉出版社四年级上生命安全教育教案
- 《广场协议》揭秘
- 2023-2024学年全国小学四年级上信息与技术人教版期中考试试卷(含答案解析)
- 2024年民间借款协议书简单1000字
- 2024年健身会员合同
- 2024年朔州道路旅客运输知识考试题库
- 魅力歌剧-《饮酒歌》课件 2024-2025学年人音版初中音乐九年级上册
- 2024年南昌驾驶客运资格证考试题目模拟考试
- 2024年合同样本 员工劳动合同书范本
- 南京六校联合体2025届高三上期10月联考英语试题卷(含答案)
- 幼教数字化转型模板
- 九年级语文上册第一单元大单元教学设计
- 期中易错卷(第1-4单元)(试题)-2024-2025学年三年级上册数学人教版
- 《2024运动鞋市场与消费趋势洞察》
- 父母赠予孩子现金的赠予合同(2篇)
- 小学语文一年级上册《秋天》评课稿
- 第三单元(单元测试)-2024-2025学年四年级上册数学人教版
- 沪教版四年级上册期中复习数学试卷(一)
- 液压上料机械手设计设计说明书
- 中医内科学重点知识
评论
0/150
提交评论