维护一个古董级的项目,在jsp传参的时候乱码了,如下:
<jsp:forward page="/pub/msgpage/MsgTo.jsp">
<jsp:param name="msg_Title" value='<%=Form.getFES("回复成功")%>'/>
<jsp:param name="msg_Content" value='<%=Form.getFES("回复成功,正在操作")%>'/>
<jsp:param name="url_to" value='<%=addpic_url%>'/>
</jsp:forward>
使用request得到的都是问号,最后在网上找到了下面的一段话,才解开了我心中的谜团。
最近在做GGLook的时候,发现<jsp:forword>被tomcat generate成了...pageContent.forword(...java.util.URLEncoder.encode("" + ... )); 看了函数原形java.util.URLEncoder.encode有两种形式:1.encode(String s) 2.encode(String s, String enc).对于第二个,我们可以对编码进行设置.但是对于第一个,j2sdk实现的默认编码却是iso-8859-1.没搞懂为什么内部编码为UNICODE的java要把他实现成为iso-8859-1.还有就是tomcat为什么不采用配置文件的方式使我们自己能设定其编码方式.现在一跳转到errorpage.jsp就是乱码.没办法,要吗改j2sdk,要吗改tomcat.最后,确定下载tomcat原代码包,将Generator.java改掉,重新编译,现在一切运行正常! |
原来是因为url里面没有指定编码,会默认使用ISO-8859-1进行编码,而ISO-8859-1是不支持中文的,即URLEncoder.encode之后 都会显示
%3F%3F%3F,所以之后无论使用何种字符集解码都是问号了。。。
最后的解决方案有一下几种,其中第四种没有成功:
- 写个filter,然后在filter里面进行request.setCharacterEncoding("GBK")
- 每个jsp页面的头部都写上request.setCharacterEncoding("GBK"),原理和1是一样的
- 传参数前先对中文进行encode,得到参数后再使用对应的decode,这样的话传递的参数就不会丢失,但是比较麻烦
- 修改tomcat的server.xml配置文件,在<Connector>节点增加一个属性:URIEncoding="GBK",但是感觉这个参数没有起作用,官方文档是这么描述的“This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. ”
我的理解是要区分你是怎么提交数据的,如果是Post的话,则会使用过滤器;如果是Get方式的话,tomcat默认会使用URIEncoding----是tomcat的server.xml配置文件,在<Connector>节点有一个URIEncoding的属性,如果不配置的话默认是:URIEncoding="ISO-8859-1",官方文档是这么描述的“This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. ”
因为ajaxAnywhere.getAJAX是通过Get提交数据的(sends a GET request to the server.),所以还是使用了ISO-8859-1编码。
HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和 幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解);
在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
posted on 2008-09-20 17:03
岁月如歌 阅读(2334)
评论(1) 编辑 收藏 所属分类:
java