Java Web 服务教程
欢迎来到Java Web 服务教程。在这里我们将学习Web 服务、Web 服务中的有用概念以及 Java 中用于创建 Web 服务的不同类型的 API。
什么是 Web 服务
简单来说,可以通过网络访问的服务称为 Web 服务。那么它与 Web 应用程序有何不同呢?它们也是通过网络访问的服务。有几个属性可以阐明这种差异。
- Web 应用程序面向用户,可通过具有人类可读格式的浏览器访问,而 Web 服务则面向应用程序,以 XML、JSON 等格式访问数据。
- Web 应用程序通常使用 HTTP/HTTPS 协议,而传统 Web 服务则使用 SOAP 协议。最近,REST 越来越流行,它是一种架构风格,几乎总是在 HTTP/HTTPS 协议上运行。
- Web 应用程序不是为了可重用性而设计的,而这是 Web 服务的优点之一。单个 Web 服务可供不同类型的应用程序使用。
- Web 应用程序可以访问 Web 服务来访问某些数据或执行某些任务,但 Web 服务不能访问 Web 应用程序来获取某些数据。
- Web 应用程序能够维持用户会话,Web 服务是无状态的。
我希望上述差异足以消除您对 Web 应用程序和 Web 服务的任何困惑。两者是不同的概念,用于不同的目的。
Web 服务的类型
有两种类型的 Web 服务。
- SOAP:SOAP 代表简单对象访问协议。SOAP 是一种基于 XML 的行业标准协议,用于设计和开发 Web 服务。由于它基于 XML,因此它与平台和语言无关。因此我们的服务器可以基于 JAVA,而客户端可以基于 .NET、PHP 等,反之亦然。
- REST:REST 是一种用于开发 Web 服务的架构风格。它最近越来越受欢迎,因为与 SOAP 相比,它的学习难度较小。资源是 Restful Web 服务的核心概念,它们由其 URI 唯一标识。
Java Web 服务
Java 提供了自己的 API 来创建 SOAP 和 REST Web 服务。
- JAX-WS:JAX-WS 代表 XML Web 服务的 Java API。JAX-WS 是基于 XML 的 Java API,用于构建 Web 服务服务器和客户端应用程序。
- JAX-RS:用于 RESTful Web 服务的 Java API (JAX-RS) 是用于创建 REST Web 服务的 Java API。JAX-RS 使用注释来简化 Web 服务的开发和部署。
这两个 API 都是标准 JDK 安装的一部分,因此我们不需要添加任何 jar 即可使用它们。这两个 API 都大量使用了注释。
Hello World JAX-WS 应用程序
让我们创建一个非常简单的 Hello World JAX-WS 应用程序。TestService.java
package com.journaldev.jaxws.service;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Endpoint;
@WebService
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
public class TestService {
@WebMethod
public String sayHello(String msg){
return "Hello "+msg;
}
public static void main(String[] args){
Endpoint.publish("https://localhost:8888/testWS", new TestService());
}
}
That’s it. Just run this application and our Hello World JAX-WS SOAP web service is published. Below image shows the invocation of this JAX-WS web service through SOAP UI. That’s it for a very basic tutorial of JAX-WS web service. Below are some of the articles you should read for better understanding of SOAP web services and JAX-WS.
- JAX-WS Tutorial
- JAX-WS Web Service Deployment on Tomcat
- SOAP Web Service Example using Eclipse and Apache Axis
- Apache Axis 2 Web Services Tutorial
Hello World JAX-RS Application
Jersey is the reference implementation of JAX-RS API, it’s not part of standard JDK and we have to include all the required jars. Best way is to use Maven build, so create a simple Dynamic web project and then convert it to Maven in Eclipse. Here is the final pom.xml file having required dependencies.
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>JAX-RS-HelloWorld</groupId>
<artifactId>JAX-RS-HelloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Now add Jersey servlet to our deployment descriptor web.xml as front controller.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns="https://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>JAX-RS-HelloWorld</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.journaldev.jaxrs.service</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Above two steps are required for initial setup, below is our Hello World JAX-RS service class.
package com.journaldev.jaxrs.service;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/test")
public class TestService {
@GET
@Path("/hello/{msg}")
public String sayHello(@PathParam(value="msg") String msg){
return "Hello "+msg;
}
}
Just export it as WAR file and then access it in the browser as shown in below image. You can change the last part of URL and returned message will change accordingly. You can see how easy it was to create RESTful web service using JAX-RS API. However there is more to it, follow below articles to learn more.
That’s all for a quick introduction of java web services, finally if you are preparing for any interview then go through Web Services Interview Questions. References: JAX-WS Oracle Page, JAX-RS Oracle Page