安卓+servlet+MySql 查询+插入(汉字乱码解决)
问题:
安卓程序,通过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 查询+插入(汉字乱码解决)相关推荐
- php mysql查询中文乱码_解决php mysql查询插入中文乱码问题_PHP教程
解决php mysql查询插入中文乱码问题 一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那 ...
- php输出查询mysql中文乱码_解决php mysql查询插入中文乱码问题
一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那么我们来看mysql中文乱码问题解决例子 1 ...
- java mysql插入数据乱码_java向mysql数据库插入数据显示乱码的问题
在做一个java web工程时,有时会碰到在向数据库添加数据库时,结果出现乱码"???"的问题.针对该问题的主要解决办法就是: 一.确保是否添加了字符集过滤器: 在java web ...
- 解决Excel导入mysql数据库时汉字乱码的问题_MySQL
解决Excel导入mysql数据库时汉字乱码的问题_MySQL 1.用下面的命令查看数据库是否采用的是UTF-8编码 show variables like 'char%' 2.将Excel另存为cs ...
- MySQL查询出错提示 --secure-file-priv解决方法
MySQL查询出错提示 --secure-file-priv解决方法 参考文章: (1)MySQL查询出错提示 --secure-file-priv解决方法 (2)https://www.cnblog ...
- NotePad 打开文件 出现中文汉字乱码 解决办法
NotePad 打开文件 出现中文汉字乱码 解决办法 欢迎关注:程序员财富自由之路 现象: 出现中文汉字乱码: 解决办法: 先别着急用notepad修改编码 1. 用windows系统自带记事本打开, ...
- mysql查询不出来乱码_MySQL命令行查询乱码解决办法
MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...
- Linux环境编译安装Mysql以及PHP中文乱码解决
mysql安装 5.6以后可能会收费,所以选择5.1 以下从台湾中山大学镜像下载 1.首先要安装C++编译环境 # yum install gcc-c++ 2.下载解压 # wget http:// ...
- mybatis mysql 中文乱码_mybatis连接mysql数据库插入中文乱码
对于mysql数据库的乱码问题,有两中情况: 1. mysql数据库编码问题(建库时设定). 2. 连接mysql数据库的url编码设置问题. 对于第一个问题,目前个人发现只能通过重新建库解决,建库的 ...
最新文章
- Ubuntu14.04上编译指定版本的protobuf源码操作步骤
- 使用ajaxfileupload.js实现文件上传
- JFreeChart(四)之线型图
- vue 2个方法先后执行_有效快速制作工资条的2个方法
- SparkSQL调优
- STM32驱动ST7920的12864液晶(串行方式)
- J2EE快速入门之集合框架【01】
- atom n270 cpu linux,继续改造ATOM N270增加千兆口自制软路由
- 你还在用乞丐版的深拷贝么
- IT一族需警惕11钟“电脑病”
- ARCGIS绘制南海图框
- Business English-Unit 4 Memos -B
- Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例
- outlook导出邮件(.msg)读取和解析
- 南开大学计算机2019分数线,2019年南开大学录取分数线(预估)
- ShaderForge 之霓虹旋涡
- 测试框架#labview
- OBS Studio导播台多画面使用实测
- Teamcenter LOV属性值的设置与获取
- 厉害了!数据安全智能守护神UEBA(用户实际行为分析)
热门文章
- 听说你还不懂面向对象??
- mysql sql 备份数据_mysql怎么进行数据库备份和还原,以及自动备份
- java 多个监听_​Java中使用for循环对多个Jbutton按钮监听
- 设计模式 适配器模式
- ESDF建图库voxblox的安装编译过程
- CSS具有最高优先级 !important
- 静态 动态 强类型 弱类型语言的区别
- TabLayout+Fragment+ViewPager+FragmentStatePagerAdapter实现Tab标签
- python之-- 异常
- CSS3的radial-gradient(径向渐变)