专栏首页魏晓蕾的专栏JSP页面之间传递中文参数的解决方法

JSP页面之间传递中文参数的解决方法

最近在各位大哥的帮助下,终于解决了jsp页面之间的传值问题,总结如下:

源代码,a.jsp往b.jsp传值:

a.jsp页面内容:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<form action="b.jsp">

name:<input type=text name=name>

<input type=submit>

</form>

b.jsp页面内容:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<%

String name=request.getParameter("name");

%>

<body>

<%=name%>

</body>

现象:中文乱码,比如“??????”

解决方法如下:

方法一:

1. 在b.jsp中把pageEncoding="GB2312"改为pageEncoding="ISO8859-1"

虽然这样b.jsp页面显示的内容还是乱码,但是不是那种“??????”的乱码,而是一些特殊字符

2. 然后在浏览器中查看菜单中修改成GB2312的编码,这时乱码就显示中文了。

3. 但是这种方法是不可行的。

方法二:

1. 在b.jsp中把String name=request.getParameter("name");修改为

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");

2. 这时再在页面上显示,则就是中文了。

3. 但是我个人不喜欢这种方法,因为编写起来代码非常繁琐

方法三:

1. 有人说修改get/post的传值方式,但是这是有前提的,如果只是把get方式修改成post方式,页面结果还是乱码!

2. 前提你必须配置了过滤器,若果你只是配置了过滤器,则传值方式必须是:post方式才不是乱码,如果是get方式照样是乱码!

3. 过滤器的配置,我想大家都能有,我就不说了

方法四:

1. 有人说配置tomcat的配置文件server.xml里这句:

<Connector URIEncoding="GB2312"

port="8080" maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

connectionTimeout="20000" disableUploadTimeout="true" />

加上这句:URIEncoding="GB2312"

2. 虽然可以但是有前提的,若果你过滤器没有配置,则只是配置了server.xml文件,这样只有在表单是get传值时候才可以!当是post方式时,照样是乱码!

*这时我们就可以看出在tomcat5中的post与get传值方式是不一样的*

*有人要问有没有一种方法让传值使用get方式或post方式都好用呢,下面就是我推荐的方法五*

方法五:

1. 其实很简单,就是同时实现方法三又实现方法四!

2. 就是先配置过滤器,又配置server.xml文件,都设置成GB2312的编码

3. 这样无论是post还是get方式的表单传值,中文都不会是乱码!

这些只是jsp页面的传值中文字符乱码解决,对于jsp与数据库之间小妹还有待研究

有什么好文章也希望大家给推荐一下

------------------------------------------------------------------------------------------------------------

本部分转载自:用过滤器来解决JSP中文乱码问题

 1 package com.util;
 2 
 3 import java.io.IOException;
 4 import java.io.UnsupportedEncodingException;
 5 
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletRequestWrapper;
14 import javax.servlet.http.HttpServletResponse;
15 import javax.servlet.http.HttpSession;
16 
17 
18 //过滤器处理表单传到servlet的乱码问题
19 public class MyFilter implements Filter{
20     //自写一个request换掉原来的request,重写里面的getParemeter方法,可以设置编码
21     class MyRequest extends HttpServletRequestWrapper{
22         
23         @Override
24         public String getParameter(String param) {
25             String value = null;
26             try {
27                 //post
28                 super.setCharacterEncoding(encoding);//把编码转换为encoding
29                 value = super.getParameter(param);
30                 if(super.getMethod().equalsIgnoreCase("GET")){
31                     if(value!=null){
32                         value = new String(value.getBytes("iso8859-1"),encoding);
33                     }
34                 }
35             } catch (UnsupportedEncodingException e) {
36                 // TODO Auto-generated catch block
37                 e.printStackTrace();
38             }
39             return value;
40         }
41 
42         public MyRequest(HttpServletRequest request) {
43             super(request);
44         }
45         
46     }
47     protected String encoding=null; 
48     public void destroy() { //销毁
49         // TODO Auto-generated method stub
50         this.encoding=null;
51     }
52    //对编码问题进行转换
53     public void doFilter(ServletRequest request, ServletResponse response,
54             FilterChain chain) throws IOException, ServletException {
55         // TODO Auto-generated method stub
56         response.setContentType("text/html;charset="+encoding);
57         //过滤未登录用户
58         HttpServletRequest req = (HttpServletRequest) request;
59         HttpServletResponse resp = (HttpServletResponse) response;
60         String path=req.getServletPath();
61         String param=req.getQueryString();
62         if(path!=null){
63             path=path+"?"+param;//全请求路径
64         }
65         if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){
66             HttpSession session = req.getSession();
67             String userName = (String) session.getAttribute("username");
68             if(userName == null){
69                 session.setAttribute("url", path.replaceFirst("/", ""));
70                 System.out.println(session.getAttribute("url"));
71                 resp.sendRedirect("user.do?op=loginAction");
72                 return;
73             }
74         }
75         //把过滤器给下一个过滤器或资源处理器
76         chain.doFilter(new MyRequest((HttpServletRequest) request), response); 
77     }
78 
79     public void init(FilterConfig filterConfig) throws ServletException {
80         // TODO Auto-generated method stub
81         this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定
82     }
83 
84 }

