关于android通过servlet访问MySql数据库的问题.docx
- 文档编号:24211359
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:16
- 大小:19.12KB
关于android通过servlet访问MySql数据库的问题.docx
《关于android通过servlet访问MySql数据库的问题.docx》由会员分享,可在线阅读,更多相关《关于android通过servlet访问MySql数据库的问题.docx(16页珍藏版)》请在冰豆网上搜索。
关于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一个,然后加入以下语句 如此,我们之前定义的url格式就是http: //10.81.36.187: 8080/orderdishes/orderdishes_servlet,orderdishes是指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 List 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[]+"\""+"}"+","); 没错,需要加转义字符,为数据两边加上双引号"",这样就不会出现解析的时候提示非法字符的错误了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 android 通过 servlet 访问 MySql 数据库 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)