安卓+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 而且不能有其他。
具体例子:
安卓客户端代码:
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 查询+插入(汉字乱码解决)的更多相关文章
- MySQL数据库插入中文乱码解决方法
在mysql数据库中,插入中文数据时,会出现乱码的现象. 我的测试方法: 首先用Navicat for MySql 插入一行数据,带有中文的. 再用mysql命令行来查看插入的数据,看是否出现乱码. ...
- Delphi+MySQL:TADOQuery使用插入中文乱码解决方法
Delphi+MySQL:TADOQuery使用插入中文乱码解决方法 with adoquery dobeginclose;sql.clear;sql.text:=' insert into test ...
- linux 下vi /vim 中文汉字乱码解决
http://my.oschina.net/laserdance/blog/53474很多win下编译的配置文件(译码格式有utf8/gbk)上传到linux服务器上时打开汉字乱码 解决方法如下: 修 ...
- 项目--解决MySQL数据库插入中文乱码
转载自:http://blog.csdn.net/zzh920625/article/details/51226312 情景再现] 如图,在项目中使用MySQL数据库,在做插入操作时,写入英文字符没有 ...
- mybatis连接mysql数据库插入中文乱码
对于MySQL数据库的乱码问题,有两种情况: 1. mysql数据库编码问题(建库时设定). 2. 连接mysql数据库的url编码设置问题. 对于第一个问题,目前个人发现只能通过重新建库解决,建库的 ...
- servlet获取request数据的乱码解决
例如请求中有: /score?type=Mana&name=${user.name} ***************************************************** ...
- plsql查询数据显示为乱码解决方法
使用plsql查询数据显示为乱码: 查看数据库编码: 通过网上搜索,发现需要设置环境变量,添加以下环境变量: LANG=zh_CN.GBK NLS_LANG="SIMPLIFIED CHIN ...
- 解决Hibernate向MySQL数据库插入中文乱码问题
有时候我们在用hibernate插入中文的字符会出现乱码情况,如下图所示. 看到这种情况,第一反应便是应用程序用的字符集合数据库用的字符集不统一了.我的数据库用个是mysql的,看一下建表语句.用的是 ...
- EntityFramewok 插入Mysql数据库 中文产生乱码解决
首先Mysql表,建表的时候,有没有选择UTF8,如果是默认的编码latin1,就会产生乱码 这里修改后,还是乱码,那就要检查发生乱码的列是不是UTF8格式 然后修改App.Config或者Web.C ...
随机推荐
- C# winform OpenFileDialog MessageBox
1.弹出窗体选择本地文件-OpenFileDialog OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Tit ...
- MSCRM 获取列表所选记录相关信息
问题:如何通过JS获取列表中所选记录信息? 解决办法: The CRM2011 Ribbon has a special set of parameters called 'CrmParameters ...
- Web API:将FlexChart导出为图片
如果想要将FlexChart在应用之外使用,比如使用在报表中,Web API帮助你将FlexChart导出成任何你需要的图片格式. 下面是实现的步骤: 1:创建FlexChart 2:调用Servic ...
- python常用工具小函数-字符类型转换
Python3有两种表示字符序列的类型:bytes和str.前者的实例包含原始的8位值就是的字节,每个字节有8个二进制位:后者的实例包含Unicode字符.把Unicode字符转成二进制数据最常见的编 ...
- java 小程序--杨辉三角
1. 代码 public static void main(String[] args) { ][]; ; i<; i++){ triangle[i] = ]; ; j<=i; j++){ ...
- Fiddler (五) Mac下使用Fiddler
Fiddler是用C#开发的. 所以Fiddler不能在Mac系统中运行. 没办法直接用Fiddler来截获MAC系统中的HTTP/HTTPS, Mac 用户怎么办呢? Fiddler可 ...
- 详细讲解nodejs中使用socket的私聊的方式
详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...
- Mongodb的备份,恢复,导入与导出(cmd命令行实现)
要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下命令均在cmd ...
- H5移动端页面设计心得分享
去年JDC出了不少优秀的武媚娘…不,H5呢,大家都很拼,同时当然也积累了一些经验和教训,今天结合咱们的实战案例,从字体,排版,动效,音效,适配性,想法这几个方面好好聊一聊关于H5的设计,希望对同学们有 ...
- SharePoint 2013 VSS 编写器
Windows Server 包含的 VSS 是提供内置卷影复制功能的基础结构.VSS 创建的卷影副本扩展了存储管理员的磁带备份存档解决方案,提供可轻松.有效创建和还原的高保真时间点副本,从而帮助简化 ...