仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 571|回复: 13
打印 上一主题 下一主题

[学习教程] JAVA网页编程之怎样用 servlet 翻开非 HTML 格局的文档...

[复制链接]
乐观 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:26:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
多谢指点,其实我对.net和ruby也不是很了解,对与java也只是刚起步的阶段,只是在学习中有了点想法就写出来了,现在俺本科还没毕业,所以对大型项目基本上也没有什么经验。servlet怎样用servlet翻开非HTML格局的文档
一种向Web客户端发送非HTML格局文档的复杂办法

ByMarlaBonar(marla.bonar@javaworld.com)
择要
JavaServlet编程能够很便利地将HTML文件发送到客户端Web扫瞄器。但是很多站点还同意会见非HTML格局的文档,包含AdobePDF、MicrosoftWord和MicorsoftExcel等。现实上这些非HTML格局只需能用MIME范例暗示,就能够使用servlet来发送。本文将以PDF和MicrosoftWord文件为例,向你先容怎样利用servlet传送非HTML格局文件,和与防火墙交互的办法。
你只需将文件写到servlet的输入流中,就能够使用servlet在扫瞄器中翻开一个文件。只管这看起来十分复杂,在翻开非HTML格局文档(好比二进制数据或多媒体文件)的时分,仍要注重一些要点。
起首从取得servlet的输入流入手下手:
ServletOutputStreamout=res.getOutputStream();

互联网上利用MIME(multipurposInternetmailextension多目标互联网邮件扩大协定)来传送夹杂格局、多媒体和二进制数据文件。假如要在servlet的response对象中翻开某个文档,就必需设置该文档的MIME范例。上面这个例子中我们将翻开PDF文档。
MIME范例
Web扫瞄器利用MIME范例来辨认非HTML文档,并决意怎样显现该文档内的数据。将插件(plug-in)与MIME范例分离利用,则当Web扫瞄器下载MIME范例唆使的文档时,就可以够启动响应插件处置此文档。某些MIME范例还能够与内部程序分离利用,扫瞄器下载文档后会启动响应的内部程序。
MIME范例十分有效。它们同意Web扫瞄器处置分歧格局的文档,却不必要事前嵌进相干常识。JavaServlets可使用MIME范例来向扫瞄器传送非HTML文件,好比AdobePDF和MicorsoftWord。利用准确的MIME范例可以包管这些非HTML文件被准确的插件或内部程序显现。本文末的材料部分供应了一些网址,指向一些已界说MIME范例列表和关于MIME范例的文章。
PDF文件的MIME范例是"application/pdf"。要用servlet来翻开一个PDF文档,必要将response对象中header的content范例设置成"application/pdf":
//MIMEtypeforpdfdoc
res.setContentType("application/pdf");

若要翻开一个MicrosoftWord文档,你就要将response对象的content范例设置成"application/msword":
//MIMEtypeforMSWorddoc
res.setContentType("application/msword");

假如是一个Excel文档,则利用MIME范例"application/vnd.ms-excel"。个中vnd暗示该使用程序的打造者,必需将它包括在MIME范例里才干够翻开该范例文档。
偶然候扫瞄器不克不及辨认文档的MIME范例。一般这是因为没有安装这些文档必要的插件而招致的。这类情形下,扫瞄器会弹出一个对话框,扣问用户是不是必要翻开该文件或是将它保留到当地磁盘上。
Contentdisposition
一种叫做content-disposition的HTTPresponseheader同意servlet指定文档暗示的信息。利用这类header,你就能够将文档指定成独自翻开(而不是在扫瞄器中翻开),还能够依据用户的操纵来显现。假如用户要保留文档,你还能够为该文档倡议一个文件名。这个倡议称号会呈现在SaveAs对话框的“文件名”栏中。假如没有指定,则对话框中就会呈现servlet的名字。更多关于content-dispositionheader的信息,能够参阅材料。
在servlet中,你必要将header设置成上面如许:
res.setHeader("Content-disposition",
"attachment;filename="+
"Example.pdf");
//attachment-sincewedontwanttoopen
//itinthebrowser,but
//withAdobeAcrobat,andsetthe
//defaultfilenametouse.

假如你要翻开的是MicrosoftWord文件,你能够设成:
res.setHeader("Content-disposition",
"attachment;filename"+
"Example.doc");

封装非HTML文档
完成上述事情后,剩下的就十分复杂了。你必要依据待传送文件的名字,创立一个java.net.URL对象。交给URL机关器的字符串必需是指向该文件的一个无效URL地点。在这个例子中,我要翻开Adobeemployment格局的文档:
StringfileURL=
"http://www.adobe.com/aboutadobe/careeropp/pdfs/adobeapp.pdf;"

你的URL字符串也能够相似于http://www.gr.com/pub/somefile.doc或http://www.gr.com/pub/somefile.xls。但必需确保待传送文件范例与先前在HTTPresponse对象中设置的MIME范例分歧。
URLurl=newURL(fileURL);

防火墙
假如必要经由过程防火墙,最初一件要思索的事变就是你的URL链接。起首应该汇集所用代办署理服务器的相干信息,比方主机称号和端标语等。更多关于怎样经由过程防火墙创建链接的信息,能够参看上面的材料部分。
假如利用的是Java2,你应当从URL对象类中创立一个URLConnection对象,并设置以下体系属性:
URLConnectionconn=url.openConnection();

//Usetheusernameandpasswordyouuseto
//connecttotheoutsideworld
//ifyourproxyserverrequiresauthentication.
Stringauthentication="Basic"+new
sun.misc.BASE64Encoder().encode("username:password".getBytes());

System.getProperties().put("proxySet","true");

System.getProperties().put("proxyHost",PROXY_HOST);//yourproxyhost
System.getProperties().put("proxyPort",PROXY_PORT);//yourproxyport
conn.setRequestProperty("Proxy-Authorization",authentication);

假如你利用的是JDK1.1,则不克不及设置这些体系属性。这类情形下,你能够依据所用代办署理服务器的信息创立java.net.URL对象:
url=newURL("http",PROXY_HOST,
Integer.parseInt(PROXY_PORT),
fileURL);
//assumesauthenticationisnotrequired

深切事情
入手下手浏览你传送的文档之前,起首要从URLConnection(或URL)对象中取得输出流InputStream。在这个例子中,用BufferedInputStream将InputStream封装起来。
假如你接纳URLConnection,能够实验以下代码:
BufferedInputStreambis=new
BufferedInputStream(conn.getInputStream());

假如你利用URL,则可用以下代码:
BufferedInputStreambis=new
BufferedInputStream(url.openStream());

一旦你完成上述操纵,就只需复杂地将InputStream中的字节,写进到servlet的输入流OutputStream中:
BufferedOutputStreambos=new
BufferedOutputStream(out);

byte[]buff=newbyte[2048];
intbytesRead;

//Simpleread/writeloop.
while(-1!=(bytesRead=bis.read(buff,0,buff.length))){
bos.write(buff,0,bytesRead);
}

在最初的代码块中,封闭这些流。
这个例子是使用doPost来完成的(doPost是HttpServlet子类的一个办法):
publicvoiddoPost(HttpServletRequestreq,
HttpServletResponseres)
throwsServletException,IOException
{
ServletOutputStreamout=
res.getOutputStream();

//---------------------------------------------------------------
//Settheoutputdatasmimetype
//---------------------------------------------------------------

res.setContentType("application/pdf");//MIMEtypeforpdfdoc

//---------------------------------------------------------------
//createaninputstreamfromfileURL
//---------------------------------------------------------------

StringfileURL=
"http://www.adobe.com/aboutadobe/careeropp/pdfs/adobeapp.pdf";

//------------------------------------------------------------
//Content-dispositionheader-dontopeninbrowserand
//setthe"SaveAs..."filename.
//*ThereisreportedlyabuginIE4.0whichignoresthis...
//------------------------------------------------------------
res.setHeader("Content-disposition",
"attachment;filename="+=
"Example.pdf");

//-----------------------------------------------------------------
//PROXY_HOSTandPROXY_PORTshouldbeyourproxyhostandport
//thatwillletyougothroughthefirewallwithoutauthentication.
//OtherwisesetthesystempropertiesanduseURLConnection.getInputStream().
//-----------------------------------------------------------------
BufferedInputStreambis=null;
BufferedOutputStreambos=null;

try{
URLurl=newURL("http",PROXY_HOST,
Integer.parseInt(PROXY_PORT),fileURL);

//UseBufferedStreamforreading/writing.
bis=newBufferedInputStream(url.openStream());
bos=newBufferedOutputStream(out);

byte[]buff=newbyte[2048];
intbytesRead;

//Simpleread/writeloop.
while(-1!=(bytesRead=bis.read(buff,0,buff.length))){
bos.write(buff,0,bytesRead);
}

}catch(finalMalformedURLExceptione){
System.out.println("MalformedURLException.");
throwe;
}catch(finalIOExceptione){
System.out.println("IOException.");
throwe;
}finally{
if(bis!=null)
bis.close();
if(bos!=null)
bos.close();
}
}

结论
正如你所读到的,用servlet来翻开非html文档相称复杂。即便是要经由过程防火墙也是云云。只需设置了准确的MIME范例,就能够利用一样的代码来翻开图片或其他多媒体文件。现今的互联网上包括了大批信息,个中很多数据被存储为非HTML格局。利用servlet可以克制HTML的限定,复杂便利地向用户传送这些非HTML格局的信息。
关于作者
MarlaBonar(marla.bonar@javaworld.com),亚利桑那州Greenbrier&RusselinPhoenix的一名参谋,自JDK1.0.2呈现以来就一向处置Java编程事情。她是面向对象系统布局和计划和软件形式的忠厚反对者。在她父亲的勉励下,成为一位软件工程师。
材料

  • 更多关于MIME的信息能够在RFC:2045,2046,2047,822中找到。要检察这些RFC,你能够会见:
    http://www.rfc-editor.org/rfcsearch.html
  • 更多关于content-disposition头部的信息,参看RFC2183:
    rfc2183.txt
如果经由过程防火墙来创建链接,更细致的信息能够参看上面几个Java要点:

  • "JavaTip42:编写经由过程基于代办署理服务器事情的防火墙的Java使用程序,"RonKurr(JavaWorld):
    http://www.javaworld.com/javaworld/javatips/jw-javatip42.html
  • "JavaTip46:利用Java1.2的Authenticator类,"JohnZukowski(JavaWorld):
    http://www.javaworld.com/javaworld/javatips/jw-javatip46.html
  • "JavaTip47:URL的再确认,"JohnZukowski(JavaWorld):
    http://www.ckuyun.com/developerWorks/cn/java/jw-tips/tip047/index.shtml

Java的桌面程序开发在java程序员里通常叫swing开发,主要用的swing包里的类开发的,也就是通常说的c/s架构开发
admin 该用户已被删除
沙发
发表于 2015-1-20 19:12:28 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
简单生活 该用户已被删除
板凳
发表于 2015-1-22 07:38:19 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
小妖女 该用户已被删除
地板
发表于 2015-1-25 08:38:02 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
灵魂腐蚀 该用户已被删除
5#
发表于 2015-1-26 13:17:31 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
小女巫 该用户已被删除
6#
发表于 2015-2-7 13:54:22 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
爱飞 该用户已被删除
7#
发表于 2015-2-22 03:03:05 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
冷月葬花魂 该用户已被删除
8#
发表于 2015-3-1 21:35:08 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
若相依 该用户已被删除
9#
发表于 2015-3-4 11:24:00 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
若天明 该用户已被删除
10#
发表于 2015-3-6 16:00:38 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
变相怪杰 该用户已被删除
11#
发表于 2015-3-10 16:45:32 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
金色的骷髅 该用户已被删除
12#
发表于 2015-3-11 12:19:26 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
精灵巫婆 该用户已被删除
13#
发表于 2015-3-18 10:41:46 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
兰色精灵 该用户已被删除
14#
发表于 2015-3-25 16:01:13 | 只看该作者
是一种为 Internet发展的计算机语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 00:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表