首页编程java编程javax.ws 是什么框架(javax.ws.rs.core.response要关闭吗)

javax.ws 是什么框架(javax.ws.rs.core.response要关闭吗)

编程之家2023-10-1286次浏览

大家好,今天小编来为大家解答javax.ws 是什么框架这个问题,javax.ws.rs.core.response要关闭吗很多人还不知道,现在让我们一起来看看吧!

javax.ws 是什么框架(javax.ws.rs.core.response要关闭吗)

怎样用java web和websocket实现网页即时通讯

原理

WebSocket protocol。

现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。这种传统的HTTP request的模式带来很明显的缺点–浏览器需要不断的向服务器发出请求,然而HTTP request的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。

javax.ws 是什么框架(javax.ws.rs.core.response要关闭吗)

而比较新的技术去做轮询的效果是Comet–用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。

在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket协议中,为我们实现即时服务带来了两大好处:

1. Header

javax.ws 是什么框架(javax.ws.rs.core.response要关闭吗)

互相沟通的Header是很小的-大概只有 2 Bytes

2. Server Push

服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,而是在有新数据时就主动推送给浏览器。

一、项目简介

WebSocket是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,这里就将使用WebSocket来开发网页聊天室,前端框架会使用AmazeUI,后台使用Java,编辑器使用UMEditor。

二、涉及知识点

网页前端(HTML+CSS+JS)和Java

三、软件环境 Tomcat 7 JDK 7 Eclipse JavaEE现代浏览器

四、效果截图

效果1

效果2

五、项目实战

1.新建项目

打开Eclipse JavaEE,新建一个名为Chat的Dynamic Web Project,然后导入处理JSON格式字符串所需要的包,把commons-beanutils-1.8.0.jar、commons-collections-3.2.1.jar、commons-lang-2.5.jar、commons-logging-1.1.1.jar、ezmorph-1.0.6.jar和json-lib-2.4-jdk15.jar这几个包放在WebContent/WEB-INF/lib目录下,最后把项目发布到Tomcat服务器上,到此空项目就搭建完成了。

2.编写前端页面

在WebContent目录下新建一个名为index.jsp的页面,这里使用了AmazeUI框架,它是一个跨屏自适应的前端框架,消息输入框使用了UMEditor,它是一个富文本在线编辑器,能让我们的消息内容多姿多彩。

首先从 AmazeUI官网下载压缩包,然后解压把assets文件夹拷贝到WebContent目录下,这样我们就能使用AmazeUI了。

再从 UEditer官网下载Mini版的JSP版本压缩包,解压后把整个目录拷贝到WebContent目录下,接下来就可以编写前端代码了,代码如下(你可以按照自己的喜好编写):

?

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html lang="zh"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"><title>ShiYanLou Chat</title><!-- Set render engine for 360 browser--><meta name="renderer" content="webkit"><!-- No Baidu Siteapp--><meta http-equiv="Cache-Control" content="no-siteapp"/><link rel="alternate icon" rel="external nofollow" href="assets/i/favicon.ico"><link rel="stylesheet" rel="external nofollow" href="assets/css/amazeui.min.css"><link rel="stylesheet" rel="external nofollow" href="assets/css/app.css"><!-- umeditor css--><link rel="external nofollow" href="umeditor/themes/default/css/umeditor.css" rel="stylesheet"><style>.title{text-align: center;}.chat-content-container{height: 29rem;overflow-y: scroll;border: 1px solid silver;}</style></head><body><!-- title start--><div class="title"><div class="am-g am-g-fixed"><div class="am-u-sm-12"><h1 class="am-text-primary">ShiYanLou Chat</h1></div></div></div><!-- title end--><!-- chat content start--><div class="chat-content"><div class="am-g am-g-fixed chat-content-container"><div class="am-u-sm-12"><ul id="message-list" class="am-comments-list am-comments-list-flip"></ul></div></div></div><!-- chat content start--><!-- message input start--><div class="message-input am-margin-top"><div class="am-g am-g-fixed"><div class="am-u-sm-12"><form class="am-form"><div class="am-form-group"><script type="text/plain" id="myEditor" style="width: 100%;height: 8rem;"></script></div></form></div></div><div class="am-g am-g-fixed am-margin-top"><div class="am-u-sm-6"><div id="message-input-nickname" class="am-input-group am-input-group-primary"><span class="am-input-group-label"><i class="am-icon-user"></i></span><input id="nickname" type="text" class="am-form-field" placeholder="Please enter nickname"/></div></div><div class="am-u-sm-6"><button id="send" type="button" class="am-btn am-btn-primary"><i class="am-icon-send"></i> Send</button></div></div></div><!-- message input end--><!--[if(gte IE 9)|!(IE)]><!--><script src="assets/js/jquery.min.js"></script><!--<![endif]--><!--[if lte IE 8 ]><script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script><![endif]--><!-- umeditor js--><script charset="utf-8" src="umeditor/umeditor.config.js"></script><script charset="utf-8" src="umeditor/umeditor.min.js"></script><script src="umeditor/lang/zh-cn/zh-cn.js"></script><script>$(function(){//初始化消息输入框var um= UM.getEditor('myEditor');//使昵称框获取焦点$('#nickname')[0].focus();});</script></body></html>

