Ví dụ minh họa ứng dụng Hello World với Jersey 2

Chào mừng các bạn đã trở lại với thachleblog, ở bài viết đầu tiên trong chuyên mục J2ee này, mình sẽ viết bài về RESTful web service (vì phần mình đã từng làm qua 1 dự án trong công ty và 1 project trên trường nên khá rõ). Như mọi khi, bài viết đầu tiên sẽ chỉ là giới thiệu một vài khái niệm hàn lâm và ví dụ chương trình Hello World để các bạn làm quen với công nghệ này. Nào chúng ta cùng bắt đầu nhé.

REST là gì? RESTful web service là gì?

REST (Representation State Transfer) là một kiến trúc trên nền web và giao thức HTTP, lần đầu tiên được định nghĩa bởi Roy Fielding vào năm 2000. REST dựa trên kiến trúc mọi thứ đều là resource, được truy cập thông qua giao thức HTTP. Kiến trúc REST bao gồm REST server cung cấp khả năng truy cập đến resource và REST client cung cấp khả năng truy cập và thao tác với resource. REST sử dụng resource dưới nhiều dạng bao gồm text, XML, JSON, user-define …RESTful web service dựa trên kiến trúc của REST, sử dụng URI để định nghĩa resource.

JAX-RS, Jersey

Java định nghĩa REST thông qua Java Specification Request (JSR) 31. Đặc tả này được gọi là Java API for RESTful Web Services (JAX-RS). JAX-RS cung cấp tạo JSON và XML thông qua Java Architecture for XML Bingding (JAXB). Jersey là một implementation của  JSR 311, cung cấp thư viện để implement RESTful web service trên Java servlet container.

Ví dụ HelloWorld sử dụng Jersey 2:

Tổng thể project:

project-structure

pom.xml: project sử dụng maven, pom file sẽ chứa thông tin project, các dependencies

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.howtodoinjava</groupId>
  5. <artifactId>JerseyDemos</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>war</packaging>
  8. <repositories>
  9. <repository>
  10. <id>maven2-repository.java.net</id>
  11. <name>Java.net Repository for Maven</name>
  12. <url>http://download.java.net/maven/2/</url>
  13. <layout>default</layout>
  14. </repository>
  15. </repositories>
  16. <properties>
  17. <jersey2.version>2.19</jersey2.version>
  18. <jaxrs.version>2.0.1</jaxrs.version>
  19. </properties>
  20. <dependencies>
  21. <!-- JAX-RS -->
  22. <dependency>
  23. <groupId>javax.ws.rs</groupId>
  24. <artifactId>javax.ws.rs-api</artifactId>
  25. <version>${jaxrs.version}</version>
  26. </dependency>
  27. <!-- Jersey 2.19 -->
  28. <dependency>
  29. <groupId>org.glassfish.jersey.containers</groupId>
  30. <artifactId>jersey-container-servlet</artifactId>
  31. <version>${jersey2.version}</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.glassfish.jersey.core</groupId>
  35. <artifactId>jersey-server</artifactId>
  36. <version>${jersey2.version}</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.glassfish.jersey.core</groupId>
  40. <artifactId>jersey-client</artifactId>
  41. <version>${jersey2.version}</version>
  42. </dependency>
  43. </dependencies>
  44. <build>
  45. <finalName>JerseyDemos</finalName>
  46. <plugins>
  47. <plugin>
  48. <artifactId>maven-compiler-plugin</artifactId>
  49. <configuration>
  50. <source>1.7</source>
  51. <target>1.7</target>
  52. </configuration>
  53. </plugin>
  54. </plugins>
  55. </build>
  56. </project>

Ngoài thông tin project, ta khai báo version cho maven-compiler-plugin và Jersey. Maven sẽ sử dụng defaut repository http://repo1.maven.org/maven2/  để download các lib cần thiết và lưu trong .m2c local. Do đó, lần build đầu tiên cần kết nối internet.

web.xml: deployment descriptor 

  1. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  3. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  4. version="3.0">
  5.  
  6. <display-name>Archetype Created Web Application</display-name>
  7.  
  8. <servlet>
  9. <servlet-name>jersey-serlvet</servlet-name>
  10. <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  11. <init-param>
  12. <param-name>jersey.config.server.provider.packages</param-name>
  13. <param-value>com.howtodoinjava.jersey</param-value>
  14. </init-param>
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17.  
  18. <servlet-mapping>
  19. <servlet-name>jersey-serlvet</servlet-name>
  20. <url-pattern>/rest/*</url-pattern>
  21.  </servlet-mapping>
  22.  
  23. </web-app
>

Trong web.xml, các thông tin ta cần lưu ý đó là:

  • ServletContainer: ở đây mình dùng jersey servlet
  • Param-name: khai báo package name chứa các endpoint
  • Url-pattern: khai báo url patern

HelloWorldEndpoint

  1. package thach.le.restful.example;
  2. import javax.ws.rs.GET;
  3. import javax.ws.rs.Path;
  4. import javax.ws.rs.Produces;
  5. import javax.ws.rs.core.MediaType;
  6. @Path("/message")
  7. public class HelloWorldEndPoint {
  8. @GET
  9. @Produces(MediaType.TEXT_PLAIN)
  10. public String getIt() {
  11. return "Hello World";
  12. }
  13. }

Ở đây là ví dụ đơn giản nên mình chỉ dùng 2 Annotation đó là @Path và @Get

  • @Path: URI path, với ví dụ trên, Java class sẽ sử dụng host với URI /message
  • @GET cùng với @POST, @PUT, @DELETE và @HEAD là các annotation định nghĩa bởi JAX-RS tương tác như các phương thức HTTP.
  • @Produce: định nghĩa kiểu dữ liệu để trả về cho client, ví dụ ở trên mình dùng kiểu text

URL sau khi deploy project:
http://host:port/projectname/url-pattern/path
Lưu ý: host, port: được config trong tomcat/conf/server.xml
Kết quả sau ví dụ helloworld:

ung dung hello world voi jersey 2

Công nghệ RESTful hiện nay được sử dụng khá phổ biến trong các dự án thực tế và có phần nổi trội hơn so với công nghệ SOAP. Ở bài viết giới thiệu này, hy vọng giúp các bạn làm quen được với REST. Ở những bài sau, mình sẽ bàn về những vấn đề chuyên sâu hơn. Rất mong nhận được ý kiến đóng góp của các bạn.
Xin cảm ơn.
Tham khảo thêm:
https://jersey.java.net/documentation/latest/index.html
http://howtodoinjava.com/jersey/jersey-2-hello-world-application-tutorial/