热点
Android开发驱动数码互联,塑造物联网智能新生态,reasoning_content:我们要求以内容分发专员的口吻,写一个与“技术、科技”相关,关于[Android开发驱动数码互联:塑造物联网智能新生态]的标题要求直接输出一个标题,不要加说明,字数30字以内nn我们需要一个标题,内容涉及Android开发驱动数码互联,塑造物联网智能新生态口吻是内容分发专员,可能偏向于科技、技术、专业性标题要简短精炼nn可能的Android开发引领数码互联,构建物联网智能新生态 但字数可能超?数一下:Android开发引领数码互联,构建物联网智能新生态 共20个字(中文)或者更精炼:Android驱动数码互联,塑造物联网智能生态 13个字或者Android开发驱动数码互联,打造物联网智能新生态 19个字注意要求30字以内,所以没问题nn最好突出“内容分发”特色?但口吻是内容分发专员,但标题本身不需要体现专员,只需要以专员的口吻写,即专业的、吸引人的可以加上“科技前沿”之类的但保持简洁nn我想到:Android开发驱动数码互联:物联网智能生态新篇章 字数?Android开发驱动数码互联:物联网智能生态新篇章 共18个字(包括标点?中文标点通常不计入字数?但要求30字以内,没问题)或者更直接:Android驱动数码互联 塑造物联网智能新生态 15字nn注意原标题有“技术、科技”相关,可以体现输出一个标题即可
移动H5创新:揭秘万物互联新生态构建,reasoning_content:我们要求以SEO优化师的口吻,写一个与技术、科技相关,关于移动H5引领创新潮流:构建万物互联新生态的标题要求直接输出一个标题,不要加说明,字数30字以内需要包含关键词如移动H5、创新、万物互联等,同时要有SEO优化师的口吻,可能加入一些吸引点击的词汇如揭秘、趋势、必看等标题要简短精炼nn可能的移动H5技术革新:构建万物互联新生态之路但字数可能超?计算:移动H5技术革新:构建万物互联新生态之路 共22个字?中文标点算不算?通常算再比如:移动H5引领创新,万物互联新生态如何构建?但感觉不够SEO或者:移动H5创新:万物互联新生态的构建密码字数19字或者:揭秘移动H5:如何打造万物互联新生态?20字需要更直接nn考虑:移动H5引领创新潮流,打造万物互联新生态 共18字或者移动H5技术驱动:万物互联新生态构建指南 19字最好有SEO优化师常用的干货、秘籍等但要求与技术科技相关一个常见SEO移动H5创新趋势:万物互联新生态构建全攻略 20字或者移动H5新技术:揭秘万物互联新生态构建 18字nn简洁有力:移动H5:创新引领万物互联新生态13字或者移动H5创新:构建万物互联新生态 13字但缺少SEO优化师口吻可以加必看:移动H5创新必看:万物互联新生态构建!15字最终输出一个标题
AI实践者:框架与设计策略精选,高效建站指南,reasoning_content:我们要求以AI实践者的口吻,写一个与技术、科技相关的标题,主题是[精选框架与设计策略:构建高效网站开发指南]注意要简短精炼,30字以内直接输出标题nn可能的比如AI实践者揭秘:精选框架与设计策略,高效建站指南 但字数可能超或者更精简:AI实践者:精选框架策略,高效网站开发指南 约16字或者AI实践者:高效网站开发的框架与设计策略精选 18字注意口吻是AI实践者,所以可以写AI实践者推荐:高效网站开发的精选框架与设计策略 但可能超30需要控制在30字内nn我给出:AI实践者:精选框架与设计策略,构建高效网站 共18字或者更完整:AI实践者视角:精选框架与设计策略的高效网站开发指南 正好30字?数一下:AI实践者视角:精选框架与设计策略的高效网站开发指南 共?AI(2)实践者(3)视角(2):(1)精选(2)框架(2)与(1)设计(2)策略(2)的(1)高效(2)网站(2)开发(2)指南(2) 2+3+2+1+2+2+1+2+2+1+2+2+2+2=28字?不对,仔细算:AI(2)实(1)践(1)者(1)视(1)角(1):(1)精(1)选(1)框(1)架(1)与(1)设(1)计(1)策(1)略(1)的(1)高(1)效(1)网(1)站(1)开(1)发(1)指(1)南(1) 共2+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1=25?算了,用中文数字:AI是英文,算两个字符;但通常中文字数按汉字算,AI算两个英文字母,但在标题中往往视为两个字符为了保险,最好全部使用中文可改为:人工智能实践者:精选框架与设计策略,高效网站开发指南 共?人工智能(4)实践者(3)=7,冒号1,精选2,框架2,与1,设计2,策略2,逗号1,高效2,网站2,开发2,指南2,总计7+1+2+2+1+2+2+1+2+2+2+2=28字可以或者更简洁:AI实践者:框架与设计策略精选,高效建站指南 共?AI2+实践者3+冒号1+框架2+与1+设计2+策略2+精选2+逗号1+高效2+建站2+指南2=22字这个也不错nn根据要求,直接输出标题我选择:AI实践者:框架与设计策略精选,高效建站指南
17 9 月 2026, 周四

