【jersey】 spring 整合jersey 實現RESTful webservice


     Jersey是一個RESTFUL請求服務JAVA框架,與常規的JAVA編程使用的struts框架類似,它主要用於處理業務邏輯層。與Struts類似,它同樣可以和hibernate,spring框架整合。
由於Struts2+hibernate+spring整合在市場的占有率太高,所以很少一部分人去關注Jersey。所以網上有關於Jersey的介紹很少。但是它確實是一個非常不錯的框架。對於請求式服務,對於GET,DELETE請求,你甚至只需要給出一個URI即可完成操。
 
jar 文件依賴:
<properties>

    <jersey.version>2.22.1</jersey.version>
    <spring.version>4.1.6.RELEASE</spring.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.glassfish.jersey.ext</groupId>
      <artifactId>jersey-spring3</artifactId>
      <version>${jersey.version}</version>
      <!-- <exclusions>
          <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring-core</artifactId>
          </exclusion>
          <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring-web</artifactId>
          </exclusion>
          <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring-beans</artifactId>
          </exclusion>
            <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring-tx</artifactId>
          </exclusion>

            <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
          </exclusion>
           <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context-support</artifactId>
          </exclusion>
      </exclusions>             -->
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>${jersey.version}</version>
    </dependency>

    <dependency>
      <groupId>org.glassfish.jersey.ext</groupId>
      <artifactId>jersey-mvc</artifactId>
      <version>${jersey.version}</version>
    </dependency>

    <dependency>
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-client</artifactId>
      <version>${jersey.version}</version>
    </dependency>
    <!--servlet-->


    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.7</version>
    </dependency>

    <!-- Druid -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.13</version>
    </dependency>

    <!-- spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- MySQL Driver -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>

    <!-- MyBatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.3.0</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.3</version>
    </dependency>

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.7</version>
        </dependency>
  </dependencies>

web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <filter>
    <filter-name>jersey</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.xwolf.jersey</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.server.mvc.jsp.JspMvcFeature</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.mvc.templateBasePath.jsp</param-name>
        <param-value>/</param-value>
    </init-param>
    <init-param>
       <param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
       <param-value>/.*jsp</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd    
    http://www.springframework.org/schema/tx    
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd   
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
    http://www.springframework.org/schema/context   
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    
    <!-- 激活annotation功能 -->
     <context:component-scan base-package="com.xwolf" />
    
 
 <!-- 實例化占位符對象,加載數據庫配置信息 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath*:db.properties</value>
              </list>
        </property>
    </bean>

    <!-- 配置數據源,並設置連接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- 設置數據庫連接參數 -->
        <property name="url" value="${url}" />
        <property name="driverClassName" value="${driverClassName}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
        <!-- 設置連接池參數 -->
        <property name="initialSize" value="${initSize}" />
        <property name="maxActive" value="${maxSize}" />
        <property name="filters" value="stat" />
    </bean>
    
    
    
    <!-- 整合Mybatis框架 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:spring-mybatis.xml" />
        <property name="dataSource" ref="dataSource" />
         <property name="mapperLocations">
         <list>
         <value>classpath:com/xwolf/jersey/mapper/*.xml</value>
         </list>
         </property>
    </bean>
  
    <!-- 配置掃描dao接口 -->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xwolf.jersey.dao"></property>
    </bean>
    
 <!-- 注入dataSource -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"></property>
     </bean>
    
    <!-- 啟用事務 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager" >
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="query*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="load*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

    <!-- AOP代理設置 -->
    <aop:config proxy-target-class="true">
        <aop:advisor pointcut="execution(* com.xwolf.jersey.service..*.*(..))" advice-ref="txAdvice" />
    </aop:config>
 
</beans>

User.java:

package com.xwolf.jersey.bean;

import java.util.Date;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {
    
    private Long uid;
    private String name ;
    private String pwd;
    
    
    private Date birth;
    
    @XmlElement
    public Long getUid() {
        return uid;
    }
    public void setUid(Long uid) {
        this.uid = uid;
    }
    
    @XmlElement
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    
    @XmlElement
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    
    @XmlElement
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    @Override
    public String toString() {
        return "User [uid=" + uid + ", name=" + name + ", pwd=" + pwd
                + ", birth=" + birth + "]";
    }
    

}

userController.java;

package com.xwolf.jersey.controller;

import java.io.IOException;
import java.util.Date;

import javax.inject.Singleton;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.alibaba.fastjson.JSONObject;
import com.xwolf.jersey.bean.User;
import com.xwolf.jersey.service.UserService;

@Controller
@Singleton
@Path("/user")
public class UserController {
    
    @Autowired
    private UserService userService;
    /**
     * 返回字符串
     * @return
     */
    @GET
    @Path("/str")
    @Produces(MediaType.TEXT_PLAIN)
    public String str(){
        return "Hello,Jersey !";
    }
    
    /**
     * 返回xml
     * @return
     */
    @GET
    @Path("/getXml")
    @Produces(MediaType.APPLICATION_XML)
    public User getUserXml(){
        User user =new User();
        user.setUid(234234l);
        user.setName("隔壁老王");
        user.setPwd("rwerwe");
        user.setBirth(new Date());
        return user;
    }
    
    @GET
    @Path("/getJson")
    @Produces(MediaType.APPLICATION_JSON)
    public User getUserJson(){
        User user =new User();
        user.setUid(234234l);
        user.setName("隔壁老王");
        user.setPwd("rwerwe");
        user.setBirth(new Date());
        return user;
    }
    
    
    /**
     * 用戶注冊
     * @param uname
     * @param pwd
     * @return
     */
    @POST
    @Path("/register")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public String register(@FormParam(value = "uname") String uname,
            @FormParam(value="pwd")String pwd){
        User user = new User();
        user.setName(uname);
        user.setPwd(pwd);
        user.setBirth(new Date());
        JSONObject object = new JSONObject();
        try {
            userService.add(user);
            object.put("success", true);
            object.put("msg", "注冊成功!");
        } catch (Exception e) {
            object.put("success", false);
            object.put("msg", "注冊失敗了!");
            e.printStackTrace();
        }
        return object.toJSONString();
    }
    

    
    
   

}

