Web编程学习五:使用Jersey和JPA来创建RESTfulWebService
Jun 07, 2016 pm 03:54 PM在上一个练习学习了如何使用Jersey,以及JAXB来创建RESTful的web service。 现在我来结合后台数据库对其做升级,也就是通过Jersey创建用来修改后台数据库的RESTful web service。 开发环境: Eclipse Juno, 数据库MySQL 5.5, Jersey 1.18,EclipseLink 2.4
在上一个练习学习了如何使用Jersey,以及JAXB来创建RESTful的web service。
现在我来结合后台数据库对其做升级,也就是通过Jersey创建用来修改后台数据库的RESTful web service。
开发环境:
Eclipse Juno, 数据库MySQL 5.5, Jersey 1.18,EclipseLink 2.4, JAVA 1.6, 应用服务器Tomcat 7。
1.创建一个叫做jersey3的Dynamic Web Project。添加JPA的facet。
2.导入Jersey包,导入EclipseLink包,导入MySQL的connect包。
3.开发数据库对象,配置JPA。
数据对象Employee类:
package sample; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @Entity @Table(name = "employee") public class Employee { @Id @Column(name = "userId") private Long id; @Column(name = "firstName") private String firstName; @Column(name = "lastName") private String lastName; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="EmployeePU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>sample.Employee</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:8889/test" /> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="root" /> </properties> </persistence-unit> </persistence>
4.配置Jersey,编写代码来实现RESTful web service。
创建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_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>RestProjectTest</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>sample</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</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> <listener> <listener-class>sample.LocalEntityManagerFactory</listener-class> </listener></span> </web-app> 注意添加了一个监听器LocalEntityManagerFactory,实现了ServletContextListener类,它可以在应用启动和关闭的时候后自动调用。
可以来管理我们的EntityManager。
package sample; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class LocalEntityManagerFactory implements ServletContextListener { private static EntityManagerFactory emf; @Override public void contextInitialized(ServletContextEvent event) { emf = Persistence.createEntityManagerFactory("EmployeePU"); System.out.println("ServletContextListener started"); } @Override public void contextDestroyed(ServletContextEvent event) { emf.close(); System.out.println("ServletContextListener destroyed"); } public static EntityManager createEntityManager() { if (emf == null) { throw new IllegalStateException("Context is not initialized yet."); } return emf.createEntityManager(); } }
package sample; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/employee") public class EmployeeController { @GET @Produces({ MediaType.TEXT_XML }) @Path("{id}") public Employee read(@PathParam("id") long id) { long start = System.currentTimeMillis(); System.out.println("EmployeeController.read() started"); EntityManager em = LocalEntityManagerFactory.createEntityManager(); try { return em.find(Employee.class, id); } finally { em.close(); System.out.println("Getting data took " + (System.currentTimeMillis() - start) + "ms."); } } @GET @Produces({ MediaType.TEXT_XML }) public List<Employee> read() { long start = System.currentTimeMillis(); System.out.println("EmployeeController.read() started"); EntityManager em = LocalEntityManagerFactory.createEntityManager(); try { Query q = em.createQuery("SELECT e FROM Employee e"); List<Employee> result = q.getResultList(); return result; } finally { em.close(); System.out.println("Getting data took " + (System.currentTimeMillis() - start) + "ms."); } } }
这里实现了两个GET接口,一个按照ID返回单个Employee对象,另一个返回全部Employee对象。
5.准备几条测试数据,插入到数据库表中。
6.测试,这里我用的Chrome浏览器插件的POSTMAN来测试。
6.1测试1,单个查询
输入url: http://localhost:8080/jersey3/employee/{id}
6.2测试2,查询全部数据
输入URL: http://localhost:8080/jersey3/employee/
小结:
这个例子很简单,配置好JPA和Jersey后,主要就是在Jersey的实现方法中把数据的CRUD需求交给JPA的Entity Manager来完成就可以了。

Alat panas Tag

Artikel Panas

Alat panas Tag

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Alih keluar nilai pendua daripada tatasusunan PHP menggunakan ungkapan biasa

Tutorial BTCC: Bagaimana untuk mengikat dan menggunakan dompet MetaMask pada pertukaran BTCC?

Apakah Bitget Launchpool? Bagaimana untuk menggunakan Bitget Launchpool?

Untuk apa pengaturcaraan dan apakah kegunaan mempelajarinya?

Kunci Pengekodan: Membuka Kunci Kuasa Python untuk Pemula

Penyelesaian Masalah dengan Python: Buka Kunci Penyelesaian Berkuasa sebagai Pengekod Pemula

Java Made Simple: Panduan Pemula untuk Kuasa Pengaturcaraan

Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak
