电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

深入了解JAVA Jersey框架

瀏覽:37日期:2022-08-31 14:45:16

Java Jersey的詳情概述

Jersey是一個RESTFUL請求服務JAVA框架,與常規的JAVA編程使用的struts框架類似,它主要用于處理業務邏輯層。

與springmvc 的區別:

1. jersey同樣提供DI,是由glassfish hk2實現,也就是說,如果想單獨使用jersey一套,需要另外學習Bean容器;

2. MVC出發點即是WEB,但jersey出發點確實RESTFull,體現點在與接口的設計方面,如MVC返回復雜結構需要使用ModelAndView,而jersey僅僅需要返回一個流或者文件句柄;

3. jersey提供一種子資源的概念,這也是RESTFull中提倡所有url都是資源;

4. jersey直接提供application.wadl資源url說明;

5. MVC提供Session等狀態管理,jersey沒有,這個源自RESTFull設計無狀態化;

6. Response方法支持更好返回結果,方便的返回Status,包括200,303,401,403;

7. 提供超級特別方便的方式訪問RESTFull;

jersey

1.X的版本是sun公司提供的獨立的jar包,在2.X版本中,已經將jersey融合到JavaSE中,在javax.ws.rs.*包中。

與Struts類似,它同樣可以和hibernate,spring框架整合。

由于Struts2+hibernate+spring整合在市場的占有率太高,所以很少一部分人去關注Jersey。

所以網上有關于Jersey的介紹很少。但是它確實是一個非常不錯的框架。對于請求式服務,對于GET,DELETE請求,你甚至只需要給出一個URI即可完成操作。

舉個簡單的例子:如果你想獲得服務器數據庫中的所有數據;

那么你可以在瀏覽器或者利用Ajax的GET方法,將路徑設置好;

例如:localhost:8080/Student(項目名稱)/studentinfo(項目服務總體前綴)/student(處理student對象的簽注)/getStudentInfo(最后前綴)。

你可以選擇GET獲取的數據的返回類型:JSON,XML,TEXT_HTML(String)..獲取之后,你可以通過JS將這些數據塞到html或者jsp頁面上。

Jersey是JAX-RS(JSR311)開源參考實現用于構建 RESTful Web service,它包含三個部分:

核心服務器(Core Server) :通過提供JSR 311中標準化的注釋和API標準化,可以用直觀的方式開發RESTful Web服務。

核心客戶端(Core Client) :Jersey客戶端API能夠幫助開發者與RESTful服務輕松通信;

集成(Integration) :Jersey還提供可以輕松繼承Spring、Guice、Apache Abdera的庫。

在本次開發中使用Jersey2.0,并且僅使用了核心服務器。

設置Jersey環境

Maven

<!--jersey--><dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.0</version></dependency><!--JAXB API--><dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.1</version></dependency><!-- Json支持 --><dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.12</version></dependency><dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.12</version></dependency><dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.9.12</version></dependency>

引入Jar文件方式

從Jersey開發包中將以下庫復制的WEB-INF下的庫目錄:

1 服務器:jersey-server.jar 、jersey-container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api-2.0.jar

2 客戶端:jersey-client.jar

3 common:jersey-common.jar

4 json支持:在Jersey2.0中需要使用 Jackson1.9 才能支持json。

Hello World

以下將展示一個Hello World

第一步: 編寫一個名為HelloResource的資源,它接受Http Get請求并響應“Hello Jersey”

@Path('/hello')public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String sayHello() { return 'Hello Jersey'; }}

第二步: 編寫JAX-RS application

