问题:

  安卓程序,通过servlet连接MySQL数据库,并实现查询和插入(修改,删除类似)。

其中遇到的最大的问题是:汉字乱码问题(查询条件有汉字乱码、servlet的汉字到数据乱码、安卓通过servlet方法数据库汉字乱码)

  当所有的编码(客户端,服务端,数据库)都为UTF-8时,但是插入汉字依然为乱码。

  1、安卓客户端中的汉字到servlet中为乱码。

    当插入到数据库的汉字为乱码(而不是问号)时。

    解决方法:

    在安卓客户端将String中的汉字由UTF-8转码为ISO8859-1.

    username = new String(((String) username).getBytes("UTF-8"),"iso8859-1");

    在servlet服务端将String中的汉字由ISO8859-1转码为UTF-8.

    username = new String(username.getBytes("iso8859-1"),"UTF-8");

    至此,servlet中收到的汉字即为正确的汉字而不是乱码。

    如果,此时插入到数据库中的汉字由乱码改成了问号,那么请看2.

  2、servlet到数据库中为问号。

    判断此种情况,可在servlet中的SQL语句直接赋值,而不是再获取。如果数据库中显示为问号时。

    解决方法:

    jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8

    其中必须有 ?useUnicode=true&characterEncoding=utf8 而且不能有其他。

具体例子:

