JDK开发WebService


使用java开发WebService有两种方式
   1.使用JDK直接开发
   2.使用CXF框架进行开发

一、使用JDK直接开发WebService

1.1、开发WebService服务端

1.1.1定义一个interface,使用@WebService注解标注接口。使用@WebMethod注解标注接口中的方法
/**
 * Created by yan on 2019/1/30.
 */
@WebService
public interface IWebService {
    @WebMethod
    public User selectUserByName(String name);
}
1.1.2.定义一个实现类,并用@WebService注解标注实现类。
/**
 * Created by yan on 2019/1/30.
 */
@WebService
public class WebServiceImpl implements IWebService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public User selectUserByName(String usName) {
        User user = userMapper.selectUserByName(usName);
        return user;
    }
}
1.1.3.定义一个发布WebService的类,使用Endpoint(终端)发布WebService接口
/**
 * Created by yan on 2019/1/30.
 */
public class WebServicePublish {
    public static void main(String[] args) {
        String address = "http://127.0.0.1:8080/webservice";
        //下面的两个参数是1.自定义的地址。2.接口实现类
        Endpoint.publish(address,new WebServiceImpl());
        System.out.println("WebService接口发布成功");
    }
}
1.1.4.运行WebServicePublish类,并在浏览器上访问address

在这里插入图片描述
在这里插入图片描述
在浏览器上显示以上内容,证明接口发布成功。
注意:这里我们使用的是main函数发布的WebService接口,手动点击运行,是不是有点太low了?嗯,我承认这样是会被开除的!!!!!!!

1.2、web项目发布WebService服务接口

在web项目中我们可以使用监听器或者Servlet来发布WebService接口

1.2.1、使用ServletContextListener来发布WebService接口

使用@WebListener注解将实现ServletContextListener的类标注为一个Listener

/**
 * Created by yan on 2019/1/30.
 * 注意:接口中的方法是default修饰的,因此不会自动提示重写。(具体可查询JDK1.8 default关键字属性)
 */
@WebListener
public class WebServicePublish implements ServletContextListener {
    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        String address = "http://127.0.0.1:8080/webservice";
        //下面的两个参数是  1.自定义的地址。2.接口实现类。
        Endpoint.publish(address,new WebServiceImpl());
        System.out.println("WebService接口发布成功");
    }

}

启动项WebService接口便发布成功,
但是出现了一个问题:controller中的request请求在浏览器上显示
在这里插入图片描述
这是因为我的自定义address中使用了8080,在自己电脑上访问controller请求可能造成端口号冲突?我也不太明白!!!!!!!把address中的端口号改成其它或者直接删掉就可以了

1.2.2、使用Servlet发布WebService接口

使用@WebServlet注解将继承HttpServlet的类标注为一个Servlet类

/**
 * Created by yan on 2019/1/30.
 */
@WebServlet(value="",loadOnStartup=0)
public class WebServicePublish extends HttpServlet {

    public void init() throws ServletException {
        String address = "http://127.0.0.1/webservice";
        Endpoint.publish(address , new WebServiceImpl());
        System.out.println("WebService接口发布成功");
    }
}

此时可以访问wsdl文件,但是我的项目启动后的欢迎页面(index.jsp)报错
在这里插入图片描述
这个报错想必大家都不陌生(出现在这就不理解了),但为什么我发布WebService接口后就报这个错呢?
在浏览器上手动添加index.jsp又可以访问成功,这是为什么???????
最后发现@WebServlet注解中的value属性不为空的时候便可以正常弹出index.jsp页面(idea)

@WebServlet(value="/webservice",loadOnStartup=0)	//注意value值前必须加上/,否则项目启动报错

如果把value属性给删掉后(感觉给了个值也没有用到),同样可以弹出index.jsp,但是wsdl文件无法访问。

@WebServlet注解中的属性值:
在这里插入图片描述
value等价于urlpatterns,二者不能同时使用
使用@WebServlet注解创建一个Servlet,url不能为空!!!!!!!

1.2、开发WebService客户端

1.2.1、借助jdk的wsimort.exe工具生成客户端代码

在另一个项目中,选中目录右键
在这里插入图片描述
cmd打开小黑窗
执行 wsimport -keep url(url为wsdl文件的路径)生成客户端代码

1.2.2、建立一个测试类
/**
 * Created by yan on 2019/1/31.
 */
public class WsTest {
    public static void main(String[] args) {
        //创建一个用于产生WebServiceImpl实例的工厂,WebServiceImplService类是wsimport工具生成的
        WebServiceImplService factory = new WebServiceImplService();
        //通过工厂生成一个WebServiceImpl实例,WebServiceImpl是wsimport工具生成的
        WebServiceImpl wsImpl = factory.getWebServiceImplPort();
        User user = wsImpl.selectUserByName("张三");
        System.out.println(user);
    }
}

运行报空指针异常!!!!!!!
查询后发现是mapper注入失败
最后在WebService的实现加上@Component注解,测试mapper注入成功(我在服务端写了一个controller注入WebService,可以查询到数据),这样应该就可以查询数据库了,但仍然报错!!
客户端报错内容如下:
在这里插入图片描述
同时服务端报错如下:
在这里插入图片描述
这说明还是userMapper为null嘛,费解啊
原因不明,暂未解决!!!!!!!

猜你喜欢

转载自blog.csdn.net/weixin_44030218/article/details/86710578
今日推荐