Yang

全球疫情简易查询系统开发博客(web端和app端)

一、题目

 

二、设计思想

1、购买并配置云服务器,然后将上周写好的web端进行一点修改即可

2、用Python爬取数据,并在云服务器上配置数据库的权限

3、在app的代码中加入网络配置,使其能够访问云服务器上的数据库

 

三、源程序代码

鉴于老师说过建立自己代码仓库对今后编程有好处,于是花了差不多两小时的时间看教程,终于成功地将代码已经发到GitHub上了,网址如下

web端:https://github.com/miyang185/Yang

app端:https://github.com/miyang185/WorldYiqingData

web端:

 

DBUtil.java(连接数据库代码)

 

View Code

 

Dao.java

 

View Code

 

Yi.java

 

View Code

 

Servlet

 

View Code

 

前台代码:

 

search.jsp

 

View Code

 

liulan.jsp

 

View Code

 

 

app端:

DBOpenHelper.java

 

package com.androidlearing.getworlddata;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class DBOpenHelper {
    //private static String[] TB_NAME=new String[]{"Monday","Tuesday"};
    private static String driver = "com.mysql.jdbc.Driver";
    private static String url = "jdbc:mysql://47.98.255.190:3306/newyiqing?serverTimezone=UTC";
    private static String user = "root";
    private static String password = "123";

    public static Connection getConn(){
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = (Connection) DriverManager.getConnection(url,user,password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    public static List<WorldData>  searchDataByCountry(String condition,String country_name){
        List<WorldData> list = new ArrayList<>();
        Connection connection = getConn();
        String sql = "";
        //System.out.println(condition);
        if(condition.equals("国家")){
            sql = "select * from worlddata where countryname like ?";
        }
        if(condition.equals("时间")){
            sql = "select * from worlddata where lastUpdateTime like ?";
        }
        System.out.println(country_name);
        if(connection !=null){
            try {
                PreparedStatement ps = connection.prepareStatement(sql);
                if(ps!=null){
                    ps.setString(1,"%"+country_name+"%");
                    ResultSet rs = ps.executeQuery();
                    if(rs!=null){
                        while(rs.next()){
                            WorldData worldData = new WorldData();
                            worldData.setId(rs.getInt("id"));
                            worldData.setCountryname(rs.getString("countryname"));
                            worldData.setConfirmed(rs.getString("confirmed"));
                            worldData.setSuspected(rs.getString("suspected"));
                            worldData.setDead(rs.getString("dead"));
                            worldData.setHealed(rs.getString("healed"));
                            worldData.setLastUpdateTime(rs.getString("lastUpdateTime"));
                            list.add(worldData);
                        }
                        connection.close();
                        ps.close();
                        return list;
                    }else{
                        return null;
                    }
                }else{
                    return null;
                }
            } catch (SQLException e) {
                e.printStackTrace();
                return null;
            }
        }else{
            return null;
        }

    }
}

 

MainActivity.java

package com.androidlearing.getworlddata;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.icu.lang.UCharacter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private Button bt_send;
    private EditText et_content;
    private static final int TEST_USER_SELECT = 1;
    private String content;
    private Spinner conditionSpinner;
    private String condition;
    private ListView lv;
    String[] strs = new String[]{};
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg){

            switch(msg.what){
                case TEST_USER_SELECT:
                    String s = (String)msg.obj;
                    //System.out.println("***********");
                    // System.out.println("***********");
                    //System.out.println("data:"+s);
                    strs = s.split("  ");
                    lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,strs));
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_send = findViewById(R.id.bt_send);
        et_content = findViewById(R.id.et_content);
        et_content.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                content = s.toString();
            }
        });
        conditionSpinner = findViewById(R.id.condition);
        final String [] data = {"国家","时间"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,data);
        conditionSpinner.setAdapter(adapter);
        conditionSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //取得选中的值
                condition = data[position];
                //设置显示当前选择的项
                parent.setVisibility(View.VISIBLE);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        System.out.println(condition);
        lv = findViewById(R.id.lv);

    }
    @Override
    protected void onStart(){
        super.onStart();
        bt_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //执行查询操作
                //连接数据库进行操作需要在主线程操作
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        List<WorldData> list = DBOpenHelper.searchDataByCountry(condition,content);
                        Message message = mHandler.obtainMessage();
                        String s = "";
                        for(int i=0;i<list.size();i++){
                            s += "时间:"+list.get(i).getLastUpdateTime()+" ";
                            s += list.get(i).getCountryname()+"确诊人数为:  ";
                            s += list.get(i).getConfirmed()+"  ";
                        }
                        message.what = TEST_USER_SELECT;
                        message.obj = s;
                        mHandler.sendMessage(message);
                    }
                }).start();
            }
        });
    }
}
package com.androidlearing.getworlddata;