安卓客户端代码:

  

  1 package com.linfeng;
  2 import java.io.ByteArrayInputStream;
  3 import java.io.DataInputStream;
  4 import java.io.IOException;
  5 import java.io.OutputStream;
  6 import java.io.UnsupportedEncodingException;
  7 import java.net.HttpURLConnection;
  8 import java.net.URL;
  9 import java.net.URLEncoder;
 10 import java.util.ArrayList;
 11 import java.util.List;
 12
 13 import org.apache.http.HttpClientConnection;
 14 import org.apache.http.HttpEntity;
 15 import org.apache.http.HttpResponse;
 16 import org.apache.http.NameValuePair;
 17 import org.apache.http.client.ClientProtocolException;
 18 import org.apache.http.client.entity.UrlEncodedFormEntity;
 19 import org.apache.http.client.methods.HttpPost;
 20 import org.apache.http.client.methods.HttpUriRequest;
 21 import org.apache.http.client.utils.URLEncodedUtils;
 22 import org.apache.http.impl.client.DefaultHttpClient;
 23 import org.apache.http.message.BasicNameValuePair;
 24 import org.apache.http.protocol.HTTP;
 25 import org.apache.http.util.EntityUtils;
 26
 27 import android.R.string;
 28 import android.app.Activity;
 29 import android.app.ProgressDialog;
 30 import android.os.AsyncTask;
 31 import android.os.Bundle;
 32 import android.util.Log;
 33 import android.view.View;
 34 import android.view.View.OnClickListener;
 35 import android.widget.Button;
 36 import android.widget.EditText;
 37 import android.widget.TextView;
 38 public class MainActivity extends Activity {
 39     // private static final int REQUEST_CODE = 2;
 40     HttpPost httpRequest = new HttpPost(UriAPI.HTTPCustomer);
 41     EditText et_name;
 42     EditText et_xuenian;
 43     EditText et_xueqi;
 44     TextView show_login;
 45     Button btn_login;
 46     Button btn_cancle;
 47     ProgressDialog progressDialog;
 48     /** Called when the activity is first created. */
 49     @Override
 50     public void onCreate(Bundle savedInstanceState) {
 51         super.onCreate(savedInstanceState);
 52         setContentView(R.layout.main);
 53         // 初始化登陆界面
 54         btn_login = (Button) findViewById(R.id.btn_login);
 55         btn_cancle = (Button) findViewById(R.id.btn_cancle);
 56         et_name = (EditText) findViewById(R.id.et_name);
 57         et_xuenian = (EditText) findViewById(R.id.xuenian);
 58         et_xueqi = (EditText) findViewById(R.id.xueqi);
 59         show_login = (TextView) findViewById(R.id.show_login);
 60         progressDialog = new ProgressDialog(this);
 61         btn_login.setOnClickListener(new OnClickListener() {
 62             @SuppressWarnings("unchecked")
 63             @Override
 64             public void onClick(View v) {
 65                 // 通过AsyncTask类提交数据 异步显示
 66                 new AT().execute("20133079", "2016");
 67             }
 68         });
 69     }
 70     public class UriAPI {
 71         /** 定义一个Uri **/
 72         public static final String HTTPCustomer = "http://10.0.2.2:8080/JSONDemo/servlet/Insertdomo";
 73     }
 74     @SuppressWarnings("rawtypes")
 75     class AT extends AsyncTask {
 76         String result = "success";
 77         private HttpURLConnection conn;
 78         @Override
 79         protected void onPreExecute() {
 80             // 加载progressDialog
 81             progressDialog.show();
 82         }
 83         @Override
 84         protected Object doInBackground(Object... params_obj) {
 85             CharSequence username ="20133078";
 86             CharSequence suggest = "铁大jjk";
 87
 88             suggest = et_name.getText();
 89
 90             suggest=suggest.toString();
 91
 92
 93             try {
 94                 username = new String(((String) username).getBytes("UTF-8"),"iso8859-1");
 95                 suggest = new String(((String) suggest).getBytes("UTF-8"),"iso8859-1");
 96             } catch (Exception e1) {
 97                 // TODO Auto-generated catch block
 98                 e1.printStackTrace();
 99             }
100
101
102             if (!username.equals("") && !suggest.equals("")) {
103                 // 请求数据
104                 HttpPost httpRequest = new HttpPost(UriAPI.HTTPCustomer);
105                 // 创建参数
106                 List<NameValuePair> params = new ArrayList<NameValuePair>();
107                 params.add(new BasicNameValuePair("username", username
108                         .toString()));
109                 params.add(new BasicNameValuePair("suggest", suggest.toString()
110                         ));
111                 System.out.println(params);
112                 // params.add(new BasicNameValuePair("flag","0"));
113                 try {
114                     // 对提交数据进行编码
115                     httpRequest.setEntity(new UrlEncodedFormEntity(params,
116                             HTTP.ISO_8859_1));
117                     System.out.println(params);
118                     System.out.println(httpRequest);
119                     HttpResponse httpResponse = new DefaultHttpClient()
120                             .execute(httpRequest);
121                     // 获取响应服务器的数据
122                     if (httpResponse.getStatusLine().getStatusCode() == 200) {
123                         // 利用字节数组流和包装的绑定数据
124                         byte[] data = new byte[2048];
125                         // 先把从服务端来的数据转化成字节数组
126                         data = EntityUtils
127                                 .toByteArray((HttpEntity) httpResponse
128                                         .getEntity());
129                         // 再创建字节数组输入流对象
130                         ByteArrayInputStream bais = new ByteArrayInputStream(
131                                 data);
132                         // 绑定字节流和数据包装流
133                         DataInputStream dis = new DataInputStream(bais);
134                         // 将字节数组中的数据还原成原来的各种数据类型,代码如下:
135                         result = new String(dis.readUTF());
136                         Log.i("服务器返回信息:", result);
137                     }
138                 } catch (ClientProtocolException e) {
139                     e.printStackTrace();
140                 } catch (UnsupportedEncodingException e) {
141                     e.printStackTrace();
142                 } catch (IOException e) {
143                     e.printStackTrace();
144                 }
145             }
146             return result;
147         }
148         @Override
149         protected void onPostExecute(Object result) {
150             // 获得服务器返回信息成功后
151             System.out.print(result);
152             show_login.setText(result.toString()); //显示  success
153             // 取消进度条
154             progressDialog.cancel();
155
156             if(result.toString()=="success")
157             {
158                 setContentView(R.layout.classlistselect);
159             }
160         }
161     }
162 }

服务端Servlet代码:

  1、连接数据库db:

 1 package db;
 2
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.PreparedStatement;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8
 9 import exception.DbException;
