在我的上一片文章中,我在本地新建了一个普通的类来编写WebService,使用终端类 Endpoint 发布这个WebService,以此来实现让其他类调用这个接口,实现接口中定义的功能。
那么如果是Web项目的话,应该怎么编写并发布WebService呢?
Web项目可以使用监听器或者Servlet来发布WebService,本片实例我用Servlet来发布WebService。
首先新建一个 Dynamic Web Project 项目,之后创建三个类文件:
- 接口
- 接口实现类
- 入口类
这三个类文件可以放在一个包下,或者像上图那样分别放在对应的包下,推荐后一种
IWebService.java
package cn.xuzihui.itf;
import javax.jws.WebService;
@WebService
public interface IWebService {
String sayHello(String name);
}
WebServiceImpl.java
package cn.xuzihui.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.jws.WebService;
import cn.xuzihui.itf.IWebService;
@WebService
public class WebServiceImpl implements IWebService {
@Override
public String sayHello(String name) {
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String hello = df.format(date) + "," + name + "call the inferface!";
return hello;
}
}
注意要在IWebService.java、WebServiceImpl.java文件中加上@WebService的注解,位置如上所示
WebServiceCalledByServlet.java
package cn.xuzihui.controller;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.xml.ws.Endpoint;
import cn.xuzihui.impl.WebServiceImpl;
@WebServlet(value="", loadOnStartup=0)
public class WebServiceCalledByServlet extends HttpServlet{
private static final long serialVersionUID = -2864381365175258589L;
public void init() {
String address = "http://127.0.0.1:8888/WebServiceWithServlet";
Endpoint.publish(address, new WebServiceImpl());
System.out.println("使用WebServiceCalledByServlet发布webservice成功!");
}
}
这样就完成了WebService的创建,接下来我们要把这个Web项目导出为 war file ,并部署在远程Tomcat服务器上。
选择项目并右击,选择导出
选择导出的类型为 WAR file
点击下一步
选择导出的位置,点击完成就生成了 war 文件
那么接下来就是把这个WebServiceWithServlet.war 文件上传到我们的远程Tomcat服务器,当上传到Tomcat服务器的webapp文件夹中,Tomcat服务器会自动初始化并发布WebService,如下图所示:
访问我们服务器的Tomcat的管理页面,点击 Manager APP
你会看到已经存在了我们刚才上传的项目
我们在浏览器的地址栏中输入WebService入口类文件中定义的address地址,注意,要把ip地址改成你的远程服务器的ip,并且在地址的后面加上 “?wsdl”。
那么如果出现了上图类似的界面,那么就说明WebService发布成功。
接下来呢,我们就要实现在本地调用这个远程接口。
在本地再新建一个普通的 Java Project 项目
鼠标右击这个项目,选择新建->其他->Web Service Client
在弹出的选项框中的 Service definition 填写上一步在浏览器地址栏中填写的URL
点击完成,系统会自动为我们创建一些必要的类
红框圈起来的是系统创建的类,上面那个包是下一步我们需要创建的
我们需要自己在创建一个类来实现这些调用这些新创建的类,以到达调用接口的目的
WSClient.java
package cn.xuzihui.client;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import cn.xuzihui.impl.WebServiceImpl;
import cn.xuzihui.impl.WebServiceImplServiceLocator;
public class WSClinet {
public static void main(String[] args) throws ServiceException, RemoteException {
WebServiceImpl serviceImpl = new WebServiceImplServiceLocator().getWebServiceImplPort();
String sayWhat = serviceImpl.sayHello("迪迦");
System.out.println(sayWhat);
}
}
右键点击运行程序
在结果上会有报错信息,可能是缺少两个jar包
需要下载这两个jar包导入到 Client 项目下
下载地址
https://download.csdn.net/download/bronzehammer/10608421
在项目中新建一个 lib文件夹,把这两个jar包放在lib中,并在项目中添加外部jar
之后我们重新启动服务,应该就不会有报错了