编写完成之后启动Tomcat服务器,然后访问 http://localhost:8080/Chat/index.jsp,会看到如下界面。

3.编写后台代码

新建一个com.shiyanlou.chat的包,在包中创建一个名为ChatServer的类,从JavaEE 7开始就统一了WebSocket的API,因此无论是什么服务器,用Java写的代码都是一样的,代码如下:

?

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 package com.shiyanlou.chat;import java.text.SimpleDateFormat;import java.util.Date;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import net.sf.json.JSONObject;/***聊天服务器类*@author shiyanlou**/@ServerEndpoint("/websocket")public class ChatServer{private static final SimpleDateFormat DATE_FORMAT= new SimpleDateFormat("yyyy-MM-dd HH:mm");//日期格式化@OnOpenpublic void open(Session session){//添加初始化操作}/***接受客户端的消息,并把消息发送给所有连接的会话*@param message客户端发来的消息*@param session客户端的会话*/@OnMessagepublic void getMessage(String message, Session session){//把客户端的消息解析为JSON对象JSONObject jsonObject= JSONObject.fromObject(message);//在消息中添加发送日期jsonObject.put("date", DATE_FORMAT.format(new Date()));//把消息发送给所有连接的会话for(Session openSession: session.getOpenSessions()){//添加本条消息是否为当前会话本身发的标志jsonObject.put("isSelf", openSession.equals(session));//发送JSON格式的消息openSession.getAsyncRemote().sendText(jsonObject.toString());}}@OnClosepublic void close(){//添加关闭会话时的操作}@OnErrorpublic void error(Throwable t){//添加处理错误的操作}}

4.前后台交互

后台写完了,前台要用WebSocket连接后台,需要新建一个WebSocket对象,然后就可以和服务器端进行交互,从浏览器发送消息给服务器端,同时要验证输入框的内容是否为空,然后接受服务端发送的消息,把它们动态地添加到聊天内容框中,在

?

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 var um= UM.getEditor('myEditor');$('#nickname')[0].focus();//新建WebSocket对象,最后的/websocket对应服务器端的@ServerEndpoint("/websocket")var socket= new WebSocket('ws://${pageContext.request.getServerName()}:${pageContext.request.getServerPort()}${pageContext.request.contextPath}/websocket');//处理服务器端发送的数据socket.onmessage= function(event){addMessage(event.data);};//点击Send按钮时的操作$('#send').on('click', function(){var nickname=$('#nickname').val();if(!um.hasContents()){//判断消息输入框是否为空//消息输入框获取焦点um.focus();//添加抖动效果$('.edui-container').addClass('am-animation-shake');setTimeout("$('.edui-container').removeClass('am-animation-shake')", 1000);} else if(nickname==''){//判断昵称框是否为空//昵称框获取焦点$('#nickname')[0].focus();//添加抖动效果$('#message-input-nickname').addClass('am-animation-shake');setTimeout("$('#message-input-nickname').removeClass('am-animation-shake')", 1000);} else{//发送消息socket.send(JSON.stringify({content: um.getContent(),nickname: nickname}));//清空消息输入框um.setContent('');//消息输入框获取焦点um.focus();}});//把消息添加到聊天内容中function addMessage(message){message= JSON.parse(message);var messageItem='<li class="am-comment'+(message.isSelf?'am-comment-flip':'am-comment')+'">'+'<a rel="external nofollow" rel="external nofollow" href="javascript:void(0)"><img src="assets/images/'+(message.isSelf?'self.png':'others.jpg')+'" alt="" width="48" height="48"/></a>'+'<div><header><div>'+'<a rel="external nofollow" rel="external nofollow" href="javascript:void(0)">'+ message.nickname+'</a><time>'+ message.date+'</time></div></header>'+'<div>'+ message.content+'</div></div></li>';$(messageItem).appendTo('#message-list');//把滚动条滚动到底部$(".chat-content-container").scrollTop($(".chat-content-container")[0].scrollHeight);}

到这步,简单的网页聊天室就完成了,你可以多开几个窗口或在局域网中邀请小伙伴们来一起测试。

六、小结

本次项目课使用WebSocket实现了简单的网页聊天室,其实WebSocket不仅可以应用于浏览器,也可以应用于桌面客户端。

jdk 7.0比jdk6.0有什么改进

JDK7.0和JDK6.0有什么区别?

jdk7是模块化程序,模块间的依赖性变小了.jdk的好多功能间有相互依赖性,导致一个配置不对,好多不能用.举例来说:假设你正使用Logging API(java.util.logging)),Logging需要NIO和JMX,JMX需要JavaBeans, JNDI, RMI和CORBA,JNDI需要java.applet.Applet而且JavaBeans依赖AWT.

