jsp必须为gbk编码时候,java代码中getParameter获得中文出现乱码解决方案

本人对java,jsp等相关网页只是很不熟悉,今日为了修改别人留下来的java后台html中嵌套jsp做界面的项目中的一些内容受尽了折磨。在text或者textarea中传入中文的时候,getParameter方法总是得到一堆?,无人可问,只好在网上盲目的找。网上有好多更改jsp编码的方法,也有很多在java中对编码进行各种转换的,试了又试,没什么用。或许可以成功吧,但是我的情况是,当前jsp引用了别的jsp,然而别的jsp从gbk变成utf-8之后就报了html-500的错误,为了不引起更多的未知错误,我放弃了修改界面编码的方向的尝试。而后在CSDN的一帖子中高分的18楼的解决方法帮助了我,为了避免忘记,本人将该帖子引用至此,地址http://bbs.csdn.net/topics/390360298。我们再来看一看这个神奇的类:

  1 public class HttpRequestReader {
  2
  3     Hashtable pairs = new Hashtable();
  4
  5     /**
  6      * RawParameterReader constructor comment.
  7      */
  8     public HttpRequestReader(HttpServletRequest request, String encoding)
  9             throws IOException {
 10         super();
 11         parse(request.getQueryString(), encoding);
 12         parse(request.getReader().readLine(), encoding);
 13     }
 14
 15     public static String decode(String s, String encoding) throws Exception {
 16         StringBuffer sb = new StringBuffer();
 17         for (int i = 0; i < s.length(); i++) {
 18             char c = s.charAt(i);
 19             switch (c) {
 20             case ‘+‘:
 21                 sb.append(‘ ‘);
 22                 break;
 23             case ‘%‘:
 24                 try {
 25                     sb.append((char) Integer.parseInt(
 26                             s.substring(i + 1, i + 3), 16));
 27                 } catch (NumberFormatException e) {
 28                     throw new IllegalArgumentException();
 29                 }
 30                 i += 2;
 31                 break;
 32             default:
 33                 sb.append(c);
 34                 break;
 35             }
 36         }
 37         // Undo conversion to external encoding
 38         String result = sb.toString();
 39         byte[] inputBytes = result.getBytes("8859_1");
 40         return new String(inputBytes, encoding);
 41     }
 42
 43     /**
 44      * Insert the method‘s description here. Creation date: (2001-2-4 17:30:59)
 45      *
 46      * @return java.lang.String
 47      * @param name
 48      *            java.lang.String
 49      */
 50     public String getParameter(String name) {
 51         if (pairs == null || !pairs.containsKey(name))
 52             return null;
 53         return (String) (((ArrayList) pairs.get(name)).get(0));
 54     }
 55
 56     /**
 57      * Insert the method‘s description here. Creation date: (2001-2-4 17:28:17)
 58      *
 59      * @return java.util.Enumeration
 60      */
 61     public Enumeration getParameterNames() {
 62         if (pairs == null)
 63             return null;
 64         return pairs.keys();
 65     }
 66
 67     /**
 68      * Insert the method‘s description here. Creation date: (2001-2-4 17:33:40)
 69      *
 70      * @return java.lang.String[]
 71      * @param name
 72      *            java.lang.String
 73      */
 74     public String[] getParameterValues(String name) {
 75         if (pairs == null || !pairs.containsKey(name))
 76             return null;
 77         ArrayList al = (ArrayList) pairs.get(name);
 78         String[] values = new String[al.size()];
 79         for (int i = 0; i < values.length; i++)
 80             values[i] = (String) al.get(i);
 81         return values;
 82     }
 83
 84     /**
 85      * Insert the method‘s description here. Creation date: (2001-2-4 20:34:37)
 86      *
 87      * @param urlenc
 88      *            java.lang.String
 89      */
 90     private void parse(String urlenc, String encoding)
 91             throws java.io.IOException {
 92         if (urlenc == null)
 93             return;
 94         StringTokenizer tok = new StringTokenizer(urlenc, "&");
 95         try {
 96             while (tok.hasMoreTokens()) {
 97                 String aPair = tok.nextToken();
 98                 int pos = aPair.indexOf("=");
 99                 String name = null;
100                 String value = null;
101                 if (pos != -1) {
102                     name = decode(aPair.substring(0, pos), encoding);
103                     value = decode(aPair.substring(pos + 1), encoding);
104                 } else {
105                     name = aPair;
106                     value = "";
107                 }
108                 if (pairs.containsKey(name)) {
109                     ArrayList values = (ArrayList) pairs.get(name);
110                     values.add(value);
111                 } else {
112                     ArrayList values = new ArrayList();
113                     values.add(value);
114                     pairs.put(name, values);
115                 }
116             }
117         } catch (Exception e) {
118             throw new java.io.IOException(e.getMessage());
119         }
120     }
121 }