然后在web.xml对该过滤器进行注册和映射:

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.util.MyFilter</filter-class>
    <init-param>
       <param-name>encoding</param-name>
       <param-value>utf-8</param-value>
    </init-param>
  </filter>
 <filter-mapping>
     <filter-name>EncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping></span>

上面写的过滤器MyFilter类,本来只能处理post提交的数据(post是先处理后接收,get是先接收后处理)。

但是MyFilter里面在对任何页面过滤的时候,来了一个偷梁换柱:把原来客户端请求的request给换掉了,换成自己定义的一个request了,即内部类MyRequest,不过该类要继承一个类HttpServletRequestWrapper。

在自定义的一个内部类MyRequest里面,实现了一个好强大的功能,就是重写了request的getParameter()方法。该方法里面即处理了post提交,又能处理get提交,返回的值就是处理后的值,所以该过滤器就能实现处理post和get提交的乱码问题!

--------------------------------------------------------------------------------------------------

本部分转载自:URLEncoder.encode与URLDecoder.docode传递中文参数编码与解码

在传递参数的时候,如果有中文,那么可以先转码再转,之后再解码。

使用java.net.URLEncoder.encode()可以对要传递的中文进行编码

a.在传参数之前先把参数进行转码:java.net.URLEncoder.encode(param);

取值时用语句java.net.URLDecoder.decode(param);再转回中文

b.在你的Tomcat目录-->conf目录-->server.xml里找出这段:

<Connector

port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

debug="0" connectionTimeout="20000"

disableUploadTimeout="true"

<!--在里边加上这个参数-->

URIEncoding="gb2312"

/>

前端的写法:

<%@ page contentType="text/html;charset=gb2312" %>

<a href="ds.jsp?url=<%=java.net.URLEncoder.encode("编码的是这里","GB2312")%>">点击这里</a>

使用java.net.URLDecoder.decode()在后面对传递的参数进行解码,一定要搭配使用哦

<%

if(request.getParameter("url")!=null)

{

str=request.getParameter("url");

str=java.net.URLDecoder.decode(str,"GB2312");

str=new String(str.getBytes("ISO-8859-1"));

out.print(str);

}

%>

若,字符编码为utf-8也可以实现.或者在此段代码中,不写出字符编码也可以(只写一个参数)。

ajax写法:

$.ajax({

url:'<%=request.getContextPath()%>/cargroup-ajax/searchCargroupName.action',

async:false,

data:{

cargroupName:encodeURI(cargroupName) //中文

},

type:'post',

dataType:'json',

success:function(data){

if(data=="true"){

if(flag!="form"){

alert("该名称可用!");

}

checkRepeat = true;

}else{

if(flag!="form"){

alert("该名称不可用!");

}

}

}

});

后台java:

cargroupName = URLDecoder.decode(request.getParameter("cargroupName"), "utf-8");

--------------------------------------------------------------------------------------------------------------

本部分转载自:URLEncoder与URLDecoder的使用

今天传url的时候乱码了。先说情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")来获取,jsp中的是GBK的编码,服务器用的是jboss,里面有个server.xml有如下配置。

<Connector port="80" address="${jboss.bind.address}"    
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIENCODING="UTF-8"/>

之前是没有uriencoding这个属性的,我给干掉,问题解决,这时候用的是默认值即ISO-8859-1。

关于server.xml的配置可以参考这个url的文档

http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html

问题解决的过程中,我特意研究了一下urlencode和urldecode这两个类,之所以没有用这种方案是因为我获得页面上的连接的时候用的是一个开源的叫做Cloud的类。

网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码; 2.将空格转换为加号 (+) ; 3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值; 4.在每个 name=value 对之间放置 & 符号。

