文章目录
- 一、配置环境
- 二、服务器搭建
- 三、android客户端搭建
- 三、获取json数据
- 四、在界面中显示数据
- 五、使用Gson解析json
- 六、测试
一、配置环境
- 服务器:Apache Tomcat v9.0
- 编译环境:服务器端:Eclipse , android 客户端: Android Studio
- 调用jar包:
okhttp3.5 //Http协议访问网络
Gson-2.8.5 //封装,解析json数据
mysql-connector-java-5.1.37-bin //用于连接Mysql数据库
二、服务器搭建
- 创建数据库db_user和数据表grade,其结构如下。向数据表grade中插入一些数据。
- Eclipse新建动态Web项目(Dynamic Web Project)AndroidToServet,项目结构如下图:
其中Grade.java为Bean类,属性和数据库属性名一致。
public class Grade {
private String id;
private String name;
private String sex;
private float c;
private float java;
private float math;
//...省略各个属性的setter和getter方法
}
- 创建数据库工具类MyDataBase.java。在lib文件夹中添加Gson和jdbc依赖包。
工具类中只写了查询方法,其他的添加删除和修改方法暂时用不到,以后再添加。
package DBUtils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import Bean.Grade;
public class MyDataBase {
public static Connection connection;
public static Statement statement;
public static ResultSet resultSet;
//建立数据库的连接
public static void GetConnection() {
if (connection==null) {
try {
Class.forName("com.mysql.jdbc.Driver");//数据库驱动程序的加载
//取得数据库连接
connection=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db_user",
"root", "1111");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("数据库连接成功~~~~~~~~~~~~");
}
}
public static String find_all() {//查询
List<Grade> gradelist=new ArrayList<Grade>();
try {
String sql="select * from grade";
statement=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);//是指针可以随机定位
resultSet=statement.executeQuery(sql);
while (resultSet.next()) {
Grade grade=new Grade();
grade.setId(resultSet.getString("id"));
grade.setName(resultSet.getString("name"));
grade.setSex(resultSet.getString("sex"));
grade.setC(resultSet.getFloat("c"));
grade.setJava(resultSet.getFloat("java"));
grade.setMath(resultSet.getFloat("math"));
gradelist.add(grade);
}
} catch (Exception e) {
e.printStackTrace();
}
Gson gson=new Gson();
String str=gson.toJson(gradelist);
return str;
}
public static ResultSet findById(String id) {
try {
statement=connection.createStatement();
String sql="select * from grade where id="+id;
resultSet=statement.executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return resultSet;
}
//关闭数据库资源
public static void close_res() {
try {
connection.close();
statement.close();
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- TestServlet.java
用来实现功能的服务器文件,此为Servlet类,使用注解的方式@WebServlet("/mytestServlet")
进行路径映射。类中会自动生成doGet和doPost两种方法,我们对doGet和doPost方法中的代码进行删改和添加
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import DBUtils.MyDataBase;
@WebServlet("/mytestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
MyDataBase.GetConnection();
String str=MyDataBase.find_all();
PrintWriter out=response.getWriter();
out.println(str);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 点击运行按钮测试程序,结果如图,已成功搭建。
6. 导出项目war包,然后部署到Tomcat服务器中。
7.关闭Eclipse。打开Tomcat服务器和MySQL服务,在浏览器地址栏中输入项目的servlet地址测试,成功运行如图所示。
三、android客户端搭建
1.修改布局。布局很简单,只有一个按钮和一个Listview,点击按钮时通过服务器的sevlet连接数据库查询并转换为json数据返回。如图所示。
2.创建列表适配器MyBaseAdapter
public class MyBaseAdapter extends BaseAdapter {
private LayoutInflater layoutInflater;
private List<GradeBean> gradeBeanList;
public MyBaseAdapter(Context context, List<GradeBean> gradeBeanList) {
this.layoutInflater = LayoutInflater.from(context);
this.gradeBeanList = gradeBeanList;
}
@Override
public int getCount() {
return gradeBeanList.size() > 0 ? gradeBeanList.size() : 0;
}
@Override
public Object getItem(int i) {
return gradeBeanList.size() > 0 ? gradeBeanList.get(i) : 0;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder holder;
if (convertView==null)
{
convertView=layoutInflater.inflate(R.layout.grade_item, null);
holder=new ViewHolder(convertView);
convertView.setTag(holder);
}else {
holder= (ViewHolder) convertView.getTag();
}
GradeBean grade= (GradeBean) getItem(i);
holder.stuid.setText("学号:"+grade.getId());
holder.name.setText(" || 姓名:"+grade.getName());
holder.sex.setText(" || 性别:"+grade.getSex());
holder.c.setText("C语言:"+String.valueOf(grade.getC()));
holder.java.setText(" || Java:"+String.valueOf(grade.getJava()));
holder.math.setText(" || 数学:"+String.valueOf(grade.getMath()));
return convertView;
}
public static class ViewHolder {
public View rootView;
public TextView stuid;
public TextView name;
public TextView sex;
public TextView c;
public TextView java;
public TextView math;
public ViewHolder(View rootView) {
this.rootView = rootView;
this.stuid = (TextView) rootView.findViewById(R.id.stuid);
this.name = (TextView) rootView.findViewById(R.id.name);
this.sex = (TextView) rootView.findViewById(R.id.sex);
this.c = (TextView) rootView.findViewById(R.id.c);
this.java = (TextView) rootView.findViewById(R.id.java);
this.math = (TextView) rootView.findViewById(R.id.math);
}
}
}
3.添加OkHttp和Gson依赖。
通过点击按钮获取服务器中的数据,用到了okhttp框架。其中,path为服务器Servlet的地址,如果本机的地址为:192.168.1.9,则private String path="http://192.168.1.9:8080/AndroidToServer/mytestServlet";
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_get:
OkHttpClient okHttp=new OkHttpClient();
Request request=new Request.Builder().url(path).build();
Call call=okHttp.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) { }
@Override
public void onResponse(Call call, Response response) throws IOException {
String str=response.body().string();
Message msg=new Message();
msg.what=0;
msg.obj=str;
mhandler.sendMessage(msg);
}
});
break;
}
}
在主线程中,handler处理message,使用Gson解析成Bean列表,并显示在ListView控件中。
mhandler = new Handler() {
@Override
public void dispatchMessage(@NonNull Message msg) {
super.dispatchMessage(msg);
switch (msg.what) {
case 0:
if (msg.obj != null) {
//解析数组
parseJsonArray((String)msg.obj);
//创建适配器实例
MyBaseAdapter adapter=new MyBaseAdapter(MainActivity.this,gradeBeanList);
listview.setAdapter(adapter);
}
break;
}
}
};
添加Gson依赖,使用Gson解析数组,数组中的元素为对象。
private void parseJsonArray(String obj) {//解析数组
Gson gson = new Gson();
Type type=new TypeToken<List<GradeBean>>(){}.getType();
gradeBeanList=gson.fromJson(obj,type);
}
点击按钮,成功获取服务器中MySQL数据库中的数据,结果如图