Android通过jsp连接Oracle数据库 .docx
Android通过jsp连接Oracle数据库-实例/首先写一个jsp后台服务连接到Oracle数据库的实例myOral (此处只是测试,所以用 system身份连接到该实例)/然后再通过jsp把数据返回给Android手机客户端运行jsp代码之前必须导入Oracle数据库的jdbc驱动包(jar包),名字为:classes12.jar.这个包在Oracle的安装目录下可已/找到,在浏览器中打开jsp网页前必须保证Tomcat已经正确启动。/jsp取到的数据以xml格式展现在web页面中/Oracle数据库中的表如下:-intxjID卬HAMEKAGEPSEX|i:22J:二azhaoMun22nnalT?(002玄vamcrfeng21malexing triangle21nnale网Him min23malsOOfczhang ksi23mal9uucy2Qremal/jsp代码:html view plaincopyprint?1. <?xml version="1.0" encoding="utf-8"?>2.2. <% page import="java.util.*"%>4.3. <% page import="java.sql.*"%>6.4. <%page contentType="text/html;charset=gb2312"%>8.9.10.11. <%12.12. String path = request.getContextPath();14.13. String basePath = request.getScheme()+":/"+request.getServerName()+":"+r equest.getServerPort()+path+"/"16.14. %>18.19.20.15. <%22.16. try24.17. 26.18. Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();28.19. String url="jdbc:oracle:thin:10.88.5.117:1521:myOra1"30.31.user=33.String password="manager"34.35.Connection conn= DriverManager.getConnection(url,user,password);36.37.Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,R esultSet.CONCUR_UPDATABLE);38.39.String sql="select * from system.SAZHAOXUN"40.41.ResultSet rs=stmt.executeQuery(sql);42.43.44.45.StringstrID;46.47.StringstrNAME;48.49.StringstrAGE;50.51.StringstrSEX;52.53.54.55. %>56.57.<INFO>58.59.60.61. <%62.63.while(rs.next()64.67.strID=rs.getString("ID");68.69.strNAME=rs.getString("NAME");70.71.strAGE=rs.getString("AGE");72.73.strSEX=rs.getString("SEX");74.75.76.77.%>78.79.<TONGXIN081>80.81.<ID><%=strID%></ID>82.83.<NAME><%=strNAME%></NAME>84.85.<AGE><%=strAGE%></AGE>86.87.<SEX><%=strSEX%></SEX>88.89.</TONGXIN081>90.91.92.93.<% %>94.95.96.97.98.99.</INFO>102.103. <%104.104. if(rs!=null)106.105. 108.106. rs.close();110.107. 112.108. if(stmt!=null)114.109. 116.110. stmt.close();118.111. 120.112. if(conn!=null)122.113. 124.114. conn.close();126.115. 128.116. 130.117. catch(Exception e)132.118. 134.e.135.136.137. 138.139.140.138. %>下图为jsp后台取出数据的结果:_j local hostc?xnil veispnn-,'i.Ol encodinijtf-fl"1 ?> <1NFO>d:=ooi ns<AGE->22</GE><5EX>mnle</SEi<></TONGXIMflai>-<TOfJGXmO01><1DXJOJ <JD>=:Fv-ME :-vanqfenq :/N51E::.<AGE>21<AGE><5EX>malc<SEX><TOMGxihHJHl>-<T0NGXJNOS1><10003 <iD><M-MF >iogch angle < name >A也ay"纹<SEXm*sle</SEX><TONGXINOH1>-<T0MGXlwqsi><ID:lO04</0>方I i i hi rniK <J NAME a<AGE>23<AGt><=;f >:>male<SX5- </TOMGXINifll>-<TOWGX1W0S1>dr x»05 <io>小空I: >zhan q kni -/ NAMt: -<4GE>23cyaG£><SEX>maie<5EX><TONGX1NQ81>-<T0NGX3NQEl><ID ?O06!D><MAME >L ucy 亦凸 ME ><AQi >JO<AGE>=_重一-*!当jsp后台从Oracle数据库取到数据后就应该返回给Android,这样就实现了 Android客 户端间接获得Oracle中的数据Android客户端代码:1.main.xml(布 局文件):html view plaincopyprint?1. <?xml version="1.0" encoding="utf-8"?>2.2. <LinearLayout xmlns:android="4.3. android:orientation="vertical"6.4. android:layout_width="fill_parent"8.5. android:layout_height="fill_parent"10.6. >12.7. <Button14.8. android:id="+id/myButton"16.9. android:layout_width="wrap_content"18.10. android:layout_height="wrap_content"20.11. android:text="获取 Oracle 数据"22.12. />24.13. <TextView26.14. android:id="+id/myText"28.15. android:layout_width="fill_parent"30.16. android:layout_height="fill_parent32.17. />34.18. </LinearLayout>冈2. main.java (Activity):html view plaincopyprint?1. package com.AndroidLinkToJsp;2.2. import java.io.IOException;4.3. import java.io.StringReader;6.4. import javax.xml.parsers.SAXParserFactory;8.5. import org.apache.http.HttpResponse;10.6. import org.apache.http.client.ClientProtocolException;13. importorg.apache.http.client.methods.HttpGet;14.15. importorg.apache.http.impl.client.DefaultHttpClient;16.17. importorg.apache.http.util.EntityUtils;18.19. importorg.xml.sax.InputSource;20.21. importorg.xml.sax.XMLReader;22.23. importcom.sazhaoxun.AndroidLinkToJsp.R;24.25. importandroid.app.Activity;26.27. importandroid.os.Bundle;28.29. importandroid.view.View;30.31. importandroid.view.View.OnClickListener;32.33. importandroid.widget.Button;34.35. importandroid.widget.TextView;36.37.38.39. publicclass main extends Activity 40.41. private TextView myText;42.42. private Button myButton;44.43. 命名空间46.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.47. / private static final String urlStr="http:/10.88.5.225:8080/test/MyJsP.jsp”;/* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedlnstanceState);setContentView(R.layout.main);myText = (TextView)findViewByld(R.id.myText);myButton = (Button)findViewByld(R.id.myButton);myButton.setOnClickListener(new showButton();class showButton implements OnClickListenerOverridepublic void onClick(View v)/ TODO Auto-generated method stub81.System.out.println("开始获得数据");82.83.String uriAPI ="http:/10.88.5.225:8080/test/MyJsp.jsp"84.85./*建立HTTP Get联机*/86.87.HttpGet httpRequest = new HttpGet(uriAPI);88.89.try90.91.92.93./*发到 HTTP request*/94.95.HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);96.97./*若状态码为200 ok*/98.99.if(httpResponse.getStatusLine().getStatusCode() = 200)100.101.102.103./*取叨并应?串*/104.105.String strResult = EntityUtils.toString(httpResponse.getEntity();106.107./*?除?余?元*/108.109./strResult = eregi_replace("(rn|r|n|nr)","",strResult);110.111.try112.113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143SAXParserFactory factory=SAXParserFactory.newInstance() ;XMLReader reader=factory.newSAXParser().getXMLReader();reader.setContentHandler(new ContentHandler();reader.parse(new InputSource(new StringReader(strResult );catch (Exception e) e.printStackTrace();System.out.println("成功获得数据");myText.setText(strResult.toString();elsemyText.setText("Error Response: "+httpResponse.getStatusLine().toString();144.145. 146.146. 148.147. catch (ClientProtocolException e)150.148. 152.149. / mTextView1.setText(e.getMessage().toString();154.150. e.printStackTrace();156.151. 158.152. catch (IOException e)160.153. 162.154. / mTextView1.setText(e.getMessage().toString();164.155. e.printStackTrace();166.156. 168.157. catch (Exception e)170.158. 172.159. /mTextView1.setText(e.getMessage().toString();174.160. e.printStackTrace();176.161. 178.179.180.162. /*182.163. *创建一个SAXParserFactory,再用这个工厂来创建一个XMLReader, 以此来读取XML184.164. */186.165. /SAXParserFactory factory = SAXParserFactory.newInstance();188.166. /XMLReader reader = factory.newSAXParser().getXMLReader();190.167. /192.168. /为XMLReader设置内容处理器,MyContentHandler()为具体处理的类194.169. /reader.setContentHandler(new ContentHandler();196.170. /开始解析文件198.171. /reader.parse(new InputSource(new StringReader(strResult);200.172. /202.173. 204.205.206.174. 208.209.210.175. 3 . ContentHandler.java:html view plaincopyprint?1.package com.AndroidLinkToJsp;2.3.4.5.importorg.xml.sax.Attributes;6.7.importorg.xml.sax.SAXException;8.9.importorg.xml.sax.helpers.DefaultHandler;10.11.12.13.publicclass ContentHandler extends DefaultHandler14.15.String ID,NAME,AGE,SEX;16.17.String tagName;18.19.20.21./*22.23.*开始解析xml24.25.* throws SAXException26.27.*/28.29.public void startDocument() throws SAXException30.31.System.out.println("begin");32.33.34.35.36.37./*38.39.*结束解析xml40.41.* throws SAXException42.*/43.44.45.public void endDocument() throws SAXException46.47.System.out.println("end");48.49.50.51.52.53./*54.55.*开始解析元素属性56.57.59.* param namespaceURI命名空间,防止命名重复60.不带前缀的名字带前缀的名字代表标签里所有的属性61. * param localName62.62. * param qName64.63. * param attr66.67.* throws SAXException 68.69. */70.70. public void startElement(String namespaceURI, String localName,72.71. String qName, Attributes attr) throws SAXException74.72. /System.out.println("qName>"+qName);/调试用76.73. tagName = localName;/把当前正在解析的无前缀的名字传给tagName78.74. if(localName.equals("TONGXIN081")80.75. for (int i = 0; i < attr.getLength(); i+) 82.76. System.out.println(attr.getLocalName(i) + "=" + attr.getValue(i);/得到第i个属性的名字和值84.77. 86.78. 88.89.90.91.93.94.95./*96.97.*结束元素解析98.99.100.101.paramnamespaceURI102.103.paramlocalName104.105.paramqName106.107.throws SAXException108.109.*/110.111.public void endElement(String namespaceURI, String localName, StrinqName) throws SAXException112.113.在worker标签解析完之后,会打印出所有得到的数据114.115./tagName =""116.117.if(localName.equals("TONGXIN081");118.119.this.printout();120.121.122.123./*124.125.*具体解析标签里的内容127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.paramparamparamchstartlength所有读取到的内容,都会放到char类型的数组里读取的内容是从char数组的哪一位开始从start开始,一共有多长的内容throws SAXException*/public void characters(char ch, int start, int length)throws SAXExceptionif (tagName.equals("ID")ID = new String(ch, start, length);else if (tagName.equals("NAME")NAME = new String(ch, start, length);else ifAGEelse ifSEX(tagName.equals("AGE")=new String(ch, start, length);(tagName.equals("SEX")=new String(ch, start, length);162.163. private void printout。164.164. 166.165. System.out.print("ID:");168.166. System.out.println(ID);170.167. System.out.print("NAME:")172.168. System.out.println(NAME);174.169. System.out.print("AGE:");176.170. System.out.println(AGE);178.171. System.out.print("SEX:");180.172. System.out.println(SEX);182.173. System.out.println();184.174. 186.175. 冈/最后在Manifest文件中还必须声明访问英特网的权限(如下图所示):vers011=1.0,r encodirjg=rr?><ncariif eat xnLLns : sndroid= "http:/schern=s. android. aora/apk/res/androidn p己ckage= rfaoiR. s己 zhaoxLin. Znd2?oidLinA ToJsp" android: ver si onCode=MIrrsniroid: veisidTitJdjre=pri. 0"><ses-sdk d n dr old: ir.inS dkVe r s 1 on=r, 7 " /><applicatlon androld: icon= "waJble/iconrr androld: latiEl=rri?string/app_nanie"> <activity androld:ndic.e= ncoze.ZndroidLinkToJsp.zc曰in*androld: ldbel=rri?string/app_nnzerr> <intent-filter><action android:ridir.e= Android. intent. action. AHZN,r /><catecQr' d ndr o i d: n dir.e= "a ndroi d. in ten C. Sq tegory.UNCnEP,r />k!/intent:-filrer></activity> F、pp3_zLc:at:iciii><jise5-sdk: dndrold:minSdkVersion=r,7p,/><ses-perirJ.sslcii androld:ndir.e="己nd2?oid.pezrission. ZNTERTJETM/></maziif est>下图为Android取到jsp后台xml格式的数据后返回给Android客户端ok,我们在Android手机上可以看到远程数据库的数据。这个Demo就是Android通过jsp 连接远程Oracle数据库。