问题:

  安卓程序,通过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. 解决android sdk 无法更新

    今天更新sdk,遇到了更新下载失败问题: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xmlFetched ...

  2. Windows Server 2012中配置AD域服务

    1.安装完AD域服务后,我们返回服务器管理器界面,点击"将此服务器提升为域控制器",选择"添加新林". 输入域名称:contoso.com 2.按图中所示选择林 ...

  3. Autofac Container 的简单的封装重构

    为了使用方便,对Autofac container的简单封装,记录如下,备以后用或分享给大家,欢迎讨论! using Autofac; using Autofac.Core.Lifetime; usi ...

  4. mysql和oracle jdbc连接

    加载驱动. Class.forName("oracle.jdbc.driver.OracleDriver"); 1 创建连接. Connection con = DriverMan ...

  5. 通过HttpWebRequest请求https接口

    一.为什么进行代理接口的开发: 有些项目需要访问被墙了哒网站,比如前不久公司开发项目需要使用google地图的接口,而google在中国被墙了,所有打算做一个代理接口服务,将代理放到国外服务器上,通过 ...

  6. IOS 2D游戏开发框架 SpriteKit

    最近发现Xcode自带的2D游戏开发框架SpriteKit可以直接引入到APP中进行混合开发,这就是说可以开发出既带业务应用又带游戏的苹果APP,咋怎么觉得这是一个自己的小发现....呵呵....., ...

  7. Java的“友好的”访问指示符(修饰符)

    如果根本不指定访问指示符,就象本章之前的所有例子那样,这时会出现什么情况呢?默认的访问没有关键字,但它通常称为"友好"(Friendly)访问.这意味着当前包内的其他所有类都能访问 ...

  8. GJM : 【技术干货】给The Lab Renderer for Unity中地形添加阴影

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. JQuery(选择器、事件、DOM操作)

    一.jQuery简介 jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 库位于一个 JavaScript 文件中,其中包含了所有 ...

  10. Validating HTTP data with Play

    Validations ensure that the data has certain values or meets specific requirements. You can use vali ...