由于在工作中需求要用到webservice技术,进行数据交换。研究了一下webservice,网上资料很多,看的一头雾水,找到几篇能做出来的博客,而且还比较简单,加上个人在使用过程中遇到的一些问题和想法在此分享一下。
环境:win10 64位,eclipse,jdk1.7,tomcat v7.0
参考博客:
①http://blog.csdn.net/qq_18860653/article/details/53758555
②http://blog.csdn.net/hanxuemin12345/article/details/40163757
③http://blog.csdn.net/greatfeather/article/details/46010277
说明:博客①中的方法能实现,但是我感觉有点复杂。
博客②中的方法使用注解方式发布,较简单。
博客③中的方法和spring结合在一起,我用的是②和③结合的。
一.在Java项目中发布一个WebService服务:
建立一个JavaWebService的web项目,建立相对应的com.test.javabean,com.test.servlet,com.test.webservice包
1.*类Student,这个是实体
package com.test.javabean;
import java.io.Serializable;
public class Student implements Serializable{
private String ID;
private String Name;
private String Sex;
private int age;
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getSex() {
return Sex;
}
public void setSex(String sex) {
Sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [ID=" + ID + ", Name=" + Name + ", Sex=" + Sex + ", age=" + age + "]";
}
}
2.*类CStudentServlet,这个类是将发布服务的代码放到servlet里面了,然后写入配置文件,可以自己启动,自己发布。
package com.test.servlet;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Properties;
import javax.jws.WebService;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Endpoint;
import com.test.webservice.CStudent;
public class CStudentServlet extends HttpServlet{
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("正在启动WebService服务:http://192.168.56.1:8082/JavaWebService/Student");
Endpoint.publish("http://localhost:8083/JavaWebService/Student", new CStudent());//这个端口号8083按自己tomcat的实际端口来设置,默认的是8080
}
/**
* @see Servlet#getServletConfig()
*/
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("进入WSServlet的service()方法");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
3.**类CStudent,这个类里面的方法是服务真正发布出去的。
package com.test.webservice;
import javax.jws.WebService;
import com.test.javabean.Student;
@WebService
public class CStudent {
public Student getStudent(String name) throws java.rmi.RemoteException{
Student student = new Student();
student.setName(name);
student.setAge(14);
student.setID("25");
student.setSex("Male");
return student;
}
}
注:关键在@webservice的注解。类上面加@webservice注解,就代表这个类里面的方法都对外发布,详细解释参考百度。
4.下一步需要将servlet配置为自启动,您只要在web.xml中增加如下内容就可以了:
<servlet>
<servlet-name>CStudentServlet</servlet-name>
<servlet-class>com.test.servlet.CStudentServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CStudentServlet</servlet-name>
<url-pattern>/servlet/CStudentServlet</url-pattern>
</servlet-mapping>
这样写完,启动服务器,就可以自动运行servlet,发布服务了。
5.在tomcat中发布JavaWebService.不知道如何发布的看上面③中的链接。
6.tomcat启动成功以后,打开浏览器,输入http://localhost:8083/JavaWebService/Student?wsdl
//这个端口号8083按自己tomcat的实际端口来设置,默认的是8080
(就是服务器端的按个链接加上?wsdl),回车,如果看到下面图说明服务已经发布成功。
根据WSDL文档来在客户端编写代码,访问发布的服务;
但是,WSDL文档看不懂怎么办?代码该如何编写?
——你看不懂,JDK看得懂,wsimport是JDK自带的,可以根据WSDL文档生成客户端调用代码的工具。无论服务器端WebService使用什么语言编写的,豆浆在客户端生成Java代码。所以服务器用什么语言编写的并不重要。
wsimport.exe命令参数熟知:
二.配置客户端和编写客户端程序。
1.服务端已经配置好,服务已经发布,接下来客户端要调用发布的服务。
解析地址生成源码到本地磁盘。打开命令行窗口:
这里我先定位到D盘,然后输入wsimport -s . http://localhost:8083/JavaWebService/Student?wsdl
//这个端口号8083按自己tomcat的实际端口来设置,默认的是8080
回车,如果出现的和图上一样,说明解析成功,如果报错:有几点可能忽略
1)-s左右都有空格
2)-s后面有个".",点左右都有空格。
3)?注意中英文。这里用的是英文"?","?"
解析成功以后打开E盘,
注意文件夹名字,这里文件夹名字是和服务器端的包名对应的,文件夹下面有些文件,class,和java文件,我们需要的是java文件。
2.新建一个java项目(客户端)
如图所示建个包:com.test.webservice,将步骤1中文件夹里面的java文件复制进来。这些类都是写客户端程序依赖的。
在建立一个包,里面存放测试类ClientDemo
***类ClientDemo
package com.test.client;
import com.test.webservice.CStudent;
import com.test.webservice.CStudentService;
import com.test.webservice.Student;
public class ClientDemo {
public static void main(String[] args) {
CStudentService cstudentservice=new CStudentService();
CStudent cstudent=cstudentservice.getCStudentPort();
//下面是具体方法调用。
Student student=cstudent.getStudent("同学一号");//调用了服务端getStudent方法将名字传了进去。
//输出看一下结果。
System.out.println("姓名:"+student.getName()+"年龄:"+student.getAge());
}
}
直接运行这个main方法,会输出结果。
其中第9行代码就是创建了个服务对象,相当于创建了个和服务端的链接
第10行是获取端口,这个都是固定写的。自己服务端发布服务的那个类,解析完成以后都会生成“类名+Service”的类。例:CStudent和CstudentService.
到此就实现了websrvice在eclipse上部署客户端和服务端。
三.遇到的问题。
1.一般用这个都是要和现有项目结合。上面只是个例子,在实际用的时候,我的是把服务端部分加到了现有的spring项目中,servlet那个可以很好地和现有项目结合,直接打开tomcat就可以自动发布服务。
2.如果服务端不需要用到web项目可以直接把servlet中发布服务的那俩句话写到main方法中手动发布。
3.在和现有项目结合时候服务器端写的方法要用到原先的接口的方法,如图,我要用到PersonServiceInter中的方法,如果使用了@Resource,会报错,空指针异常,原因是webservice没有和spring结合起来,不能使用spring中的注入。所有后来使用了,BeanFactory.getBean的方式获取到personServiceImpl。
下面的是正确的,是实际使用成功的:
注:这个问题网上很多人遇到的,但是我按照他们的方法都没解决成功,现在发出来做个参考。
---------------------
原文:https://blog.csdn.net/qq_37698433/article/details/70631988