JDK7新特性:

JSR203:JDK中会更多的IO API(“NIO.2”)访问文件系统与之前的JDK中通过java.io.File访问文件的方式不同,JDK7将通过java.nio.file包中的类完成。JDK7会使用java.nio.file.Path类来操作任何文件系统中的文件。(这里说的任何文件系统指的是可以使用任何文件存储方式的文件系统)

示例:

Java7之前

File file= new File(“some_file”);

使用Java7

Path path= Paths.get(“some_file”);

在File类中加入了新的方法toPath(),可以方便的转换File到Path

Path path= new File(“some_file”).toPath();

Socket通道绑定和配置在JDK7中面向通道的网络编程也得以更新!JDK7中可以直接绑定通道的socket和直接操作socket属性。JDK7提供了平台socket属性和指定实现的socket属性。

JDK7加入了一个新的字节通道类,SeekableByteChannel

NetworkChannel是面向网络通道编程模块中的又一个新的超接口。利用它可以方便的绑定通道socket,并且方便设置和获取socket的属性。

MulticastChannel接口方便创建IP协议多播。多播实现直接绑定到本地的多播设备。

灵活的异步I/O可以通过真正的异步I/O,在不同的线程中运行数以万计的流操作!JKD7提供了对文件和socket的异步操作。一些JDK7中的新通道:

AsynchronousFileChannel:异步文件通道可以完成对文件的异步读写操作。

AsynchronouseSocketChannel:Socket中的一个简单异步通道,方法是异步的并且支持超时。

AsynchronousServerSocketChannel:异步的ServerSocket

AsynchronousDatagramChannel:基于数据包的异步socket

JSR292:Java平台中的动态编程语言Da Vinci Machine项目(JSR292)的主旨是扩展JVM支持除Java以外的其它编程语言,尤其是对动态编程语言的支持。所支持的语言必须和Java一样不收到歧视并共同存在。JSR334:Java语言的一些改进OpenJDK项目的创造(JSR334)的主旨是对Java语言进行一些小的改进来提高每天的Java开发人员的工作。这些改进包括:

Switch语句允许使用String类型

支持二进制常量和数字常量中可以使用下划线

使用一个catch语言来处理多种异常类型

对通用类型实例的创建提供类型推理

Try-with-resources语句来自动关闭资源

JSR119:Java编译器APIJSR199是在JDK6中加入的,主要用来提供调用Java编译器的API。除了提供javac的命令行工具,JSR199提供Java编译器到程序交互的能力。Java编译器API要达到三个目标:

对编译器和其它工具的调用

对结构化的编译信息进行访问

对文件输入输出定制化处理的能力

JSR206:Java XML处理的API(JAXP)JSR206即Java API for XML Processing(JAXP),是Java处理XML文档的一个与实现无关,灵活的API。

JAXP1.3的主要特性包括:

DOM3

内建通过XML Schema进行文档校验的处理器

对XML Schema中的数据类型的实现,在javax.xml.datatype包中。

XSLTC,最快的转换器,也是XSLT处理中的默认引擎。

提供对XInclude的实现。这将会方便我们使用文本和其它已有的XML来创建新的文档,这样可以对文档片段进行重用。

JDK7中会包含JAXP1.3,这个是JAXP的最新实现。

绑定技术(JAXB)JSR222即Java Architecture for XML Binding(JAXB)。JAXB的目的是便于Java程序进行Java类到XML文档的映射。

JAXB2的主要特性:

支持全部的W3C XML Schema特性。(JAXB1.0说明了对于W3C XML Schema中某些特性的不支持)

支持绑定Java到XML文档,通过添加javax.xml.bind.annotation包来控制绑定。

大量减少了对于schema衍生出来的类。

通过JAXP1.3的校验API来提供额外的校验能力。

JDK7中将包括JAXB2.2

JSR224:基于XML的Web服务API(JAX-WS)JSR224即Java API for XML-based Web Services(JAX-WS),是一个基于Annotation标注的编程模型,主要针对Web Service应用和客户端开发。

JAX-WS2的主要特性包括:

对JAXB2.1 API的支持(JSR222)

对Web Services Addressing 1.0的支持

EndpointReference(EPR)的API:创建(BindingProvider.getEndpointReference(),Endpoint.getEndpointReference(),MessageContext.getEndpointReference())

事务处理(使用JAXB2.1绑定W3C EPR到W3CEndpointReference类,使用JAXB Marshall/Unmarshall W3CendpointReference类)

提供友好的API来启用和停止某些特性,例如MTOM特性和Addressing特性

JDK7将包含JAX-WS2.2

可插拔的Annotation处理APIJSR269即Pluggable Annotation-Processing API

从JDK5开始,Annotation标注就成了强大的机制用来标注我们的类、属性和方法。通常Annotation标注是在创建阶段或者运行阶段进行处理的,并获取语义结果。JSR269主要用来定义一套API,允许通过可插拔的API来进行标注处理器的创建。

规范包括一部分的API用来对Java编程语言进行构建,还有就对标注处理器声明和控制运行的部分。

有了程序中的Annotation标注,就需要有标注处理器框架来反射程序的结构。

Annotation处理器会指定他们处理的标注并且更多的处理器可以合作运行。

标注处理器和程序结构的API可以在构建阶段访问。

小的改进java.util.Objects提供了一套9个静态方法。其中两个方法用来检测当前对象是null还是非null。两个方法用来提供生成toString()字符串同时支持null对象。两个用来处理hash的方法。两个方法用来处理equals。最后一个compare方法用来进行比较。Swing JLayer组件JXLayer是一个组件装饰器,提供了用来装饰多个组合组件的方式,并且可以捕获所有鼠标、键盘和FocusEvent的事件,并针对所有的XLayer子组件。这个组件只会对public swing的api起作用,对全局设置没有作用,例如对EventQueue或者RepaintManager。(除了这些,Swing还将在JDK7中提供JXDatePicker和CSS方式样式)并发和集合APIJSR166,并发和集合API提供了灵活的异步处理,并发HashMap,传输队列和轻量级的fork/join框架以及本地线程方式的伪随机数生成器。类加载器体系结构类加载器已经升级到了可以在无等级类加载器拓扑中避免死锁。JDK7中包含了一个对于多线程自定义类加载器的增强实现,名字为具有并行能力的类加载器。使用平行能力的类加载器加载class,会同步到类加载器和类名。Locale类的改进Java Locale避免由于小的变化导致数据丢失。除此,Locale应该提供更多的特性,例如IETF BCP 47和UTR 35(CLDR/LDML)。分离用户Locale和用户接口LocaleJDK7分离了UI语言的locale和格式化locale,这个已经在Vista之后的windows系统中实现了。严格的类文件检测通过JavaSE6的规范,version51(SE7)的类文件和之后的版本必须通过类型检测来检验。对于老的推理验证VM不可以宕掉Elliptic-Curve

Cryptography(ECC)椭圆曲线加密

从JDK7开始,Java提供对标准的ECC算法的灵活实现(基于椭圆曲线的公钥加密算法)Swing中的Nimbus外观Nimbus是JDS(Java Desktop System)中的新外观。这个也是Solaris11的GTK主题Java2D中的XRender PipelineJDK7中加入了基于X11 XRender扩展的Java2D图形管道。这将提供更多的对于当前先进的GPUs访问的功能。TLS1.2TLS(Transport Layer Security)是一个用在Internet上的数据传输安全协议,用来避免监听、引诱和消息伪造。TLS的主要目的是提供两个应用间通信的隐私和数据完整。TLS是RFC5246标准,在JDK7中提供1.2JDBC4.0/4.1JDBC4.1特性只在JDK7或者更高版本中存在。JDBC4.1只是对JDBC4.0进行较小的改动。关于一些JDBC4.0/4.1的特性:

数据源—Derby包括了对于javax.sql.DataSource的新的实现