编码过程非常简单,任何字符只要不是ASCII码数字,字母,或者前面提到的标点符,它们都将被转换成字节形式,每个字节都写成这种形式:一个“%”后面跟着两位16进制的数值。空格是一个特殊情况,因为它们太平常了。它除了被编码成“%20”以外,还能编码为一个“+”。加号(+)本身被编码为%2B。当/ # = & 和?作为名字的一部分来使用时,而不是作为URL部分之间的分隔符来使用时,它们都应该被编码。

类URL并不自动执行编码或解码工作。你能生成一个URL对象,它可以包括非法的ASCII和非ASCII字符和/或%xx。当用方法getPath() 和toExternalForm( ) 作为输出方法时,这种字符和转移符不会自动编码或解码。你应对被用来生成一个URL对象的字符串对象负责,确保所有字符都会被恰当地编码。

URLencode这个类负责把String编码成平台上的通用形式,urldecode类可以把url转换成string格式。

下面是urlencode的demo:

public static void main(String[] args) {
        try {
         System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));
         System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));
         System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));
         System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));
         System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));
         System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));
         System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));
         System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));
         System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));
         System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));
         System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));
         System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));
         System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));
         System.out.println(URLEncoder.encode("this中华人民共和国","UTF-8"));
       } catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");
      }
     }

执行结果如下:

This+string+has+spaces
This*string*has*asterisks
This%25string%25has%25percent%25signs
This%2Bstring%2Bhas%2Bpluses
This%2Fstring%2Fhas%2Fslashes
This%22string%22has%22quote%22marks
This%3Astring%3Ahas%3Acolons
This%7Estring%7Ehas%7Etildes
This%28string%29has%28parentheses%29
This.string.has.periods
This%3Dstring%3Dhas%3Dequals%3Dsigns
This%26string%26has%26ersands
This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters
this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD

很明显url中有/%&=这类字符也会被编码,对于我们来说是不对的。例如

public static void main(String[] args) {
        try {
            System.out.println(URLEncoder.encode("pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3","UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

这个结果就是不对的了,会有如下输出:

pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

所以这种情形我们要对每一部分做分段encode

pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

对于urldecoder类来说

它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符

直接上demo:

public static void main(String[] args) {
        String input = "http://www.altavista.com/cgi-bin/" + "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3"; 
        String output;
        try {
            output = URLDecoder.decode(input, "UTF-8");
            System.out.println(output); 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } 
    }

输入的结果如下:

http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+"Java I/O"&search.x=38&search.y=3

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Sqoop】使用Hive和Sqoop实现网站基本指标PV和UV的统计

    【案例需求】统计某网站24小时内每个时段的PV和UV值。 【步骤分析】 (1)建分区表进行多级分区,按天一级分区,按小时二级分区。 (2)获取时间字段,天...

    魏晓蕾
  • 一文读懂七大设计原则及GoF 23种设计模式

    GoF23种设计模式来源于《Design Patterns: Elements of Reusable Object-Oriented Software》,即后...

    魏晓蕾
  • 【Hive】Hive企业级实战案例

    (1)时间格式大体分为两类: 标准日期格式:2015-08-31 00:04:37 Unixtimestamp:以格林威治时间为基准的Unix时间戳,该时间...

    魏晓蕾
  • phpstorm运行本地PHP服务器,实现小程序可以访问的PHP后台

    通过效果图我们可以看出来,我们的小程序可以成功的访问到我们的后台数据,而这个后台就是用PHP搭建的一个本地服务器。

    编程小石头
  • RabbitMQ实战(二)-基础概念

    RabbitMQ是一个开源的消息代理和队列服务器,通过普通协议在完全不同的应用之间共享数据,使用Erlang语言编写,并且基于AMQP协议.

    JavaEdge
  • 微信小程序从零开始开发步骤(三)底部导航栏

    祈澈菇凉
  • VSCode安装与配置

    大象无痕
  • 【Go API 开发实战 5】基础1:启动一个最简单的 RESTful API 服务器

    要编写一个 RESTful 风格的 API 服务器,首先需要一个 RESTful Web 框架,笔者经过调研选择了 GitHub star 数最多的 Gin。采...

    腾讯技术工程官方号
  • 解读︱腾讯云发布 DDoS 攻击分析报告,揭示云上攻击最新趋势

    腾讯云安全
  • 实战“期货原油”覆盖及优化分类参考类榜单第二心得

    ”期货“近期在操作的时候发现关键词覆盖数异常,截止发稿前已达到覆盖13662个关键词,搜索结果排名位于前三的有200个,搜索结果排名位于前十的有597个。其中搜...

    jiang chen

扫码关注云+社区

领取腾讯云代金券