本文主要介绍JAVA Jersey的概念和用法。这篇文章解释的很详细,对大家的学习有帮助。感兴趣的朋友可以参考一下。
Java Jersey的详情概述
Jersey是一个RESTFUL请求服务spring mvc,类似于传统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提供会话等状态管理,jersey没有。这来自RESTFull的无状态设计;
6.响应方式支持更好的结果和方便的状态,包括200、303、401、403;
7.提供一个超级特别和方便的方法来访问RESTFull
毛线衫
1的版本。x是sun公司提供的独立jar包。在版本2中。x,jersey已经集成到JavaSE中,在javax.ws.rs.*包中。
类似于Struts,也可以和hibernate,spring框架集成。
因为Struts2 hibernate spring集成的市场占有率太高,所以很少有人关注Jersey。
所以网上关于泽西的介绍很少。但它确实是一个非常好的框架。对于按需服务,对于get和delete请求,您甚至只需要给出一个URI来完成操作。
举个简单的例子:如果你想获取服务器数据库中的所有数据;
然后可以在浏览器中或者通过使用Ajax的GET方法设置路径;
例如:localhost:8080/Student(项目名称)/studentinfo(项目服务全局前缀)/Student(处理学生对象的背书)/getStudentInfo(最后一个前缀)。
可以选择GET得到的数据的返回类型:JSON,XML,TEXT_HTML(String).获得后,可以通过JS将这些数据插入HTML或jsp页面。
Jersey是JAX-RS(JSR311)开源参考实现用于构建 RESTful Web service,它包含三个部分:
核心服务器:通过在JSR 311中提供标准化的注释和API标准化,可以以直观的方式开发RESTful Web服务。
Core Client) :Jersey client API可以帮助开发者轻松地与RESTful服务进行通信;
集成):Jersey还提供了可以轻松继承Spring、Guice和Apache Abdera的库。
这次开发用的是Jersey2.0,只用的是核心服务器。
设置Jersey环境
Maven
!-新泽西-
属国
groupId org . glassfish . jersey . containers/groupId
artifactId jersey-container-servlet-core/artifactId
版本2.0/版本
/依赖关系
!- JAXB API -
属国
groupIdjavax.xml.ws/groupId
artifactIdjaxws-api/artifactId
版本2.1/版本
/依赖关系
!- Json支持-
属国
groupIdorg.codehaus.jackson/groupId
artifactId Jackson-core-ASL/artifactId
版本1 . 9 . 12/版本
/依赖关系
属国
groupIdorg.codehaus.jackson/groupId
artifactId Jackson-mapper-ASL/artifactId
版本1 . 9 . 12/版本
/依赖关系
属国
groupIdorg.codehaus.jackson/groupId
artifactId Jackson-jaxrs/artifactId
版本1 . 9 . 12/版本
/依赖关系
Jar文件简介
WEB-INF下的库目录复制自Jersey开发包,包含以下库:
1:服务器:jersey-server.jar,jersey-container-servlet-core . jar,jersey-container-servlet.jar,javax.ws.rs-API-2.0.jar。
客户端:泽西岛客户端. jar
3 common:新泽西-common.jar
4 json支持:球衣2.0需要Jackson1.9支持json。
Hello World
下面将展示一个Hello World
步骤1:编写一个名为HelloResource的资源,它接受Http Get请求并响应“Hello Jersey”
@Path(/hello )
公共类HelloResource {
@GET
@Produces(MediaType。TEXT_PLAIN)
公共字符串sayHello() {
回‘你好球衣’;
}
}
第二步:编写JAX遥感应用程序
公共类APIApplication扩展ResourceConfig {
公共APIApplication() {
//加载资源
注册(hello资源。类);
//注册数据转换器
注册(jacksonjsonprovider。类);
//日志记录。
注册(日志过滤器。类);
}
}
第三步:在web.xml文件中定义塞尔韦尔特调度程序,目的是将所有休息请求发送到泽西岛容器。除了声明Jersey Servlet外,还需定义一个初始化参数,指定JAX遥感应用。
!-用于定义RESTful Web服务接口-
小型应用程序
servlet-name jersey servlet/servlet-name
servlet类组织。玻璃鱼。新泽西。servlet。servlet容器/servlet类
初始化参数
param-namejavax.ws.rs.Application/param-name
param-valuecn.com.mink.resource.APIApplication/param-value
/init-param
启动时加载1/启动时加载
/servlet
小型应用程序映射
servlet-name jersey servlet/servlet-name
URL-模式/服务/*/URL-模式
/servlet-映射
在命令终端中输入以下命令,将会看到"你好,新泽西".
卷曲http://主机主机:端口/服务/你好
或者在浏览器中输入以下URL,将会看到"你好,球衣"
http://主机:端口/服务/你好
使用
资源
根资源和子资源
资源是组成安静的服务的关键部分,可以使用超文本传送协议方法(如:获取、发布、上传和删除)操作资源。在JAX RX中,资源通过波乔实现,使用@路径注释组成其标识符。资源可以有子资源,父资源是资源集合,子资源是成员资源。
在以下样例代码中,
资源是/服务上呼吸道感染组成是集合资源,用户资源是"/服务/用户“URI组成的成员资源;
@Path(/services )
公共类资源{
@Path(/user )
公共用户资源getuser resource(){
.
}
@Path(/book )
公共图书资源getBookResource(){
.
}
}
用户资源是"/用户“URI组成的集合资源,getUser是"/user/{用户名}”URI组成的资源方法
@Path(/user )
公共类用户资源{
@GET
@ Path( {用户名 })
@Produces(application/json )
公共用户getUser(@PathParam(username )字符串用户名){
.
}
}
HTTP Methods
超文本传送协议方法映射到资源的污物(创建、读取、更新和删除)操作,基本模式如下:
HTTP GET:读取/列出/检索单个或资源集合。
超文本传送协议帖子:新建资源。
HTTP PUT:更新现有资源或资源集合。
超文本传送协议删除:删除资源或资源集合。
@生产
@生产注释用来指定将要返回给客户端的数据标识类型(哑剧).@生产可以作为班级注释,也可以作为方法注释,方法的@生产注释将会覆盖班级的注释。
一指定一个哑剧类型
@Produces(application/json )
2指定多个哑剧类型
@Produces({application/json , application/xml})
@消费
@消费与@生产相反,用来指定可以接受客户发送过来的哑剧类型,同样可以用于班级或者方法,也可以指定多个哑剧类型,一般用于@放,@贴。
参数(Parameter Annotations)
参数注释用于获取客户发送的数据。本文只介绍常用的注解,更多详见泽西岛用户手册
@PathParam
使用@PathParam可以获取上呼吸道感染中指定规则的参数,比如:
@GET
@ Path( {用户名 })
@Produces(MediaType .应用程序_JSON)
公共用户getUser(@PathParam(username )字符串用户名){
.
}
当浏览器请求http://本地主机/用户/插孔时,用户名值为杰克。
@QueryParam
@QueryParam用于获取得到请求中的查询参数,如:
@GET
@Path(/user )
@Produces(text/plain )
公共用户getUser(@QueryParam(name )字符串名称,
@QueryParam(age) int age) {
.
}
当浏览器请求http://主机:端口/用户?name=roseage=25时,名称值为罗斯,年龄值为25。如果需要为参数设置默认值,可以使用@默认值如:
@GET
@Path(/user )
@Produces(text/plain )
公共用户getUser(@QueryParam(name )字符串名称,
@默认值( 26 )@ query param( age )int age){
.
}
当浏览器请求http://主机:端口/用户?name=rose时,名称值为罗斯,年龄值为26。
@FormParam
@FormParam,顾名思义,从邮政请求的表单参数中获取数据。如:
@帖子
@ Consumes( application/x-www-form-urlencoded )
公共void post(@FormParam(name )字符串名称){
//存储消息
}
@BeanParam
当请求参数很多时,比如客户端提交一个修改用户的放请求,请求中包含很多项用户信息。这时可以用@BeanParam。
@帖子
@ Consumes( application/x-www-form-urlencoded )
公共空的更新(@BeanParam User用户){
//存储用户数据
}
用户豆定义如下:
@XmlRootElement(name=user )
公共类用户{
@PathParam(用户名)
私有字符串用户名;
@FormParam(name )
私有字符串名称;
@FormParam(电话)
私人有线电话;
@FormParam(电子邮件)
私人字符串电子邮件;
公共字符串getUserName() {
返回用户名;
}
公共void setUserName(字符串用户名){
this .用户名=用户名;
}
.
}
使用地图
在一个大型的计算机网络服务器中,因为参数的多变,参数结构的调整都会因为以上几种方式而遇到问题,这时可以考虑使用@上下文注释,并获取UriInfo实例,如下:
@GET
公共字符串get(@Context UriInfo ui) {
MultivaluedMapString,字符串查询params=ui。getqueryparameters();
MultivaluedMapString,字符串路径params=ui。getpath参数();
}
同样还可以通过@上下文注释获取ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等,如下:
@Path(/)
公共类资源{
@上下文
HttpServletRequest请求;
@上下文
ServletConfig servletConfig
@上下文
ServletContext
@GET
公共字符串get(@Context HttpHeaders hh) {
MultivaluedMapString,字符串头params=hh。getrequestheaders();
MapString,Cookie path params=hh。获取cookie();
}
}
Jersey返回Json和Xml
JAX遥感中心支持使用JAXB(用于可扩展标记语言绑定的Java API)将JavaBean绑定到可扩展标记语言或JSON,反之亦然JavaBean .必须使用@XmlRootElement标注,没有@XmlElement注释的字段将包含一个名称与之相同的可扩展标记语言元素,如下:
@XmlRootElement
公共类选项结果{
@XmlElement(name=code )
私有字符串结果;
私有字符串错误消息
公共字符串getResult() {
返回结果;
}
公共void setResult(字符串结果){
这个. result=结果
}
公共字符串getErrorMsg() {
返回错误消息
}
公共空集错误消息(字符串错误消息){
这个。错误消息=错误消息;
}
}
然后在休息服务中使用:
@Path(/user )
公共类用户资源{
@帖子
@Produces(application/json )
公共选项结果创建(@ bean param User User){
.
}
}
最后,要注册数据转换器,该转换器会自动将JavaBean转换为json数据:
公共类API应用程序扩展资源配置{
公共APIApplication() {
//加载模型
注册(选项结果。类);
//加载与OptionResult同一个包装的模型
//包(选项结果。班级。获取包().getName());
//加载资源
注册(用户资源。类);
//注册数据转换器
注册(jacksonjsonprovider。类);
//日志记录。
注册(日志过滤器。类);
}
}
说明:返回可扩展标记语言数据的原理相同,仅仅是数据转换器不同,只需要在应用程序接口应用程序中同时注册可扩展标记语言数据转换器即可,详见泽西岛用户手册
问题总结
Ajax请求(POST、PUT和DELETE)无法将数据提交到Jersey容器
问题阐述
在短信平台的开发中,数据的创建、读取、更新和删除全部使用埃阿斯技术完成,因此必须使用发布、上传和删除请求。此三种请求的内容类型均为" application/x-www-form-urlencoded ",使用UTF-8编码会变成“application/x-www-form-urlencoded;UTF-8。在使用火狐浏览器的坦佩达扩展调试程序的过程中发现,当内容类型为" application/x-www-form-urlencoded "时,球衣容器能够通过@FormParam注解获取到提交的数据,而内容类型为“application/x-www-form-urlencoded;UTF-8”时便获取不到。
解决方案
最终我使用Java 语言(一种计算机语言,尤用于创建网站)过滤器和泽西岛请求过滤器解决了问题。首先在Java 语言(一种计算机语言,尤用于创建网站)过滤器中使用UTF8将请求中的数据编码,然后在泽西岛请求过滤器中将请求对象中的内容类型修改为application/x-www-form-urlencoded。如:
公共void doFilter(ServletRequest请求,ServletResponse响应,滤波器链链)引发IOException,ServletException {
http servlet请求req=(http servlet请求)请求;
请求。setcharacterencoding(“UTF-8”);
}
公共类请求过滤器实现ContainerRequestFilter {
@覆盖
公共空的筛选器(ContainerRequestContext上下文)引发IOException {
字符串头字符串=上下文。获取标头字符串(“content-type”);
if (headerString!=null) {
//如果内容类型以 application/x-www-form-urlencoded 开头,则处理
if(头字符串。以(媒体类型)开头.应用程序_表单_URLENCODED))
context.getHeaders().putSingle(content-type ,MediaType .APPLICATION _ FORM _ URLENCODED);
}
}
}
最后在web.xml中注册Java 语言(一种计算机语言,尤用于创建网站)过滤器(要注册在泽西岛容器之前),在应用程序接口应用程序中注册泽西岛请求过滤器,如下:
公共类API应用程序扩展资源配置{
公共APIApplication() {
注册(请求过滤器。类);
}
}
说明:在修复此问题后,在开源代码库的泽西岛源代码仓库中看到已经有人发现并修复了此问题,在下个泽西岛正式版本中应该不会再出现这样的问题,详见此讨论
以上就是深入了解爪哇运动衫的详细内容,更多关于爪哇运动衫的资料请关注我们其它相关文章!