JDBC驱动自动加载—应用不必在通过Class.forName()方法来加载数据库驱动了。取而代之的是DriverManager会根据应用请求连接的情况,自动查找到合适的JDBC驱动。

包装—这是JDBC4.0中的新的概念,主要是通过这种机制可以让应用获取的厂商提供的标准JDBC对象实现,例如Connections,Statements和ResultSets。

Statement事件—连接池可以监听Statement的关闭和错误时间。addStatementEventListener和removeStatementEventListener被加入到了javax.sql.PooledConnection

JDK7提供了JDBC4.1全部的支持

透明窗体和异形窗体为了6u10版本的图形处理,JDK提供了透明效果的支持(简单透明和像素透明)并且提供了对于异形窗体的支持(可以将窗体设置成任意形状),轻重混合并且增强了AWT安全警告。透明效果和异形窗体是通过com.sun.awt.AWTUtilities类实现的。Unicode6.0Unicode6.0提供了诸如2.088字符集、对已经存在字符集的属性改进、格式化改进以及新的属性和数据文件。

JDK7已经更新到对Unicode6.0的支持。

要来关闭URLClassLoader的方法

对JMX代理和MBeans的改进

通过URLClassLoader,应用可以通过URL搜索路径来加载类和资源。JKD7提供了close()新方法来帮助URLClassLoader清理资源。

这个改进来至于JRockit,可以方便连接平台。MBean服务器可以通过防火墙提供一套MBeans,这些暴露了VM中的一些内部操作的信息

新的垃圾回收器JDK7提供了新的垃圾回收器,针对目前的CMS垃圾回收器,这将会让垃圾回收器有更少的停顿时间和更高的语言效果。改进的JSRJSR901:Java Language Specification(JLS)Java语言计划

JSR901包括了从第一版Java规范到现在为止的所有的变化、说明和补充。Java语言通过JLS规范。

对于JLS的改变通过JSR901进行管理

JDK7将会包括最新的JSR901

JSR924:JVM平台规范

JSR924目的是维护Java虚拟机规范的变化,其中第二版是为了J2SE1.5的。

Java SE API

JavaSE APIs保持着对例行维护和小范围改进的加入计划的记录

延期到JDK8或者之后的规范

JSR294:Java语言和虚拟机对模块编程技术的支持—当前JSR主要的目的是提供在编译期和运行期的模块编程支持

JSR308:对于Java类型的Annotation注释—这将是对于当前注释符号系统的扩展,将允许我们在类型中出现注释符号。

JSR296:Swing应用框架—主旨是消除Swing编程中的模板代码并且提供Swing程序更加简单的结构。

模块化—提供一个明确的、简单的、低级别的模块系统,主要目的是将JDK模块化。

JSR TBD:Lambda项目—Lambda表达式(通俗的也称为“闭包“)和对Java编程语言的保护方法

JSR TBD:对于集合支持的语言—常量表达式对于lists、sets和maps的迭代以及通过索引符号对lists和maps的访问。

Swing JDatePicker组件—添加SwingLabs JXDatePicker组件到平台。

javax.ws.rs.core.response要关闭吗

