Use content-disposition to provide a save-as popup on browser

一月 21, 2008 @ 8:17 下午 | 发表在 J2EE, Java | 留下评论

Often times you need to prompt user a save-as dialog box with a default file name. This can be done through the content-disposition HTTP header. A sample java code snippet follows:

// Set the headers.
res.setContentType(“application/x-download”);
res.setHeader(“Content-Disposition”, “attachment; filename=” + filename);

// Send the file.
OutputStream out = res.getOutputStream(  );

Advertisements

在URL里传送中文参数

三月 6, 2007 @ 2:47 上午 | 发表在 J2EE | 留下评论

在WEB开发中,支持象中文,日文等非ASCII经常是一件头痛的事情。因为所有的服务器和浏览器最开始都是基于ASCII的,后来开始支持了,对标准的支持也是参差不齐,很让人混淆,所以很多时候一件简单的事情做起来都不容易。HTTP参数的传递就有点混淆。

从网页传送参数到服务器通常有两种方式, 直接附在URL后面,或者通过表单来传递。两种方式如下:

URL:参数和值被附加在URL后面,作为URL的一部分被送到服务器。

表单:参数和值放在消息体里面发送。

在表单的情形下,中文参数比较好处理。通常对非ASCII的字符集,页面的编码会用UTF-8。表单提交了以后,在服务器端,用HttpServletRequest.getParameter()就可以拿到表单的值。

但如果参数是在URL里传递的,事情就会比较麻烦。URL里面只能用ASCII(更准确地说,ISO8859_1) ,所有的不在字符集里面的字符都要进行转化才可以传送。javascript的两个函数encodeURI和encodeURIComponent可以做转化的工作。他们的差别是encodeURI 可以用来编码整个URL,但encodeURIComponent只能用在一个部分。

一个典型的URL的建造方式:

var uservalue = "客人";
var sURL = "http://www.mysite.com/myapp/myServlet?";
sURL += “username";
sURL += "=";
sURL += encodeURIComponent(uservalue);


在服务器里看到的参数是经过ISO8859_1编码的字节流。假设页面编码是UTF-8,下面的代码可以读出正确的用户名:

String username = request.getParameter("username");
byte[] bytes = username.getBytes("8859_1");
username = new String(bytes, "UTF-8");

如果参数的名字本身也是中文的,那就不能使用getParameter()而应该用getParameterMap(),否则的话参数的值会找不到,因为参数本身也是8859_1的字节流。

如果不使用encodeURIComponent或者encodeURI会怎么样呢?因为他们不在8859_1的字符集里面,送到服务器端的会是无法解释得乱码。

以上的代码在tomcat5.5里面测试通过。

通过访问 WordPress.com 创建免费网站或博客.
Entries评论 feeds.