public class APIApplication extends ResourceConfig { public APIApplication() { //加載Resource register(HelloResource.class); //注冊數據轉換器 register(JacksonJsonProvider.class); // Logging. register(LoggingFilter.class); }}

第三步: 在web.xml文件中定義servelt調度程序,目的是將所有REST請求發送到Jersey容器。除了聲明Jersey Servlet外,還需定義一個初始化參數,指定JAX-RS application。

<!--用于定義 RESTful Web Service 接口--><servlet> <servlet-name>JerseyServlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>cn.com.mink.resource.APIApplication</param-value> </init-param> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>JerseyServlet</servlet-name> <url-pattern>/services/*</url-pattern></servlet-mapping>

在命令終端中輸入以下命令,將會看到“Hello Jersey”。

curl http://host:port/services/hello

或者在瀏覽器中輸入以下URL,將會看到“Hello Jersey”

http://host:port/services/hello

使用

資源

Root Resource And Sub-Resource

資源是組成RESTful服務的關鍵部分,可以使用HTTP方法(如:GET、POST、PUT和DELETE)操作資源。在JAX-RX中,資源通過POJO實現,使用 @Path 注釋組成其標識符。資源可以有子資源,父資源是資源集合,子資源是成員資源。

在以下樣例代碼中,

Resources是'/services' URI組成是集合資源,UserResource是“/services/user” URI組成的成員資源;

@Path('/services')public class Resources { @Path('/user') public UserResource getUserResource() { ... } @Path('/book') public BookResource getBookResource() { ... }}

UserResource是“/user” URI組成的集合資源,getUser是“/user/{username}” URI組成的資源方法

@Path('/user')public class UserResource { @GET @Path('{username'}) @Produces('application/json') public User getUser(@PathParam('username') String userName) { ... }}

HTTP Methods

HTTP方法映射到資源的CRUD(創建、讀取、更新和刪除)操作,基本模式如下:

HTTP GET :讀取/列出/檢索單個或資源集合。

HTTP POST :新建資源。

HTTP PUT :更新現有資源或資源集合。

HTTP DELETE :刪除資源或資源集合。

@Produces

@Produces 注釋用來指定將要返回給client端的數據標識類型(MIME)。@Produces 可以作為class注釋,也可以作為方法注釋,方法的 @Produces 注釋將會覆蓋class的注釋。

1 指定一個MIME類型

@Produces('application/json')

2 指定多個MIME類型

@Produces({'application/json','application/xml'})

@Consumes

@Consumes 與 @Produces 相反,用來指定可以接受client發送過來的MIME類型,同樣可以用于class或者method,也可以指定多個MIME類型,一般用于 @PUT ,@POST 。

參數(Parameter Annotations)

Parameter Annotations用于獲取client發送的數據。本文只介紹常用的注解,更多詳見 Jersey用戶手冊

@PathParam

使用 @PathParam 可以獲取URI中指定規則的參數,比如:

@GET@Path('{username'})@Produces(MediaType.APPLICATION_JSON)public User getUser(@PathParam('username') String userName) { ...}

當瀏覽器請求 http://localhost/user/jack 時,userName值為jack。

@QueryParam

@QueryParam 用于獲取GET請求中的查詢參數,如:

@GET@Path('/user')@Produces('text/plain')public User getUser(@QueryParam('name') String name, @QueryParam('age') int age) { ...}

當瀏覽器請求 http://host:port/user?name=rose&age=25 時,name值為rose,age值為25。如果需要為參數設置默認值,可以使用 @DefaultValue ,如:

@GET@Path('/user')@Produces('text/plain')public User getUser(@QueryParam('name') String name, @DefaultValue('26') @QueryParam('age') int age) { ...}

當瀏覽器請求 http://host:port/user?name=rose 時,name值為rose,age值為26。

@FormParam

@FormParam ,顧名思義,從POST請求的表單參數中獲取數據。如:

@POST@Consumes('application/x-www-form-urlencoded')public void post(@FormParam('name') String name) { // Store the message}

@BeanParam

當請求參數很多時,比如客戶端提交一個修改用戶的PUT請求,請求中包含很多項用戶信息。這時可以用 @BeanParam 。

@POST@Consumes('application/x-www-form-urlencoded')public void update(@BeanParam User user) { // Store the user data}

User Bean定義如下:

@XmlRootElement(name = 'user')public class User { @PathParam('userName) private String userName; @FormParam('name') private String name; @FormParam('telephone') private String telephone; @FormParam('email') private String email; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } ...}

使用Map

在一個大型的server中,因為參數的多變,參數結構的調整都會因為以上幾種方式而遇到問題,這時可以考慮使用 @Context 注釋,并獲取UriInfo實例,如下:

@GETpublic String get(@Context UriInfo ui) { MultivaluedMap<String, String> queryParams = ui.getQueryParameters(); MultivaluedMap<String, String> pathParams = ui.getPathParameters();}

同樣還可以通過 @Context 注釋獲取 ServletConfig 、 ServletContext 、HttpServletRequest 、 HttpServletResponse 和 HttpHeaders 等,如下:

@Path('/')public class Resource { @Context HttpServletRequest req; @Context ServletConfig servletConfig; @Context ServletContext servletContext; @GET public String get(@Context HttpHeaders hh) { MultivaluedMap<String, String> headerParams = hh.getRequestHeaders(); Map<String, Cookie> pathParams = hh.getCookies(); }}

Jersey返回Json和Xml

JAX-RS支持使用JAXB(Java API for XML Binding)將JavaBean綁定到XML或JSON,反之亦然。JavaBean必須使用 @XmlRootElement 標注,沒有@XmlElement 注釋的字段將包含一個名稱與之相同的XML元素,如下:

@XmlRootElementpublic class OptionResult { @XmlElement(name = 'code') private String result; private String errorMsg; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getErrorMsg() { return errorMsg; } public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; }}

然后在REST服務中使用:

@Path('/user')public class UserResource { @POST @Produces('application/json') public OptionResult create(@BeanParam User user) { ... }}

最后,要注冊數據轉換器,該轉換器會自動將JavaBean轉換為json數據:

public class APIApplication extends ResourceConfig { public APIApplication() { //加載Model register(OptionResult.class); //加載與OptionResult同一個packge的Model //packages(OptionResult.class.getPackage().getName()); //加載Resource register(UserResource.class); //注冊數據轉換器 register(JacksonJsonProvider.class); // Logging. register(LoggingFilter.class); }}

說明 :返回XML數據的原理相同,僅僅是數據轉換器不同,只需要在APIApplication中同時注冊XML數據轉換器即可,詳見 Jersey用戶手冊

問題總結

Ajax請求(POST、PUT和DELETE)無法將數據提交到Jersey容器

問題闡述

在短信平臺的開發中,數據的CRUD全部使用Ajax技術完成,因此必須使用POST、PUT和DELETE請求。此三種請求的content-type均為“application/x-www-form-urlencoded”,使用UTF-8編碼會變成“application/x-www-form-urlencoded; UTF-8”。在使用Firefox的tamperdata擴展調試程序的過程中發現,當content-type為“application/x-www-form-urlencoded”時,Jersey容器能夠通過 @FormParam 注解獲取到提交的數據,而content-type為“application/x-www-form-urlencoded; UTF-8”時便獲取不到。

解決方案

最終我使用Java Filter和Jersey RequestFilter解決了問題。首先在Java Filter中使用UTF8將Request中的數據編碼,然后在Jersey RequestFilter中將request對象中的content-type修改為“application/x-www-form-urlencoded”。如:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; req.setCharacterEncoding('UTF-8');}public class RequestFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext context) throws IOException { String headerString = context.getHeaderString('content-type'); if (headerString != null) { //如果content-type以'application/x-www-form-urlencoded'開頭,則處理 if (headerString.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) context.getHeaders().putSingle('content-type', MediaType.APPLICATION_FORM_URLENCODED); } }}

最后在web.xml中注冊Java Filter(要注冊在Jersey容器之前),在APIApplication中注冊Jersey RequestFilter,如下:

public class APIApplication extends ResourceConfig { public APIApplication() { register(RequestFilter.class); }}

說明 :在修復此問題后,在Github的Jersey源代碼倉庫中看到已經有人發現并修復了此問題,在下個Jersey正式版本中應該不會再出現這樣的問題,詳見 此Discussion

以上就是深入了解JAVA Jersey的詳細內容,更多關于JAVA Jersey的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 铝合金电阻-无源谐波滤波器-上海稳达电讯设备厂 | 缠绕机|缠绕膜包装机|缠绕包装机-上海晏陵智能设备有限公司 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 预制直埋蒸汽保温管-直埋管道-聚氨酯发泡保温管厂家 - 唐山市吉祥保温工贸有限公司 | 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 内六角扳手「厂家」-温州市威豪五金工具有限公司| 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 贵州水玻璃_-贵阳花溪闽兴水玻璃厂 | 避光流动池-带盖荧光比色皿-生化流动比色皿-宜兴市晶科光学仪器 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 方源木业官网-四川木门-全国木门专业品牌 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 体坛网_体坛+_体坛周报新闻客户端 | 数字展示在线_数字展示行业门户网站 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 锯边机,自动锯边机,双面涂胶机-建业顺达机械有限公司 | 贴片电容-贴片电阻-二三极管-国巨|三星|风华贴片电容代理商-深圳伟哲电子 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 加盟店-品牌招商加盟-创业项目商机平台 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | uv机-uv灯-uvled光固化机-生产厂家-蓝盾机电 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 |