10 public class DbUtils {
11     private final static String DRIVER="com.mysql.jdbc.Driver";
12     private final static String URL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
13     private final static String NAME="root";
14     private final static String PWD="123456";
15     private static Connection conn=null;
16         public static Connection getConenction(){
17         try {
18             Class.forName(DRIVER);
19             conn=DriverManager.getConnection(URL, NAME, PWD);
20         } catch (ClassNotFoundException e) {
21          throw new DbException("");
22         } catch (SQLException e) {
23             throw new DbException("");
24         }catch (Exception e){
25             throw new DbException(e);
26
27         }
28         return conn;
29     }
30         public static void freeDb(Connection conn,PreparedStatement pmst,ResultSet rs){
31         try {
32             if (rs!=null) {
33                 rs.close();
34
35             }
36         } catch (Exception e) {
37             throw new DbException("");
38         }
39         try {
40             if (pmst!=null) {
41                 pmst.close();
42
43             }
44         } catch (Exception e) {
45             throw new DbException("");
46         }
47         try {
48             if (conn!=null) {
49                 conn.close();
50
51             }
52         } catch (Exception e) {
53             throw new DbException("");
54         }
55
56     }
57
58 }

  2、servlet代码:

 1 package servlet;
 2
 3
 4 import java.io.DataOutputStream;
 5 import java.io.IOException;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10
11 import dao.Insertdom;
12 public class Insertdomo extends HttpServlet {
13     private static final long serialVersionUID = 314719472293387358L;
14
15     @Override
16     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
17             throws ServletException, IOException {
18         String re="";
19         String username = req.getParameter("username");
20         String suggest = req.getParameter("suggest");
21         username = new String(username.getBytes("iso8859-1"),"UTF-8");
22         suggest = new String(suggest.getBytes("iso8859-1"),"UTF-8");
23         boolean flag = Insertdom.Add(username,suggest);
24 //        try {
25 //            resp.setCharacterEncoding("UTF-8");
26 //            DataOutputStream output=new DataOutputStream(resp.getOutputStream());
27 //            if ("20133079".equals(username) && "天上".equals(suggest)) {
28 //            re = "suggest";
29 //        }else{
30 //            re = suggest;
31 //        }
32         try {
33             resp.setCharacterEncoding("UTF-8");
34             DataOutputStream output=new DataOutputStream(resp.getOutputStream());
35             if (flag) {
36             re = "成功";
37         }else{
38             re = "失败";
39         }
40         output.writeUTF(re);
41         output.writeInt(1);
42         output.close();
43         System.out.print(re);
44         } catch (Exception e) {
45             e.printStackTrace();
46         }
47
48     }
49 }

  3、插入具体实现函数:

 1 package dao;
 2
 3 import java.io.UnsupportedEncodingException;
 4 import java.sql.Connection;
 5 import java.sql.PreparedStatement;
 6 import java.sql.SQLException;
 7
 8 import db.DbUtils;
 9 import exception.DbException;
10
11 public class Insertdom {
12     static Connection conn = null;
13     /**
14
15      */
16     static {
17         conn=DbUtils.getConenction();
18
19     }
20     private final static String SQL="insert into suggest(username,suggest) values (?,?)";
21     /**
22      * @throws UnsupportedEncodingException
23
24      */
25     public static boolean Add(String username,String suggest) throws UnsupportedEncodingException{
26         PreparedStatement pmst = null;
27         int rs = 0;
28         boolean flag = true;
29         try {
30             pmst = conn.prepareStatement(SQL);
31             pmst.setString(1, username);
32             pmst.setString(2, suggest);
33             rs=pmst.executeUpdate();
34         } catch (SQLException e) {
35
36             throw new DbException("查询无", e);
37         }
38          if (rs == 0) {
39                 flag = false;
40                 System.out.println("新增失败");
41             } else {
42                 flag = true;
43                 System.out.println("新增成功");
44             }
45             return flag;
46     }
47 }

这只是安卓通过servlet访问数据库的一种方法,还有更多的方法值得我们去学习。 

转载于:https://www.cnblogs.com/L-Damon-v/p/5575555.html