在我引入到我的java工程之后又添加了已下的包:

1 import java.io.IOException;
2 import java.util.ArrayList;
3 import java.util.Enumeration;
4 import java.util.Hashtable;
5 import java.util.StringTokenizer;
6
7 import javax.servlet.http.HttpServletRequest;

以便可以使用。

在需要的地方做已下应用:

 1 public void save(HttpServletRequest req, HttpServletResponse resp)
 2             throws ServletException, IOException {
 3         try {
 4             HttpRequestReader paramReader = new HttpRequestReader(req, "gbk");
 5             String strAlertMsg = paramReader.getParameter("device.AlertMsg");
 6         } catch (Exception e) {
 7             this.findForward("/device-details.jsp", true, req, resp);
 8             return;
 9         }
10         this.findForward("/device-details.jsp", true, req, resp);
11         return;
12 }

然后就OK啦!

时间: 2024-10-16 18:45:40

jsp必须为gbk编码时候,java代码中getParameter获得中文出现乱码解决方案的相关文章

批量转换gbk编码的java代码为utf8

#!/bin/bash echo $1 echo $# if [ ! $# -eq 1 ]; then     echo "usage:  ./gbk2utf8.sh src"     exit 0 fi from=$1 find $from -type d -exec mkdir -p utf8/{} \; find $from -type f -name *.java -exec iconv -f GBK -t UTF-8 {} -o utf8/{} \;

如何在java代码中调用一个web项目jsp或者servlet

有时候需要调用一个web项目的jsp或者servlet,但是执行内部的代码,并不是打开jsp,例如需要在一段java代码中清除一个web项目中的缓存,那么可以把清除缓存的代码放在该web项目的一个servlet中,只需要执行如下代码: URL url = new URL("http://192.168.2.123:8080/sace/ClearCache"); url.openStream(); openStream() 执行一次相当于一次URL请求,其中url.openStream(

Java代码中获取Json的key值

测试json字符串: {"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym4iTZ3-ptWRRoVtbCNJnyjGLfed_4bB0HiqGP8v-aXOJUUk1tFs","expires_in":7200,"refresh_token":"_or_31yEp8XhxGWvrAzdWIkXfFlKjfb3iTRpfa

Android如何在java代码中设置margin

习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left, top, right, bottom).可是View本身没

java代码中获取进程process id(转)

另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进程process id, 实现方法如下所示:    参考: rednaxelafx.iteye.com/blog/716918 http://www.cnblogs.com/mumuxinfei/p/3678854.html

【安卓】在java代码中设置drawableLeft时如何给定合适尺寸?

textView.setCompoundDrawables(drawable, null, null, null);时看不到图片,是因为需要手动给定drawable对应的尺寸,即用drawable.setBounds. 如果该drawable为图片,可直接drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());. 即直接给定图片自身尺寸,此时效果和在xml中给定一样. [安卓]在java

Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

<bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil" lazy-init="false"> <property name="locations"> <list> <value>classpath:config/sys.properties</value> &

关于在Java代码中写Sql语句需要注意的问题

最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. 1 String str = "insert into XXX(a,b,c) values ('"a.getA()"','"a.getB()"','"a.getC()"');"; 研究了半天发现应该是连接字符串问题,第一次修改过后将赋值字段前后加“

命令行编译java源文件提示 “编码GBK的不可映射字符” 及输出的中文变为乱码的解决方法

使用命令行编译运行java代码,编译时出现 “编码GBK的不可映射字符” 的错误提示,并且需输出的中文全部变为乱码,此时有两种解决方法: (方法一) 在输入 javac 命令时,额外输入 -encoding utf-8, 例如:如果编译的源文件名为 Test.java ,那么编译时原先只需输入 javac Test.java,而现在需要输入 javac -encoding utf-8 Test.java (方法二) 使用 EditPlus 软件编写代码时,通过修改相关设置然后保存文件即可,具体操