接下来要花两小节来介绍一下JAX-RS中的数据处理(Data Handlers)部分。

?

一、SteamingOutput

在第一节中(http://liugang594.iteye.com/blog/1491434),看getCustomer()方法:

Java代码??

收藏代码

  1. public?StreamingOutput?getCustomer(int?id)?{?????
  2. ????final?Customer?customer?=?customerDB.get(id);?????
  3. if?(customer?==?null)?{?????
  4. ????????throw?new?WebApplicationException(Response.Status.NOT_FOUND);?????
  5. ????}?????
  6. return?new?StreamingOutput()?{?????
  7. public?void?write(OutputStream?outputStream)?throws?IOException,?????
  8. ????????????????WebApplicationException?{?????
  9. ????????????outputCustomer(outputStream,?customer);?????
  10. ????????}?????
  11. ????};?????
  12. }????

其中使用了SteamingOutput来写一个原始流的字符流。

这是JAX-RS提供的数据处理的其中一种方式,通过回调SteamingOutput的write()方法来写回response。

相对于直接返回一个OutputSteam对象,使用回调对象有以下好处:

  1. JAX-RS可以自由的,按照它的设想处理输出
  2. 当追求性能时,甚至可以使用另一个线程而不是当前调用线程回写
  3. 可以很方便的注入拦截器,而使用一个直接的OutputSteam则通常会跳过这些步骤
  4. 最后,可以实现异步响应,类AJAX。在Servlet3.0中已经介绍了异常响应的想法。

二、InputSteam/Reader

可以使用InputSteam或Reader去处理请求内容,JAX-RS会自动将请求数据转成一个InputSteam/Reader对象,例如:

Inputsteam代码??

收藏代码

    @PUT??
  1. @Path(“/stuff”)??
  2. public?void?putStuff(InputStream?is)?{??
  3. ????byte[]?bytes?=?readFromStream(is);??
  4. ????String?input?=?new?String(bytes);??
  5. ????System.out.println(input);??
  6. }??

?

Reader代码??
@Path(“/morestuff”)??

  • public?void?putMore(Reader?reader)?{??
  • ????LineNumberReader?lineReader?=?new?LineNumberReader(reader);??
  • ????do?{??
  • ????????String?line?=?lineReader.readLine();??
  • ????????if?(line?!=?null)?System.out.println(line);??
  • ????}?while?(line?!=?null);??
  • 除了处理请求,InputSteam/Reader也可以作为响应:

    Response代码??
    @GET??

  • @Path(“file/{fileName}”)??
  • @Produces(“text/plain”)??
  • public?Reader?getFileContent(@PathParam(“fileName”)?String?fileName);??
  • 注:当作为响应时,需要指定@Produces,这样JAX-RS才知道怎么去设置响应的Content-Type头信息

    三、File

    File对象也可以用在处理请求或响应中。例如用于请求:

    File作为请求参数代码??
    @POST??

  • public?void?post(File?file)?{??
  • ????Reader?reader?=?new?Reader(new?FileInputStream(file));??
  • 这里File作为请求参数使用。

    注:当使用File作为请求参数时,JAX-RS会在后台生成一个临时文件,以请求的信息体作为这个文件的内容,然后将这个临时文件作为参数传入。

    用于响应:

    private?static?final?String?basePath?=?”…”;??

  • @GET??
  • @Path(“{filepath:?.*}”)??
  • @Produces(“text/plain”)??
  • public?File?getFile(@PathParam(“filepath”)?String?path)?{??
  • new?File(basePath?+?path);??
  • }??????
  • 注:同样的,当File用作响应时,需要指定@Produces,用于告诉JAX-RS怎么转换File内容,即Content-Type。

    四、byte[]

    byte[]也可以用在请求或响应,例如:

    byte[]?get()?{??

  • return?”hello?world”.getBytes();??
  • }??
  • @POST??
  • @Consumes(“text/plain”)??
  • void?post(byte[]?bytes)?{??
  • ????System.out.println(new?String(bytes));??
  • 注:当用作响应时,需要指定@Produces,用于告诉JAX-RS怎么设置响应的Content-Type值。?

    五、String/Char[]

    大多数网络数据是基于文件格式的。JAX-RS可以进行任何文件格式的内容与String/Char[]之间的转换。例如:

    String/char[]代码??
    @Produces(“application/xml”)??

  • public?String?get()?{??
  • ????return?”<customer><name>Bill?Burke</name></customer>”;??
  • @Consumes(“text/plain”)??
  • public?void?post(String?str)?{??
  • ????System.out.println(str);??
  • 注:当用作响应时,需要指定@Produces,用于告诉JAX-RS怎么设置响应的Content-Type值。

    ?

    注:JAX-RS规范要求实现者必须处理在Content-Type中指定的charset值,当注入String时,例如:

    POST?/data??

  • Content-Type:?application/xml;charset=UTF-8??
  • <customer>…</customer>??
  • 这里charset为UTF-8,实现者必须保证生成的Java String必须是UTF-8编码的。

    六、MultivaluedMap<String,String> 和Form

    在节4(http://liugang594.iteye.com/blog/1496651)中,已经介绍了使用@FormParam去获取提交的Form值。除了使用@FormParam,也可以直接注入MultivaluedMap<String,String>对象来表示所有请求的Form数据,其中Form数据格式是 “application/x-www-form-urlencoded”,例如:

    @Consumes(“application/x-www-form-urlencoded”)??

  • @Produces(“application/x-www-form-urlencoded”)??
  • public?MultivaluedMap<String,String>?post(??
  • ????MultivaluedMap<String,?String>?form)?{??
  • return?form;??
  • 注:JAX-RS规范并未指明注入的MultivaluedMap是否已经编码;大多数实现者都会自动解码其中的key/value值。如果你想保持编码的格式,则可以使用@javax.ws.rs.Encoded注释。

    七、javax.xml.transform.Source

    Source接口代表了一个XML的输入或输出,它通常是用来进行XSLT转换的,例如:

    @Consumes(“application/xml”)??

  • @Produces(“application/xml”)??
  • public?String?post(Source?source)?{??
  • ????javax.xml.transform.TransformerFactory?tFactory?=??
  • ????????javax.xml.transform.TransformerFactory.newInstance();??
  • ????javax.xml.transform.Transformer?transformer?=??
  • ????????tFactory.newTransformer(??
  • ????????????new?javax.xml.transform.stream.StreamSource(“foo.xsl”));??
  • ????StringWriter?writer?=?new?StringWriter();??
  • ????transformer.transform(source,??
  • new?javax.xml.transform.stream.StreamResult(writer));??
  • return?writer.toString();??
  • 除了JAXB(下节讲)外,javax.xml.transform.Source对象是规范中唯一支持的基于XML结构的对象。(甚至不能注入org.w3c.dom.Document对象)

  • dawei

    【声明】:天津站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

    您错过了

    Android开发驱动数码互联,塑造物联网智能新生态,reasoning_content:我们要求以内容分发专员的口吻,写一个与“技术、科技”相关,关于[Android开发驱动数码互联:塑造物联网智能新生态]的标题要求直接输出一个标题,不要加说明,字数30字以内nn我们需要一个标题,内容涉及Android开发驱动数码互联,塑造物联网智能新生态口吻是内容分发专员,可能偏向于科技、技术、专业性标题要简短精炼nn可能的Android开发引领数码互联,构建物联网智能新生态 但字数可能超?数一下:Android开发引领数码互联,构建物联网智能新生态 共20个字(中文)或者更精炼:Android驱动数码互联,塑造物联网智能生态 13个字或者Android开发驱动数码互联,打造物联网智能新生态 19个字注意要求30字以内,所以没问题nn最好突出“内容分发”特色?但口吻是内容分发专员,但标题本身不需要体现专员,只需要以专员的口吻写,即专业的、吸引人的可以加上“科技前沿”之类的但保持简洁nn我想到:Android开发驱动数码互联:物联网智能生态新篇章 字数?Android开发驱动数码互联:物联网智能生态新篇章 共18个字(包括标点?中文标点通常不计入字数?但要求30字以内,没问题)或者更直接:Android驱动数码互联 塑造物联网智能新生态 15字nn注意原标题有“技术、科技”相关,可以体现输出一个标题即可