public class WorldData {
    private int id;
    private String countryname;
    private String confirmed;
    private String suspected;
    private String dead;
    private String healed;
    private String lastUpdateTime;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCountryname() {
        return countryname;
    }

    public void setCountryname(String countryname) {
        this.countryname = countryname;
    }

    public String getConfirmed() {
        return confirmed;
    }

    public void setConfirmed(String confirmed) {
        this.confirmed = confirmed;
    }

    public String getSuspected() {
        return suspected;
    }

    public void setSuspected(String suspected) {
        this.suspected = suspected;
    }

    public String getDead() {
        return dead;
    }

    public void setDead(String dead) {
        this.dead = dead;
    }

    public String getHealed() {
        return healed;
    }

    public void setHealed(String healed) {
        this.healed = healed;
    }

    public String getLastUpdateTime() {
        return lastUpdateTime;
    }

    public void setLastUpdateTime(String lastUpdateTime) {
        this.lastUpdateTime = lastUpdateTime;
    }
}

 

 

四、运行结果截图

web端:

 

 

 

 

 

 

app端:

 

 

 

 

五、出现的问题及解决过程

1、在把web代码部署上云服务器上后,运行jsp可以,但从jsp跳转到Servlet报了这样的错

 

 

 

 

 

 

 一开始我执着于实例化Servlet异常这个错误,看了一大堆教程并且改了一大堆代码,结果还是报这个错

后来我试试解决第二个错误,结果发现是云服务器的jdk版本低于本机的jdk版本,本机jdk编译的.class文件

无法被云服务器jdk编译,即高版本jdk编译的文件无法被低版本jdk所编译。后来本机上的jdk换成了和云服务器

上的jdk一样,就能运行了

 

2、开发app完成后,无法访问云服务器数据库

我一开始以为云服务器上的数据库可能没有配置好,后来我通过测试代码,发现云服务器上的数据库是可以用的

我上网查找教程,原来是我没有打开云服务器上的数据库的权限,于是我通过网上教程打开数据库的权限,并且在

云服务器上配置了端口号,最终解决了这个问题

 

3、开发app完成后,云服务器上的数据库可以访问,但app不显示查询结果

这个原因我找了好久,最终才发现原来是我的mysql云服务器上的数据库数据库版本过高,

而Android Studio无法使用8.0以上数据库架包,最后换了一个低版本数据库架包,完美解决了

这个问题

 

六、预估和实际时间记录日志

预估时间记录日志

 

PSP2.1阶段时间
Planning 计划 20h
- Estimate 估计这个任务需要多少时间 20h
Development 开发  
- Analysis 需求分析 3h
- Coding Standard 代码规范 2h
- Design 具体设计 3h
- Coding 具体编码 10h
- Test

测试

2h

- Count 总计 20h

 实际时间记录日志

 

PSP2.1阶段时间
Development 开发  
- Analysis 需求分析 2h
- Coding Standard 代码规范 2h
- Design 具体设计 3h
- Coding 具体编码 7h
- Test

测试

2h
- Count 总计 16h

posted on 2020-03-21 20:58  yangliuliu  阅读(663)  评论(0编辑  收藏  举报

导航