关于android通过servlet访问MySql数据库的问题.docx

上传人:b****3 文档编号:10348847 上传时间:2023-05-25 格式:DOCX 页数:16 大小:19.12KB
下载 相关 举报
关于android通过servlet访问MySql数据库的问题.docx_第1页
第1页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第2页
第2页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第3页
第3页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第4页
第4页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第5页
第5页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第6页
第6页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第7页
第7页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第8页
第8页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第9页
第9页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第10页
第10页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第11页
第11页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第12页
第12页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第13页
第13页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第14页
第14页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第15页
第15页 / 共16页
关于android通过servlet访问MySql数据库的问题.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

关于android通过servlet访问MySql数据库的问题.docx

《关于android通过servlet访问MySql数据库的问题.docx》由会员分享,可在线阅读,更多相关《关于android通过servlet访问MySql数据库的问题.docx(16页珍藏版)》请在冰点文库上搜索。

关于android通过servlet访问MySql数据库的问题.docx

关于android通过servlet访问MySql数据库的问题

关于android通过servlet访问MySql数据库的问题(附带简单的JSON使用)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~准备工作~~~~~~~~~~~~~~~~~~~~~~~

一。

tomcat编译servlet要用到servlet.api.jar包,需要存放于C:

\ProgramFiles\Java\jdk1.6.0_07\jre\lib\ext中或者配置classpath。

二。

操作MySql需要下载驱动mm.mysql,mysql-connector-java-3.1.14-bin.jar存放于项目的web-inf/lib目录及tomcat的lib目录下。

三。

android程序访问网络需要在AndroidManifest.xml中声明权限

name="android.permission.INTERNET">

四。

3.0以上系统需要在onCreat方法中写下以下语句,否则会出现android.os.NetworkOnMainThreadException异常。

[html]viewplaincopy

StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()

.detectDiskReads().detectDiskWrites().detectNetwork()

.penaltyLog().build());

StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()

.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()

.penaltyLog().penaltyDeath().build());

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~OK,可以开始了~~~~~~~~~~~~~~~~~~~

一。

接收端android简易程序

[html]viewplaincopy

publicclassAbc_clientActivityextendsActivity{

/**Calledwhentheactivityisfirstcreated.*/

ButtonmButton;

TextViewmTextView;

Stringcontent;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mButton=(Button)findViewById(R.id.button1);

mTextView=(TextView)findViewById(R.id.textView1);

a();

mButton.setOnClickListener(newButton.OnClickListener(){

@Override

publicvoidonClick(Viewarg0){

try{

content=Connecting();//获取返回值

}catch(IOExceptione){

e.printStackTrace();

}

mTextView.setText(content);//在TextView中显示

}

});

}

privatevoida(){

StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()

.detectDiskReads().detectDiskWrites().detectNetwork()

.penaltyLog().build());

StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()

.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()

.penaltyLog().penaltyDeath().build());

}

protectedStringConnecting()throwsParseException,IOException{

//这个路径最后会详细说明

Stringurl1="http:

//10.81.36.187:

8080/orderdishes/orderdishes_servlet";

Stringurl2="username="+"a";

Stringurl=url1+"?

"+url2;

//即相当于http:

//10.81.36.187:

8080/orderdishes/orderdishes_servlet?

username="a",其中的//username对应"a",后面会用到

Stringresult="";

System.out.println("1");

HttpGetrequest=newHttpGet(url);//调用servlet的doget方法

System.out.println("2");

//在这里执行请求,访问url,并获取响应

HttpResponseresponse=newDefaultHttpClient().execute(request);

System.out.println("3");

//获取返回码,等于200即表示连接成功,并获得响应

if(response.getStatusLine().getStatusCode()==200){

System.out.println("4");

result=EntityUtils.toString(response.getEntity());//获取响应中的数据

System.out.println("result"+result);

}else{

System.out.println("连接失败");

}

returnresult;

}

}

二、servlet类(不是在一个工程中写的,所以没有包名,这里的文件名是orderdishes_servlet.java)

[html]viewplaincopy

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.sql.Connection;

importjava.sql.DriverManager;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.sql.Statement;

importjavax.servlet.ServletException;

importjavax.servlet.annotation.WebServlet;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

publicclassorderdishes_servletextendsHttpServlet{

privatestaticfinallongserialVersionUID=1L;

/**

*@seeHttpServlet#HttpServlet()

*/

protectedvoiddoGet(HttpServletRequestrequest,//只使用doGet方法

HttpServletResponseresponse){

Stringname=null;

try{

//获取请求url中携带的参数,及之前的username所对应的"a"

name=newString(request.getParameter("username").getBytes(

"ISO-8859-1"),"UTF-8");

//mm.mysql的class名为org.gjt.mm.mysql.Driver,登记时必须写成如下格式

Class.forName("org.gjt.mm.mysql.Driver").newInstance();

//其中db为MySql数据库的名字,root为数据库的账号,password为密码,同时使用//useUnicode,characterEncoding,能解决数据库输出时的中文问题

ConnectionC=DriverManager.getConnection("jdbc:

mysql:

//localhost/db?

user=root&password=123&useUnicode=true&characterEncoding=8859_1");

//代码中使用了absolute,ResultSet.TYPE_SCROOL_SENSITIVE等的目的是为了测试//mm.mysql是否符合jdbc2.0的规范,虽然我也不懂具体用意

Statementstate=C.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

//将查询的结果放在result中,test为表名

ResultSetresult=state.executeQuery("select*fromtestwherename="+"\""+name+"\"");

if(result!

=null){

response.setContentType("text/html;charset=UTF-8");//这句必须放在PrintWriter//out=response.getWriter();前面,不然输出中文依然为乱码。

PrintWriterout=response.getWriter();

while(result.next()){

out.print("用户名:

"+name+"的账号密码为:

"+result.getString("name")+""+result.getString("password"));

}

}else{

PrintWriterout=response.getWriter();

out.print("用户名不存在");//这个是响应之后返回的数据

}

}catch(InstantiationExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e.printStackTrace();

}catch(ClassNotFoundExceptione){

e.printStackTrace();

}catch(IOExceptione){

e.printStackTrace();

}catch(SQLExceptione){

e.printStackTrace();

}

}

三。

tomcat中的配置

1.在tomcat根目录下建立以下文件夹

E:

\Tomcat7.0\webapps\orderdishes

2.在orderdishes中建立WEB-INF文件夹,里面建个classes文件夹

3.将之前的orderdishes_servlet.java通过javac命令编译成orderdishes_servlet.class放在classes文件夹中

4.然后我们需要定义web.xml文件,这个可以在E:

\Tomcat7.0\webapps\ROOT\WEB-INF下copy一个,然后加入以下语句

orderdishes_servlet//servlet名称

orderdishes_servlet//servlet指向的类文件

orderdishes_servlet

/orderdishes_servlet//这个是定义web访问时servlet的相对路径

如此,我们之前定义的url格式就是http:

//10.81.36.187:

8080/orderdishes/orderdishes_servlet,orderdishes是指servlet所在的文件夹名字,/orderdishes_servlet就是上面定义的相对路径。

如果写成

servlet/orderdishes_servlet

我们之前定义的url格式就要变成http:

//10.81.36.187:

8080/orderdishes/servlet/orderdishes_servlet了

四。

在MySQL中新建数据库db,表名为test(MySQl的密码为123--就是启动MySQL时需要输入的密码,这个是安装时就需要设置的)

namepassword

a123

b234

因为之前我们的查询语句是select*fromtestwherename="+"\""+name+"\",name="a"所以TextView中会显示

用户名:

a的账号密码为:

a123

--------------------------------以上我们只获取了单条数据,下面是多条的方法------------------------

复习了昨天学习的内容,然后开始修改源程序,目前进度是修改获取分类列表数据,发现一个问题,就是昨天在例子中返回的只是一条数据,可以正常显示,然后今天是返回多条数据,会出现以下情况:

据测试,servlet中执行以下语句

PrintWriterout=response.getWriter();

out.print(“a”);

out.print(“b”);

在返回的数据中通过

Stringresult=EntityUtils.toString(response.getEntity());

获得的结果是result=”ab”,这个结果是一次性的,意思就是执行一次就获得了这个结果,说明数据不是一条一条发送过来的

猜测的结果是:

servlet中是执行完所有out.print(“”);将数据组装完,放在response中然后在发送回去的。

所以这样我们就不能实现返回所有分类列表数据,想到的一种可能是在客户端,通过String[]Accept=result.split(",");分割的方法获得数据,不过这样感觉不好。

后来发现使用JSON可能是个不错的选择,然后就开始学习JSON的使用,经过试验,最后成功了.我们的方法就是在servlet类中,通过以下语句

[html]viewplaincopy

StringBuilderresponseResult=newStringBuilder();

ResultSetresult=state.executeQuery("select*fromtest");

response.setContentType("text/html;charset=UTF-8");

PrintWriterout=response.getWriter();

responseResult.append("[");

while(result.next()){

responseResult.append("{"+"\"SortName\":

"+result.getString("sortname")+"}"+",");//重点,下有解释

}

responseResult.deleteCharAt(responseResult.length()-1);//删除最后的”,”号

responseResult.append("]");

out.print(responseResult.toString());

也就是说,通过以上语句,将查询出的结果,组装成JSONArray类型,然后以String字符串型返回。

接着在客户端进行解析就可以(其中的result即是在数据请求时,通过以下语句获得的String字符串

[html]viewplaincopy

result=EntityUtils.toString(response.getEntity());//获取响应中的数据),

字符串转换成JSON数组,然后通过解析,获取对应的每条数据。

方法如下:

[html]viewplaincopy

ListmListDataForSort=newArrayList();

mJsonArray=newJSONArray(result);

for(inti=0;i

JSONObjectmJsonObject=(JSONObject)mJsonArray.opt(i);

Stringsortname=mJsonObject.getString("SortName");

DishInfoitem=newDishInfo();

item.setDishSort(sortname);

mListDataForSort.add(item);

}

 

当然这只是一种简单的JSON的使用,后续会加入图片的处理以及混合的JSONObject和JSONArray的数据解析。

注意:

responseResult.append("{"+"\"SortName\":

"+result.getString("sortname")+"}"+",");

如果要封装的数据是其他类型,比如byte[]和http:

//......类的,一定要这么写

responseResult.append("{"+"\"SortName\":

"+"\""+byte[]+"\""+"}"+",");

没错,需要加转义字符,为数据两边加上双引号"",这样就不会出现解析的时候提示非法字符的错误了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2