全球疫情简易查询系统开发博客(web端和app端)
一、题目
二、设计思想
1、购买并配置云服务器,然后将上周写好的web端进行一点修改即可
2、用Python爬取数据,并在云服务器上配置数据库的权限
3、在app的代码中加入网络配置,使其能够访问云服务器上的数据库
三、源程序代码
鉴于老师说过建立自己代码仓库对今后编程有好处,于是花了差不多两小时的时间看教程,终于成功地将代码已经发到GitHub上了,网址如下
web端:https://github.com/miyang185/Yang
app端:https://github.com/miyang185/WorldYiqingData
web端:
DBUtil.java(连接数据库代码)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Dao.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Yi.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Servlet
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
前台代码:
search.jsp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
liulan.jsp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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) 编辑 收藏 举报