form.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注冊</title>
</head>
<body>


  <form action="${pageContext.request.contextPath}/user/register" method="POST" >
  
  <table>
  <tr>
  <td>用戶名:</td>
  <td><input name="uname"></td>
  </tr>
  
  <tr>
  <td>密碼:</td>
  <td><input name="pwd"></td>
  </tr>
  
  
  <tr>
  <td><input type="submit" value="注冊"></td>
  </tr>
  
  </table>
  
  </form>

</body>
</html>

附錄:

jersey常用注解解釋
Annotation 作用 說明
@GET 查詢請求 相當於數據庫的查詢數據操作
@POST 插入請求 相當於數據庫的插入數據操作
@PUT 更新請求 相當於數據庫的更新數據操作
@DELETE 刪除請求 相當於數據的刪除數據操作
@Path uri路徑 定義資源的訪問路徑,client通過這個路徑訪問資源。比如:@Path("user")
@Produces 指定返回MIME格式 資源按照那種數據格式返回,可取的值有:MediaType.APPLICATION_XXX。比如:@Produces(MediaType.APPLICATION_XML)。即將要返回給client端的數據標識類型(MIME)。@Produces可以作為class注釋,也可以作為方法注釋,方法的@Produces注釋將會覆蓋class的注釋。
@Consumes 接受指定的MIME格式 只有符合這個參數設置的請求才能訪問到這個資源。比如@Consumes("application/x-www-form-urlencoded")。即用來指定可以接受client發送過來的MIME類型,同樣可以用於class或者method,也可以指定多個MIME類型,一般用於@PUT@POST 
@PathParam uri路徑參數 可以獲取URI中指定規則的參數。寫在方法的參數中,獲得請求路徑參數。比如:@PathParam("username")  String userName。
@QueryParam uri路徑請求參數 用於獲取GET請求中的查詢參數。寫在方法的參數中,獲得請求路徑附帶的參數。比如:@QueryParam("desc")  String desc
@DefaultValue 設置@QueryParam參數的默認值 如果@QueryParam沒有接收到值,就使用默認值。比如:@DefaultValue("description") @QueryParam("desc") String desc
@FormParam form傳遞的參數 接受form傳遞過來的參數。比如:@FormParam("name")  String userName
@BeanParam 通過Bena的形式傳遞參數 接受client傳遞的bean類型的參數,同時這個bean可以在屬性上配置@FormParam用以解決client的屬性名稱和bean的屬性名稱不一致的問題。比如:@BeanParam  User user
@Context 獲得一些系統環境信息 通過@Context可以獲得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等
@XmlRootElement 將bean轉換為xml 如果要講bean以xml或json的格式返回,必須要這個注解。比如:

@XmlRootElement

public class User{...}

@XmlElements
 
 
@XmlElement
 
 
HTTP Methods
  GET 請求
讀取/列出/檢索單個或資源集合。使用 WebResource 類的 get() 方法來提交一個 HTTP GET請求到 Web 資源,String s = webResource.get(String.class); 這表示如果 WebResource 對象的 URL 是 http://localhost:8000/restful/services/restresource/getUser,那么一個 HTTP GET 請求將會發送到地址為  http://localhost:8000/restful/services/restresource/getUser 的資源
PUT 請求

更新現有資源或資源集合。 使用 WebResource 類的 put() 方法來提交一個 HTTP PUT 請求到 Web 資源。例如下面的代碼展示了請求發送一個文本實體 foo:bar 到指定的 Web 資源:

ClientResponse response = webResource.type("text/plain").put(ClientResponse.class, "foo:bar");      

同樣,你也可以在使用 put() 方法發送請求時指定查詢參數,方法與使用 get() 方法時指定查詢參數一樣

  POST 請求
新建資源.一個 POST 請求相當於一個 GET 請求和一個 PUT 請求的綜合,也就意味着,你可以使用 POST 請求來發送一個實體到指定的 Web 資源並且接收另一個實體。使用 WebResource 類的 post() 方法來發送一個 HTTP POST 請求到指定的 Web 資源。
 DELETE 請求
刪除資源或資源集合。使用 WebResource 類的 delete() 方法來發送一個 HTTP DELETE 請求到指定的 Web 資源。

 

 

參考資料:

Jersey 2.22.1 User Guide

使用 Jersey 和 Apache Tomcat 構建 RESTful Web 服務

 Jersey+Spring:解決Jersey單實例問題 

jersey+spring+maven入門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM