Android端通过http访问web端servlet获取数据


  关于wjm的这次作业,当我发现我必须要写APP的时候,我的心是拔凉拔凉的。我疯狂地查资料查博客,本想通过开通mysql远程连接,andriod直接通过pc的ip地址访问mysql,也就是android直连mysql。无奈android开发平台是基于Android Studio的,其不可导入mysqk的jdbc.jar包,出现如Android Studio已有sql资源包,不可再导入此类jar包的错误。查找了半天也没找出解决的办法。讲道理我假期还是有认真学过一点Android,但是这个确实是搞了半天都没能实现啊。

  好在这时候发现可以通过一种基于servlet为服务器的中转实现方式,其主要的思路为:通过servlet搭建的服务器将mysql中需要的数据取出来发布在以tomcat为支持的网页上,android端直接访问该网页,将网页中的数据全部取出。然后第二天就停了一天的电,晚上7点才来电,好在2小时左右就解决了。下面直接上代码,有问题请自行查阅相关资料或在博客下方留言(我看到了会回复的)。

Android端MainActivity

 1 package com.example.baiducs;  2  3 import androidx.appcompat.app.AppCompatActivity;  4  5 import android.os.Bundle;  6 import android.util.Log;  7 import android.view.View;  8 import android.widget.Button;  9 import android.widget.EditText;  10 import android.widget.TextView;  11  12 import java.io.BufferedInputStream;  13 import java.io.BufferedReader;  14 import java.io.IOException;  15 import java.io.InputStream;  16 import java.io.InputStreamReader;  17 import java.io.Reader;  18 import java.net.HttpURLConnection;  19 import java.net.MalformedURLException;  20 import java.net.ProtocolException;  21 import java.net.URL;  22  23 public class MainActivity extends AppCompatActivity {  24 private TextView textView;  25  @Override  26 protected void onCreate(Bundle savedInstanceState) {  27 super.onCreate(savedInstanceState);  28  setContentView(R.layout.activity_main);  29 findViewById(R.id.send_request).setOnClickListener(new View.OnClickListener() {  30  @Override  31 public void onClick(View v) {  32  send();  33  }  34  });  35  36 textView = (TextView) findViewById(R.id.response_data);  37  }  38  39 private void send() {  40 //开启线程,发送请求  41 new Thread(new Runnable() {  42  @Override  43 public void run() {  44 HttpURLConnection connection = null;  45 BufferedReader reader = null;  46 try {  47 EditText editText =(EditText)findViewById(R.id.editText);  48 String timeend = editText.getText().toString();  49 URL url = new URL("http://10.0.2.2:8080/ydyq/dengluServlet?timeend="+timeend);  50 //URL url = new URL("https://www.baidu.com/");  51 connection = (HttpURLConnection) url.openConnection();  52 //设置请求方法  53 connection.setRequestMethod("GET");  54 //设置连接超时时间(毫秒)  55 connection.setConnectTimeout(5000);  56 //设置读取超时时间(毫秒)  57 connection.setReadTimeout(5000);  58  59 //返回输入流  60 InputStream in = connection.getInputStream();  61  62 //读取输入流  63 reader = new BufferedReader(new InputStreamReader(in));  64 StringBuilder result = new StringBuilder();  65  String line;  66 while ((line = reader.readLine()) != null) {  67  result.append(line);  68  }  69  show(result.toString());  70 } catch (MalformedURLException e) {  71  e.printStackTrace();  72 } catch (ProtocolException e) {  73  e.printStackTrace();  74 } catch (IOException e) {  75  e.printStackTrace();  76 } finally {  77 if (reader != null) {  78 try {  79  reader.close();  80 } catch (IOException e) {  81  e.printStackTrace();  82  }  83  }  84 if (connection != null) {//关闭连接  85  connection.disconnect();  86  }  87  }  88  }  89  }).start();  90  }  91  92 private void show(final String result) {  93 runOnUiThread(new Runnable() {  94  @Override  95 public void run() {  96  textView.setText(result);  97  }  98  });  99  } 100 }
MainActivity

activity_main.xml

 1 <?xml version="1.0" encoding="utf-8"?>  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3  android:id="@+id/activity_main"  4  android:layout_width="match_parent"  5  android:layout_height="match_parent"  6  android:orientation="vertical">  7  8 <EditText  9 android:id="@+id/editText" 10  android:layout_width="match_parent" 11  android:layout_height="wrap_content" 12  android:ems="10" 13  android:inputType="textPersonName" 14  android:text="" /> 15 16 <Button 17 android:id="@+id/send_request" 18  android:layout_width="match_parent" 19  android:layout_height="wrap_content" 20  android:text="点击查询" 21 /> 22 23 <!--带滚动条的视图--> 24 <ScrollView 25 android:layout_width="match_parent" 26  android:layout_height="match_parent"> 27 28 <!--响应数据--> 29 <TextView 30 android:id="@+id/response_data" 31  android:layout_width="match_parent" 32  android:layout_height="wrap_content" 33 /> 34 35 </ScrollView> 36 37 38 </LinearLayout>
activity_main.xml

AndroidManifest.xml

 1 <?xml version="1.0" encoding="utf-8"?>  2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  3  package="com.example.baiducs">  4 <uses-permission android:name="android.permission.INTERNET"/>  5 <application  6 android:usesCleartextTraffic="true"  7  android:allowBackup="true"  8  android:icon="@mipmap/ic_launcher"  9  android:label="@string/app_name" 10  android:roundIcon="@mipmap/ic_launcher_round" 11  android:supportsRtl="true" 12  android:theme="@style/AppTheme"> 13 <activity android:name=".MainActivity"> 14 <intent-filter> 15 <action android:name="android.intent.action.MAIN" /> 16 17 <category android:name="android.intent.category.LAUNCHER" /> 18 </intent-filter> 19 </activity> 20 </application> 21 22 </manifest>
AndroidManifest.xml

下面是服务器端

web结构

 

 这里主要就是一个dengluServlet调用方法查询数据库返回给Android端结果,上述MainActivity通过http请求访问到dengluServlet,下面是dengluServlet的代码,web端其余代码不在此给出,有需要的请留言。

 1 package com.jdbc.jss;  2  3 import java.io.BufferedReader;  4 import java.io.IOException;  5 import java.io.InputStreamReader;  6 import java.io.PrintWriter;  7 import java.util.ArrayList;  8 import java.util.List;  9 10 import javax.servlet.ServletException; 11 import javax.servlet.ServletInputStream; 12 import javax.servlet.annotation.WebServlet; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 17 import com.jdbc.bean.Yiqing; 18 import com.jdbc.dao.yiqidao; 19 @WebServlet(name = "dengluServlet",urlPatterns = "/dengluServlet") 20 public class dengluServlet extends HttpServlet { 21 22 23 private static final long serialVersionUID = 1L; 24 public dengluServlet() { 25 super(); 26  } 27 28  @Override 29 protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { 30 response.setContentType("text/html;charset=utf-8"); 31 request.setCharacterEncoding("utf-8"); 32 response.setCharacterEncoding("utf-8"); 33 PrintWriter out = response.getWriter(); 34 String timeend = request.getParameter("timeend"); 35  System.out.println(timeend); 36 //按时间查询 37 //String list = yiqidao.findss(timeend); 38 ArrayList<String> list = new ArrayList<String>(); 39 list = yiqidao.findss(timeend); 40  System.out.println(list); 41  out.write(list.toString()); 42  out.flush(); 43  out.close(); 44  } 45  @Override 46 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 47 // TODO Auto-generated method stub 48  doGet(request, response); 49 50  } 51 }
dengluServlet

以上内容我在实现时出现过各种问题同时我也参考了许多博客,这里列出主要的几份博客,希望能解决大家实现过程中出现问题

https://blog.csdn.net/snadijssajskkj/article/details/50554903

https://blog.csdn.net/zfdabc_ok/article/details/98055166

https://blog.csdn.net/zhao_zi_ming_lc/article/details/78302601

https://www.jianshu.com/p/5eee1ef02700

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM