问题:

  安卓程序,通过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 而且不能有其他。

具体例子:

安卓客户端代码:

  

 package com.linfeng;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List; import org.apache.http.HttpClientConnection;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils; import android.R.string;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
// private static final int REQUEST_CODE = 2;
HttpPost httpRequest = new HttpPost(UriAPI.HTTPCustomer);
EditText et_name;
EditText et_xuenian;
EditText et_xueqi;
TextView show_login;
Button btn_login;
Button btn_cancle;
ProgressDialog progressDialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 初始化登陆界面
btn_login = (Button) findViewById(R.id.btn_login);
btn_cancle = (Button) findViewById(R.id.btn_cancle);
et_name = (EditText) findViewById(R.id.et_name);
et_xuenian = (EditText) findViewById(R.id.xuenian);
et_xueqi = (EditText) findViewById(R.id.xueqi);
show_login = (TextView) findViewById(R.id.show_login);
progressDialog = new ProgressDialog(this);
btn_login.setOnClickListener(new OnClickListener() {
@SuppressWarnings("unchecked")
@Override
public void onClick(View v) {
// 通过AsyncTask类提交数据 异步显示
new AT().execute("20133079", "2016");
}
});
}
public class UriAPI {
/** 定义一个Uri **/
public static final String HTTPCustomer = "http://10.0.2.2:8080/JSONDemo/servlet/Insertdomo";
}
@SuppressWarnings("rawtypes")
class AT extends AsyncTask {
String result = "success";
private HttpURLConnection conn;
@Override
protected void onPreExecute() {
// 加载progressDialog
progressDialog.show();
}
@Override
protected Object doInBackground(Object... params_obj) {
CharSequence username ="20133078";
CharSequence suggest = "铁大jjk"; suggest = et_name.getText(); suggest=suggest.toString(); try {
username = new String(((String) username).getBytes("UTF-8"),"iso8859-1");
suggest = new String(((String) suggest).getBytes("UTF-8"),"iso8859-1");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} if (!username.equals("") && !suggest.equals("")) {
// 请求数据
HttpPost httpRequest = new HttpPost(UriAPI.HTTPCustomer);
// 创建参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username
.toString()));
params.add(new BasicNameValuePair("suggest", suggest.toString()
));
System.out.println(params);
// params.add(new BasicNameValuePair("flag","0"));
try {
// 对提交数据进行编码
httpRequest.setEntity(new UrlEncodedFormEntity(params,
HTTP.ISO_8859_1));
System.out.println(params);
System.out.println(httpRequest);
HttpResponse httpResponse = new DefaultHttpClient()
.execute(httpRequest);
// 获取响应服务器的数据
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 利用字节数组流和包装的绑定数据
byte[] data = new byte[2048];
// 先把从服务端来的数据转化成字节数组
data = EntityUtils
.toByteArray((HttpEntity) httpResponse
.getEntity());
// 再创建字节数组输入流对象
ByteArrayInputStream bais = new ByteArrayInputStream(
data);
// 绑定字节流和数据包装流
DataInputStream dis = new DataInputStream(bais);
// 将字节数组中的数据还原成原来的各种数据类型,代码如下:
result = new String(dis.readUTF());
Log.i("服务器返回信息:", result);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
@Override
protected void onPostExecute(Object result) {
// 获得服务器返回信息成功后
System.out.print(result);
show_login.setText(result.toString()); //显示 success
// 取消进度条
progressDialog.cancel(); if(result.toString()=="success")
{
setContentView(R.layout.classlistselect);
}
}
}
}

服务端Servlet代码:

  1、连接数据库db:

 package db;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import exception.DbException;
public class DbUtils {
private final static String DRIVER="com.mysql.jdbc.Driver";
private final static String URL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
private final static String NAME="root";
private final static String PWD="123456";
private static Connection conn=null;
public static Connection getConenction(){
try {
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL, NAME, PWD);
} catch (ClassNotFoundException e) {
throw new DbException("");
} catch (SQLException e) {
throw new DbException("");
}catch (Exception e){
throw new DbException(e); }
return conn;
}
public static void freeDb(Connection conn,PreparedStatement pmst,ResultSet rs){
try {
if (rs!=null) {
rs.close(); }
} catch (Exception e) {
throw new DbException("");
}
try {
if (pmst!=null) {
pmst.close(); }
} catch (Exception e) {
throw new DbException("");
}
try {
if (conn!=null) {
conn.close(); }
} catch (Exception e) {
throw new DbException("");
} } }

  2、servlet代码:

 package servlet;

 import java.io.DataOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import dao.Insertdom;
public class Insertdomo extends HttpServlet {
private static final long serialVersionUID = 314719472293387358L; @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String re="";
String username = req.getParameter("username");
String suggest = req.getParameter("suggest");
username = new String(username.getBytes("iso8859-1"),"UTF-8");
suggest = new String(suggest.getBytes("iso8859-1"),"UTF-8");
boolean flag = Insertdom.Add(username,suggest);
// try {
// resp.setCharacterEncoding("UTF-8");
// DataOutputStream output=new DataOutputStream(resp.getOutputStream());
// if ("20133079".equals(username) && "天上".equals(suggest)) {
// re = "suggest";
// }else{
// re = suggest;
// }
try {
resp.setCharacterEncoding("UTF-8");
DataOutputStream output=new DataOutputStream(resp.getOutputStream());
if (flag) {
re = "成功";
}else{
re = "失败";
}
output.writeUTF(re);
output.writeInt(1);
output.close();
System.out.print(re);
} catch (Exception e) {
e.printStackTrace();
} }
}

  3、插入具体实现函数:

 package dao;

 import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; import db.DbUtils;
import exception.DbException; public class Insertdom {
static Connection conn = null;
/** */
static {
conn=DbUtils.getConenction(); }
private final static String SQL="insert into suggest(username,suggest) values (?,?)";
/**
* @throws UnsupportedEncodingException */
public static boolean Add(String username,String suggest) throws UnsupportedEncodingException{
PreparedStatement pmst = null;
int rs = 0;
boolean flag = true;
try {
pmst = conn.prepareStatement(SQL);
pmst.setString(1, username);
pmst.setString(2, suggest);
rs=pmst.executeUpdate();
} catch (SQLException e) { throw new DbException("查询无", e);
}
if (rs == 0) {
flag = false;
System.out.println("新增失败");
} else {
flag = true;
System.out.println("新增成功");
}
return flag;
}
}

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

安卓+servlet+MySql 查询+插入(汉字乱码解决)的更多相关文章

  1. MySQL数据库插入中文乱码解决方法

    在mysql数据库中,插入中文数据时,会出现乱码的现象. 我的测试方法: 首先用Navicat for MySql 插入一行数据,带有中文的. 再用mysql命令行来查看插入的数据,看是否出现乱码. ...

  2. Delphi+MySQL:TADOQuery使用插入中文乱码解决方法

    Delphi+MySQL:TADOQuery使用插入中文乱码解决方法 with adoquery dobeginclose;sql.clear;sql.text:=' insert into test ...

  3. linux 下vi /vim 中文汉字乱码解决

    http://my.oschina.net/laserdance/blog/53474很多win下编译的配置文件(译码格式有utf8/gbk)上传到linux服务器上时打开汉字乱码 解决方法如下: 修 ...

  4. 项目--解决MySQL数据库插入中文乱码

    转载自:http://blog.csdn.net/zzh920625/article/details/51226312 情景再现] 如图,在项目中使用MySQL数据库,在做插入操作时,写入英文字符没有 ...

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

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

  6. servlet获取request数据的乱码解决

    例如请求中有: /score?type=Mana&name=${user.name} ***************************************************** ...

  7. plsql查询数据显示为乱码解决方法

    使用plsql查询数据显示为乱码: 查看数据库编码: 通过网上搜索,发现需要设置环境变量,添加以下环境变量: LANG=zh_CN.GBK NLS_LANG="SIMPLIFIED CHIN ...

  8. 解决Hibernate向MySQL数据库插入中文乱码问题

    有时候我们在用hibernate插入中文的字符会出现乱码情况,如下图所示. 看到这种情况,第一反应便是应用程序用的字符集合数据库用的字符集不统一了.我的数据库用个是mysql的,看一下建表语句.用的是 ...

  9. EntityFramewok 插入Mysql数据库 中文产生乱码解决

    首先Mysql表,建表的时候,有没有选择UTF8,如果是默认的编码latin1,就会产生乱码 这里修改后,还是乱码,那就要检查发生乱码的列是不是UTF8格式 然后修改App.Config或者Web.C ...

随机推荐

  1. IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误

    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ...

  2. Win10 IoT C#开发 3 - GPIO Pin 控制发光二极管

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一篇文 ...

  3. 【Java每日一题】20161103

    package Nov2016; import java.util.List; public class Ques1103 { public void method01(String[] array) ...

  4. JAVA开发环境和IntelliJ工具安装

    在本地开发机中进行web项目的开发,部署到生产环境进行产品发布时,需要将web应用的文件打包成war包,War包可以放在Tomcat下的webapps或者word目录下,随着tomcat服务器的启动, ...

  5. selenium + python自动化测试环境搭建

    selenium的在python平台的搭建: 搭建平台windows 准备工具如下: --------------------------------------------------------- ...

  6. 关于javascript的一些知识以及循环

    javascript的一些知识点:1.常用的五大浏览器:chrome,firefox,Safari,ie,opera 2.浏览器是如何工作的简化版:3.Js由ECMAjavascript;DOM;BO ...

  7. 使用coding、daocloud和docker打造markdown纯静态博客

    说起独立博客的技术演变,从数据库到纯文本放git是一大进步,从HTML到markdown又是一大进步. 解析技术有没有进步呢?既然markdown是纯文本了,再用PHP/Python/Ruby去实时解 ...

  8. Wrangle – 响应式的,触摸友好的多选插件

    Wrangle 是一个响应式,触摸友好的选择插件,支持 jQuery 以及 Zepto.Wrangle 为多项选择提供了一个独特的方法:通过画一条贯穿项目的线条来选择项目.它给你的应用程序的一种新的方 ...

  9. PhotoSwipe - 移动开发必备的 iOS 风格相册

    PhotoSwipe 是一个专门针对移动设备的图像画廊,它的灵感来自 iOS 的图片浏览器和谷歌移动端图像. PhotoSwipe 提供您的访客熟悉和直观的界面,使他们能够与您的移动网站上的图像进行交 ...

  10. 乱码之MyEclipse控制台

    今天突然发现控制台出现乱码,查了资料解决方案不一. 我的解决方案如下: Run -> Debug Configuration... -> MyEclipse Servler -> M ...