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 }
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>
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>
下面是服务器端
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 }
以上内容我在实现时出现过各种问题同时我也参考了许多博客,这里列出主要的几份博客,希望能解决大家实现过程中出现问题
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