|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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架构开发 |
|