泽西岛的RESTful Web服务
我已經討論了有關體系結構注意事項<< link >>的早期文章,以成為可在我的系統/機器上使用的分布式環境上的RESTful系統。 本文我們將討論如何基于REST體系結構考慮來構建Web服務。 本教程說明了如何使用Tomcat 6,Eclipse和Jersey JAX-RS(JSR 311)參考實現在Java中開發RESTful Web服務。
簡而言之,RESTful Web服務是使用HTTP on REST原理的機器之間的通信,該通信具有以下要點:
- 每個資源代表唯一的URI,以通過HTTP協議進行通信
- HTTP方法支持的每個資??源操作(POST,GET,PUT和DELETE)
- JSON,XML和各種MIME類型(例如圖像,字節流等)支持的請求和響應。
JAX-RS
JAX-RS是基于注釋的API,用于在Java中基于HTTP實現RESTful Web服務。 本質上,類和方法用信息注釋,這些信息使運行時可以將它們公開為資源。 在考慮到URI,請求和接受的內容類型以及HTTP方法的情況下,實現JAX-RS的運行時在HTTP協議和Java類之間進行中介。
Jersey框架實現了JSR-RS(JSR-311)參考API。 除了Jersey之外,還有其他各種實現,例如Retlet,JBOSS RESTeasy,Apache CXF等。
球衣:
澤西島包含以下主要部分:
- 核心服務器:要基于注釋構建RESTful Web服務,請包含諸如jersey-core.jar,jersey-server.jar,jsr311-api.jar,asm.jar之類的關鍵庫。
- 核心客戶端:Jersey客戶端API可幫助您輕松與REST服務進行通信,包括libabry ersey-client.jar
- JAXB支持:(在高級示例中使用)jaxb-impl.jar,jaxb-api.jar,activation.jar,stax-api.jar,wstx-asl.jar
- JSON支持:(在高級示例中使用)jersey-json.jar
- 集成:Jersey還提供了可以輕松與Spring,Guice,Apache Abdera等集成的庫。
獲取工具
| 軟件 | 下載 |
| Java JDK-6 | http://www.oracle.com/ |
| Eclipse –印度 | http://www.eclipse.org/ |
| Tomcat的Apache -6 | http://tomcat.apache.org/ |
| H2-數據庫 | http://www.h2database.com/ |
注意 :您可以在此處下載完整的演示應用程序,包括H2和Jersey庫<link>
使用Jersey的RESTful Web服務實現
我們將為用戶管理構建一個小型應用程序,以對用戶進行CRUD操作。 然后,我們將使用列用戶名和密碼創建一個小的User表,并使用Jersey注釋對Web服務使用POJO類公開操作進行CRUD操作。
在開始RESTful Web服務開發之前,以下是設計注意事項。
- 資源:具有用戶名和密碼屬性的用戶
- 資源類: UsersResource.java
- URI: http:// localhost:8080 / UserManagement / users
- 表示形式: XML
應用程序開發文件夾結構
我們的應用程序的目錄結構如下所示:
以下是所需的應用程序庫列表:
應用配置:
在開始開發之前,我們需要將Jersey servlet添加到web.xml中,以將整個請求定向到jersey,以進行資源標識和操作過程(POST,GET,PUT和DELETE)。
包含jersey servlet之后,Web.xml將如下所示
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>UserManagement</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>resource.com.users.java</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>資源資源
資源是指可通過網絡尋址和操縱的任何東西。 Jersey資源是帶有@Path注釋的純Java對象(PO??JO),將由HTTP方法POST,GET,PUT和DELETE進行操縱。 資源還具有子資源。 在示例應用程序Users Users的UsersResource中,Java bean是Resources。 用戶是具有屬性名稱和密碼的簡單POJO
UsersResource.java @Path("/users") public class UsersResource implements IUsersResource{ @Context UriInfo uriInfo; @GET @Produces ("application/xml") public List<User> getUsersAll() { List<User> als=null; try { als= UserService.getInstance().getUserAll(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return als; }@POST @Consumes ("application/xml") @Produces ("application/xml") public User createUser(User user){ URI uri = uriInfo.getAbsolutePathBuilder().path(user.getUserName()).build(); Response res=Response.created(uri).build(); try { UserService.getInstance().CreateUser(user); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return user; }@Path("/user/{username}") @GET @Produces ("application/xml")public List<User> getUser(@PathParam("username") String username) { List<User> asl=null; try { asl= UserService.getInstance().getUser(username); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return asl; }以下是對JAX-RS注釋的簡要說明
- @Path:與根路徑結合的路徑提供URI來標識資源。 例如,在給定的示例URI中將為http:// localhost:8080 / UserManagement / users
- @Path(“ / user / {username}”):我們也可以在方法上使用子路徑來公開子資源,此示例URI將為http:// localhost:8080 / UserManagement / users / user / john
- @Context:上下文用于注入上下文對象,例如Request,Response,UriInfo,ServletContext等。
- @PathParam:此批注與@Path一起使用,并與GET,POST,PUT和DELETE結合使用。 其他可用的注釋是@ FormParam,@ QueryParam等。
- @Produces(“ application / xml”):支持多種MIME類型的響應。 在這種情況下,application / xml將是默認的MIME類型。
- @Consumes(“ application / xml”):輸入請求有效負載將以xml格式發送。
- @GET:由GET,POST,PUT和DELET方法之一操縱的資源通過HTTP標頭傳遞
JAXB – Java POJO XML綁定
澤西島支持JAXB,實習生將POJO轉換為XML,反之亦然。 為了使POJO具備支持XML的資格,我們必須聲明@XmlRootElement注釋,如下所示:
不要忘記在轉換過程中根據需要添加空的構造函數。
@XmlRootElement public class User { private String userName; private String userPasswd; public User(String userName, String userPasswd) { this.userName = userName; this.userPasswd = userPasswd; } public User() { super(); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPasswd() { return userPasswd; } public void setUserPasswd(String userPasswd) { this.userPasswd = userPasswd; } }我們將在H2數據庫的User表中創建執行CRUD操作的服務類。
UserService.javapublic class UserService{ public static UserService userService = new UserService(); public static final String GET_USER="SELECT * FROM USER"; public static final String INSERT_USER="Insert into user "; public List<User> getUserAll() throws ClassNotFoundException, SQLException { List<User> ls = new ArrayList(); ls=DataServiceHelper.getInstance().executeQuery(GET_USER); return ls; }public List<User> getUser(String name) throws ClassNotFoundException, SQLException{ String SQL_WHERE_CAS=" where name='"+name+"'"; List<User> als=DataServiceHelper.getInstance().executeQuery(GET_USER+SQL_WHERE_CAS); return als; }public void CreateUser(User user) throws SQLException, ClassNotFoundException { String SQL_WHERE_CASE=" VALUES('" + user.getUserName() + "','" + user.getUserPasswd() + "')"; DataServiceHelper.getInstance().executeUpdateQuery(INSERT_USER+SQL_WHERE_CASE); } public static UserService getInstance() { return userService; } }助手類
我們必須創建更多的類來與DB(在本例中為H2)進行交互并執行CRUD操作。
DaraServiceHelper.javapublic class DataServiceHelper { public static DataServiceHelper dataServiceHelper = null; private Connection con = null; DataSource dataSource = null; InitialContext initialContext = null; public static final String DB_URL = "jdbc:h2:tcp://localhost/~/test"; public static final String DRIVER_NAME = "org.h2.Driver"; /*** This method is used to create an object for the given DAO class name. */public Connection getConnection() throws ClassNotFoundException, SQLException { Class.forName(DRIVER_NAME); con = DriverManager.getConnection(DB_URL, "sa", ""); return con; }public void closeConnection() throws SQLException { if (isConnectionOpen()) { con.close(); con = null; } } public boolean isConnectionOpen() { return (con != null); }public static DataServiceHelper getInstance() { if (dataServiceHelper == null) { dataServiceHelper = new DataServiceHelper(); } return dataServiceHelper; }public void executeUpdateQuery(String query) throws SQLException, ClassNotFoundException { Connection con = getConnection(); Statement stmt = con.createStatement(); stmt.execute(query); closeConnection(); }public List<User> executeQuery(String query) throws ClassNotFoundException, SQLException { Connection con = getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); List<User> als = convertPojoList(rs); closeConnection(); return als; }private List<User> convertPojoList(ResultSet rs) throws SQLException { List<User> asl = new ArrayList<User>(); while (rs.next()) { User user = new User(rs.getString("name"), rs.getString("password")); asl.add(user); } return asl; }public static void main(String[] args) throws ClassNotFoundException, SQLException { String query = "Select * from user where name='nitin'"; List<User> als = DataServiceHelper.getInstance().executeQuery(query); System.out.println("List==>" + als); } }注意:為簡單起見,我將所有代碼都包含在一個類中
澤西島客戶測試
澤西島提供客戶端來測試RESTful Web服務,它有助于與服務器進行通信并測試服務。 該庫是一個通用實現,可以與任何基于HTTP / HTTPS的Web服務配合使用。
public class UserResourceSample { public static final String USER_URI="http://localhost:8080/UserManagement/users"; public String testGetUsersAll() { ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource resource = client.resource(ForumConstant.USER_URI); ClientResponse response = resource.type(MediaType.APPLICATION_XML).get( ClientResponse.class); String en = response.getEntity(String.class); return en; }public String testGetUsers() { ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource resource = client.resource(ForumConstant.USER_URI); ClientResponse response = resource.type(MediaType.APPLICATION_XML).get( ClientResponse.class); String en = response.getEntity(String.class); return en; }public User testCreateUser() { User user = new User("John", "john@"); Client client = Client.create(); WebResource r = client.resource(ForumConstant.USER_URI); ClientResponse response = r.accept(MediaType.APPLICATION_XML).post( ClientResponse.class, user); return user; } }使用瀏覽器運行
在Eclipse中運行Web應用程序,并在以下位置測試REST服務的可用性: http:// localhost:8080 / UserManagement / users&#8221;。 您應該看到用戶項目的XML表示形式:
對于子資源:
注意 :在運行應用程序之前,請不要忘記運行H2數據庫并將記錄插入到User表中
結論:
此示例討論了Apache Tomcat與Jersey的基本用法。 我們將在以后討論一些JAX-RS的高級用法。 您也可以將完整的代碼下載到此鏈接下面的<>
資源:
- http://en.wikipedia.org/wiki/Representational_state_transfer
- https://jersey.java.net/
翻譯自: https://www.javacodegeeks.com/2013/07/restful-webservices-with-jersey.html
總結
以上是生活随笔為你收集整理的泽西岛的RESTful Web服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武汉市中介(武汉中介备案)
- 下一篇: Java FutureTask示例程序