安卓+servlet+MySql 查询+插入(汉字乱码解决)相关推荐

  1. php mysql查询中文乱码_解决php mysql查询插入中文乱码问题_PHP教程

    解决php mysql查询插入中文乱码问题 一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那 ...

  2. php输出查询mysql中文乱码_解决php mysql查询插入中文乱码问题

    一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那么我们来看mysql中文乱码问题解决例子 1 ...

  3. java mysql插入数据乱码_java向mysql数据库插入数据显示乱码的问题

    在做一个java web工程时,有时会碰到在向数据库添加数据库时,结果出现乱码"???"的问题.针对该问题的主要解决办法就是: 一.确保是否添加了字符集过滤器: 在java web ...

  4. 解决Excel导入mysql数据库时汉字乱码的问题_MySQL

    解决Excel导入mysql数据库时汉字乱码的问题_MySQL 1.用下面的命令查看数据库是否采用的是UTF-8编码 show variables like 'char%' 2.将Excel另存为cs ...

  5. MySQL查询出错提示 --secure-file-priv解决方法

    MySQL查询出错提示 --secure-file-priv解决方法 参考文章: (1)MySQL查询出错提示 --secure-file-priv解决方法 (2)https://www.cnblog ...

  6. NotePad 打开文件 出现中文汉字乱码 解决办法

    NotePad 打开文件 出现中文汉字乱码 解决办法 欢迎关注:程序员财富自由之路 现象: 出现中文汉字乱码: 解决办法: 先别着急用notepad修改编码 1. 用windows系统自带记事本打开, ...

  7. mysql查询不出来乱码_MySQL命令行查询乱码解决办法

    MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...

  8. Linux环境编译安装Mysql以及PHP中文乱码解决

    mysql安装  5.6以后可能会收费,所以选择5.1 以下从台湾中山大学镜像下载 1.首先要安装C++编译环境 # yum install gcc-c++ 2.下载解压 # wget http:// ...

  9. mybatis mysql 中文乱码_mybatis连接mysql数据库插入中文乱码

    对于mysql数据库的乱码问题,有两中情况: 1. mysql数据库编码问题(建库时设定). 2. 连接mysql数据库的url编码设置问题. 对于第一个问题,目前个人发现只能通过重新建库解决,建库的 ...

最新文章

  1. Ubuntu14.04上编译指定版本的protobuf源码操作步骤
  2. 使用ajaxfileupload.js实现文件上传
  3. JFreeChart(四)之线型图
  4. vue 2个方法先后执行_有效快速制作工资条的2个方法
  5. SparkSQL调优
  6. STM32驱动ST7920的12864液晶(串行方式)
  7. J2EE快速入门之集合框架【01】
  8. atom n270 cpu linux,继续改造ATOM N270增加千兆口自制软路由
  9. 你还在用乞丐版的深拷贝么
  10. IT一族需警惕11钟“电脑病”
  11. ARCGIS绘制南海图框
  12. Business English-Unit 4 Memos -B
  13. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例
  14. outlook导出邮件(.msg)读取和解析
  15. 南开大学计算机2019分数线,2019年南开大学录取分数线(预估)
  16. ShaderForge 之霓虹旋涡
  17. 测试框架#labview
  18. OBS Studio导播台多画面使用实测
  19. Teamcenter LOV属性值的设置与获取
  20. 厉害了!数据安全智能守护神UEBA(用户实际行为分析)

热门文章

  1. 听说你还不懂面向对象??
  2. mysql sql 备份数据_mysql怎么进行数据库备份和还原,以及自动备份
  3. java 多个监听_​Java中使用for循环对多个Jbutton按钮监听
  4. 设计模式 适配器模式
  5. ESDF建图库voxblox的安装编译过程
  6. CSS具有最高优先级 !important
  7. 静态 动态 强类型 弱类型语言的区别
  8. TabLayout+Fragment+ViewPager+FragmentStatePagerAdapter实现Tab标签
  9. python之-- 异常
  10. CSS3的radial-gradient(径向渐变)