现在互联网OpenAPI流行,将您的Web应用也可以开放OpenAPI给其他第三方使用。达到一种资源有效利用的目的。而OpenAPI的暴露方式是多种多样的。有WebService形式的,也有提供一个URI方式的,还有就是给客户端一个jar包,直接使用即可。个人认为,对于使用者来说,使用最简单的就是一个“jar包”+“一份使用文档了”,jar将具体的远程通讯细节、鉴权、握手、数据格式转换等等全部都屏蔽掉。不过这个方式仅仅针对于Java应用,如果用于其他技术,例如ASP.NET、PHP的客户端就不合适了。那么折中一下还是提供一个URI资源,客户端无论是什么技术,只要调用此URI资源就可以获取感兴趣的数据,数据格式和技术平台无关(比如JSON、XML)。REST是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。Web应用暴露出来的是URI资源,客户端可以对资源进行操作(CRUD),REST最重要一点就是无状态,这点实际上感觉是特地针对EJB的会话Bean的重量级说的。所以REST轻量得很,轻量就意味着事务性、稳定性、安全性并没有传统JavaEE应用要求得那么高。主要集中于互联网应用对于不同终端的接口。具体的Rest介绍可以参考:baike.baidu.com/view/1077487.htm。Apache的CXF不仅可以将您的Web系统暴露成为WebService,还可以将您的应用暴露成REST资源供不同客户端调用。2.环境搭建先从Apache站点下载CXF相关jar包。网址是:cxf.apache.org/download.html。我下载的是apache-cxf-2.3.2,这个版本算是比较老了,能用就行。下载后将项目lib下面的jar拷贝到自己web项目的lib中。CXF的samples下面有很多例子,都是支持Ant构建和Maven构建的。建议还是先使用传统方式构建项目,之后再迁移为Maven项目。这样依赖哪些东西心理有数,CXF是强依赖于Spring框架的。3.暴露REST服务下面我们开始暴露自己的Web资源成为REST服务。我们先来看看web.xml的内容Java代码contextConfigLocationWEB-INF/beans.xmlorg.springframework.web.context.ContextLoaderListenerCXFServletCXFServletorg.apache.cxf.transport.servlet.CXFServlet1CXFServlet/service/*index.jspbean.xml内容Java代码此配置文件需要注意几点,一个就是xml的beans声明,需要支持jaxrs:server标签,还有一个就是需要引入CXF自己的一些Spring配置项。该配置项全部在cxf-2.3.2.jar下面的META-INF下面。最后就是注意要暴露的Service类需要配置在jaxrs:server标签中,这样REST资源才能生效。我们就看一个服务吧,在看之前先说明一点,代码有问题,先这么写,根据爆出的问题,咱们再修改代码。先建立值对象。Java代码packagecom.platform.restful.demo;importjavax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name="UserVO")publicclassUserVO{privateintid;privateStringname;//省去setter和getter}下面是DAOJava代码packagecom.platform.restful.demo;importjava.util.HashMap;importjava.util.Map;publicclassUserDAO{privatestaticMapuserVOs;static{userVOs=newHashMap();UserVOu1=newUserVO();u1.setId(1);u1.setName("liuyan");UserVOu2=newUserVO();u2.setId(2);u2.setName("yexiaochai");userVOs.put("1",u1);userVOs.put("2",u2);}publicstaticMapgetPersons(){returnuserVOs;}publicstaticUserVOgetPerson(){returnuserVOs.get("1");}}下面就是爆出来的门面服务类了Java代码packagecom.platform.restful.demo;importjava.util.Map;importjavax.ws.rs.Consumes;importjavax.ws.rs.GET;importjavax.ws.rs.Path;importjavax.ws.rs.Produces;@Path("/userservice")@Produces("application/json")publicclassUserService{@GET@Path("/getUsers")@Consumes("application/xml")publicMapgetUsers(){System.out.println("getusers");MapuserVOs=UserDAO.getPersons();returnuserVOs;}@GET@Path("/getUser")@Consumes("application/xml")publicUserVOgetUser(){System.out.println("getuser");UserVOuserVO=UserDAO.getPerson();returnuserVO;}}我们将项目部署到Tomcat上,打开浏览器,输入URL127.0.0.1:8080/etUser则输出了一段Json信息Java代码{"UserVO":{"id":1,"name":"liuyan"}}那我们输入URL:127.0.0.1:8080/etUsers会是什么效果呢,控制台报出如下错误Java代码2011-6-1513:52:47org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptorwriteResponseErrorMessage警告:NomessagebodywriterhasbeenfoundforresponseclassHashMap.错误信息很明确了publicMapgetUsers()返回的是Map,ok,比较简单的法就是再写一个复合值对象。具体可参考blog.sina.com.cn/s/blog_4051f5dc0100ju0a.html复合对象Java代码packagecom.platform.restful.demo;importjava.util.Map;importjavax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name="UserVOMap")publicclassUserVOMap{privateMapuserVOs;publicMapgetUserVOs(){returnuserVOs;}publicvoidsetUserVOs(MapuserVOs){this.userVOs=userVOs;}}Service服务类修改如下Java代码@GET@Path("/getUsers")@Consumes("application/xml")publicUserVOMapgetUsers(){System.out.println("getusers");MapuserVOs=UserDAO.getPersons();UserVOMapuserVOMap=newUserVOMap();userVOMap.setUserVOs(userVOs);returnuserVOMap;}之后再次访问127.0.0.1:8080/etUsers获得Json数据如下Java代码{"UserVOMap":{"userVOs":{"entry":[{"key":2,"value":{"id":2,"name":"yexiaochai"}},{"key":1,"value":{"id":1,"name":"liuyan"}}]}}}

OK,本文到此结束,希望对大家有所帮助。

java是由什么组成(java程序是由什么组成的)2008北京奥运会开幕式(2008北京奥运会开幕式回放)