使用软件:MyEclipse 2017 CI、Android Studio、Navicat for MySQL(数据库)
在 Navicat for MySQL 软件中:
1、数据库建表
如 users 表,含id,nickname,age等列名
在MyEclipse 2017 CI软件中:
2、创建User.java类
User.java类中包含id,nickname,age等字段、不带参数的默认构造方法User()、带有参数的构造方法User(String id, String nickName)、各个字段的getter和setter方法
package com.test.model;
public class User {
private String id;
private String nickName;
private String age;
public User() {}
public User(String id, String nickName, String age) {
super();
this.id = id;
this.nickName = nickName;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
3、创建UserDao.java类
UserDao.java类中包含默认构造方法UserDao();
add(User user)、update(User user)、findById(String id)、findAll()等对数据库操作的方法(增删改查),方法中包含sql语句和User.java类中的getter和setter方法,返回 User 或 List<User>
package com.test.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.test.common.DbObject;
import com.test.model.User;
public class UserDao {
public UserDao() {}
public User add(User user){
String sql = "insert into users (nickName,id,age) " + " values(?,?,?)";
DbObject.executeUpdate(sql, user.getNickName(), user.getId(),user.getAge());
return user;
}
public List<User> findAll(){
ResultSet rs = null;
String sql = "select * from users";
ArrayList<User> list = new ArrayList<User>();
User user = null;
try {
rs = DbObject.executeQuery(sql);
while (rs.next()){
user = new User();
user.setNickName(rs.getString("nickName"));
user.setAge(rs.getString("age"));
user.setId(rs.getString("id"));
list.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
DbObject.close(null, null, rs);
}
return list;
}
public User findById(String id){
ResultSet rs = null;
String sql = "select * from users where " + "id=?";
User user = null;
try {
rs = DbObject.executeQuery(sql, id);
if (rs.next()){
user = new User();
user.setNickName(rs.getString("nickName"));
user.setAge(rs.getString("age"));
user.setId(rs.getString("id"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
DbObject.close(null, null, rs);
}
return user;
}
}
4、创建UserService.java类
UserService.java类中包含默认构造方法UserService()和对UserDao.java类中的findById(String id)、findAll()等方法的调用
package com.test.service;
import java.util.List;
import com.test.dao.UserDao;
import com.test.model.User;
public class UserService {
public UserService() {}
public User findById(String id){
UserDao dao = new UserDao();
return dao.findById(id);
}
public List<User> findAll(){
UserDao dao = new UserDao();
return dao.findAll();
}
}
5、创建SearchUserServlet.java类
SearchUserServlet.java类包含路径:@WebServlet("/searchuser") 和 doGet、doPost方法;
doGet 方法中包括获取参数,调用 UserService.java 类中的方法,获取要查找的 User 或 List<User>, 将 User 类型转化为 JSON 类型,最后把 JSON 格式写到服务端流中,作为响应response
package com.test.controller;
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 com.test.model.User;
import com.test.service.UserService;
import net.sf.json.JSONObject;
@WebServlet("/searchuser")
public class SearchUserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取搜索关键字
String userId = request.getParameter("searchKeyword");
userId = new String(userId.getBytes("iso8859-1"), "utf-8");
// 使用UserService查找用户
UserService service = new UserService();
User user = service.findById(userId);
JSONObject jsonObject=new JSONObject();
//把User类型转化为JSON类型:JSON序列化
jsonObject.put("user",user);
//设置服务器端编码
response.setCharacterEncoding("utf-8");
//把JSON格式写到服务端流中
PrintWriter printWriter = response.getWriter();
printWriter.write(jsonObject.toString());
System.out.print("用户信息 JSON格式输出:"+jsonObject.toString());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 这里可以处理POST请求,如果不需要可以留空
}
}
在Android Studio软件中:
6、创建 SearchUserActivity.java 类
在 SearchUserActivity.java 类的onCreate方法中,调用方法 sendGetRequest(searchKeyword); 发送GET请求获取用户信息
在sendGetRequest(searchKeyword)方法中创建新线程执行网络请求(使用OkHttp发送GET请求、解析JSON响应、更新UI、处理用户不存在的情况)
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import com.example.test.user.util.OkHttpUtil;
public class SearchUserActivity extends AppCompatActivity {
private static final String TAG = "SearchUserActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_searchuser);
// 获取首页搜索框中传递过来的搜索关键字
String searchKeyword = getIntent().getStringExtra("search_keyword");
// 发送GET请求获取攻略详情
sendGetRequest(searchKeyword);
// 获取关注按钮
Button guanzhuButton = findViewById(R.id.guanzhu);
// 设置按钮点击事件监听器
guanzhuButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 执行OkHttpUtil调用
sendGuanzhuRequest(searchKeyword);
}
});
}
// 更新用户关注状态按钮文本
private void updateGuanzhuButton(String guanzhu) {
Button guanzhuButton = findViewById(R.id.guanzhu);
if (guanzhu.equals("true")) {
guanzhuButton.setText("已关注");
} else {
guanzhuButton.setText("关注");
}
}
// 发送关注请求
private void sendGuanzhuRequest(final String searchKeyword) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// 发送OkHttp请求到 "/Test/guanzhu"
String response = OkHttpUtil.get("/Test/guanzhu?searchKeyword=" + searchKeyword);
Log.d(TAG, "用户关注Response: " + response);
// 解析响应的JSON数据
if (!response.equals("{}")) {
JSONObject jsonObject = new JSONObject(response);
JSONObject user = jsonObject.getJSONObject("user");
// 获取关注状态
String guanzhu = user.getString("guanzhu");
// 在UI线程中更新关注按钮文本
runOnUiThread(new Runnable() {
@Override
public void run() {
updateGuanzhuButton(guanzhu);
}
});
} else {
// 用户不存在,弹出对话框提示用户
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(SearchUserActivity.this);
builder.setTitle("提示");
builder.setMessage("该用户不存在,请重新输入");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 用户点击确定按钮后的操作,例如清空输入框等
}
});
builder.show();
}
});
}
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}
}).start();
}
private void sendGetRequest(final String searchKeyword) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String response = OkHttpUtil.get("/Test/searchuser?searchKeyword=" + searchKeyword);
Log.d(TAG, "用户信息Response: " + response);
// 解析响应的JSON数据
if (!response.equals("{}")) {
JSONObject jsonObject = new JSONObject(response);
JSONObject user = jsonObject.getJSONObject("user");
// 从JSON数据中提取信息
String idCard = user.getString("id");
// 获取关注状态
String guanzhu = user.getString("guanzhu");
Log.d(TAG,"run3:"+id);
// 在UI线程中更新UI显示
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在此将id等信息显示在相应的视图上
TextView TextView1 = findViewById(R.id.user_id_textView);
TextView1.setText(idCard);
updateGuanzhuButton(guanzhu);
}
});
} else {
// 用户不存在,弹出对话框提示用户
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(SearchUserActivity.this);
builder.setTitle("提示");
builder.setMessage("该用户不存在,请重新输入");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 用户点击确定按钮后的操作,例如清空输入框等
}
});
builder.show();
}
});
}
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}
}).start();
}
}
String response = OkHttpUtil.get("/Test/searchuser?searchKeyword=" + searchKeyword);
中的 Test 是 MyEclipse 2017 CI 软件中创建的项目名
知识点:
Activity 类中的onCreate 方法:
在Android开发中,onCreate 是一个生命周期方法,它属于 Activity 类。当一个 Activity 被首次创建时,onCreate 方法会被系统调用。这是初始化 Activity 所必需的设置和视图(UI)组件的地方。
onCreate 方法通常包含以下操作:
- 设置布局:通过调用 setContentView 方法来设置 Activity 的用户界面。这通常是一个XML布局文件,它定义了 Activity 的外观。
- 初始化组件:使用 findViewById 来查找并初始化UI组件,如按钮、文本框等。
- 设置监听器:为UI组件设置事件监听器,以响应用户交互,如点击事件。
- 加载数据:如果 Activity 需要显示数据,可能会在这里进行数据的加载和初始化。