jsp之请求参数中的中文读取问题

[size=medium] HTTP协议规定浏览器向web服务器传递的参数信息中不能出现某些特殊字符,而必须对这些字符进行URL编码后再传递。对于URL中的一些特殊字符,浏览器会自动进行编码。这些字符除了"/?&"等外,还包括unicode字符,比如汉字。这时的编码比较特殊。IE有一个选项"总是使用UTF- 8发送URL",当该选项有效时,IE将会对特殊字符进行UTF-8编码,同时进行URL编码。如果改选项无效,则使用默认编码"GBK",并且不进行 URL编码。但是,对于URL后面的参数,则总是不进行编码,相当于UTF-8选项无效。比如"中文.html?a=中文",当UTF-8选项有效时,将发送链接"%e4%b8%ad%e6%96%87.html?a=x4ex2dx65x87";而UTF-8选项无效时,将发送链接"x4ex2dx65x87.html?a=x4ex2dx65x87"。注意后者前面的"中文"两个字只有4个字节,而前者却有18个字节,这主要时URL编码的原因。
当web server(tomcat)接收到该链接时,将会进行URL解码,即去掉"%",同时按照ISO8859-1编码(上面已经描述,可以使用URLEncoding来设置成其它编码)识别。上述例子的结果分别是"ue4ub8uadue6u96u87.html?a=u4eu2du65u87"和"u4eu2du65u87.html?a=u4eu2du65u87",注意前者前面的"中文"两个字恢复成了6个字符。这里用"u",表示是unicode。
所以,由于客户端设置的不同,相同的链接,在服务器上得到了不同结果。

2种情况的解决方案:
1.对于HTTP请求消息的请求行中的URL地址后的参数(get方法提交表单),getParameter等方法进行URL解码时所采用的字符集编码在Servelt规范中没有明确规定,它由各个Servlet引擎厂商自行决定。对于这种情况,Tomcat中的ServletRequest对象的getParameter等方法默认采用ISO8859-1进行解码。
ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称,request.getParameter方法以该方法设置的字符集编码对实体内容进行URL解码。setCharacterEncoding方法来设置的字符集只影响getParameter方法对POST过来的内容进行URL解码的结果,而不能影响URL地址后的参数进行URL解码的结果,所以及时使用setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称也不管用
解决方案:
a)[color=red]在Tomcat配置中,连接器(HTTP Connector)属性中有一个URIEncoding和useBodyEncodingForURI属性[/color],这两个属性设置对URL后的附加参数进行URL解码时该如何选择字符集编码。[color=red]URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置[/color],也就是说当useBodyEncodingForURI属性设置为true时,ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/
conf\server.xml文件中找到标记,然后在后面加上useBodyEncodingForURI=true)
b)前面我们讲到,即使IE选项"总是使用UTF- 8发送URL"被选中,URL后面的参数也不会进行编码,所以URL后面的中文参数最好还是手动进行URL编码。可以采用java.net.URLEncoder.encode()方法进行编码,然后浏览器中所显示出来的就是一堆百分号之类的字符,见例子[/size]
MyJsp.jsp

<body>
<%
String name = "米兰,我爱你";
//name = java.net.URLEncoder.encode(name,"utf-8");
%>
<a href="<%=request.getContextPath()%>/jsp/compactInfo/jsp1.jsp?name=<%=name%>">中文参数请求</a>
</body>


jsp1.jsp

<body>
<%
String name = request.getParameter("name");
name = java.net.URLDecoder.decode(name,"utf-8");
// name = new String(name.getBytes("iso8859-1"),"utf-8");
%>
收到中文参数:<%=name %>
</body>


2.对于post方式下的"application/x-www-form-urlencoded"编码格式的实体内容,getParameter等方法以ServletRequest对象的getCharacterEncoding()方法返回的字符集对其进行URL解码。如果getCharacterEncoding()方法返回null,则采用ISO8859-1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将数据库的blob类型读取jsp里并用img输出打印,可以按照以下步骤进行: 1. 在jsp页面上,使用<img>标签来显示图片,如下所示: ``` <img src="image.jsp?id=1" /> ``` 其,"image.jsp"是用于处理图片请求的页面,"?id=1"是传递给该页面的参数,用于指定要显示的图片的ID。 2. 在image.jsp页面,使用Java代码从数据库读取blob类型的数据,并将其输出为图片,如下所示: ``` <%@ page contentType="image/jpeg" %> <% // 获取传递过来的参数id int id = Integer.parseInt(request.getParameter("id")); // 从数据库读取blob类型的数据 byte[] imageData = getImageDataFromDatabase(id); // 输出图片数据 response.getOutputStream().write(imageData); %> ``` 其,"contentType"属性指定了输出的数据类型为图片类型,"getImageDataFromDatabase()"方法是用于从数据库读取blob类型数据的自定义方法。 3. 在自定义方法"getImageDataFromDatabase()",使用JDBC连接数据库,并执行查询语句,如下所示: ``` public byte[] getImageDataFromDatabase(int id) throws Exception { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; byte[] imageData = null; try { // 获取数据库连接 conn = getDatabaseConnection(); // 执行查询语句 ps = conn.prepareStatement("SELECT image_data FROM images WHERE id=?"); ps.setInt(1, id); rs = ps.executeQuery(); // 读取查询结果 if (rs.next()) { Blob blob = rs.getBlob("image_data"); imageData = blob.getBytes(1, (int)blob.length()); } } finally { // 关闭数据库连接 closeDatabaseConnection(conn, ps, rs); } return imageData; } ``` 其,"getDatabaseConnection()"和"closeDatabaseConnection()"方法是用于连接和关闭数据库连接的自定义方法,"images"是存储图片数据的表名,"image_data"是存储图片数据的列名。 通过以上步骤,就可以将数据库的blob类型数据读取jsp页面,并以图片形式输出打印。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值