Android网络编程之一个Android登录系统模块的实现(服务器端)
该模块主要实现android客户端输入用户名与密码后,通过Post请求获得服务器端servlet的响应,从而实现下一步的操作,本篇先介绍服务器端的编程与数据库的一些表设置。
通信流程为 : Andriod客户端 ---> Web服务器端(Tomcat) ---> 数据库服务器 (MySql) ---> Web服务器端(Tomcat) ---> Andriod客户端
web服务器端与数据库的通信采用JDBC,为了逻辑更清晰,采用了MVC + DAO(DataAccessObjects)数据访问对象,用户数据放在Wireless_db的usertbl表中。
如下图所示:
新建一个动态网页项目,结构如下图
首先写一个数据库工具类用来连接或断开与数据库的Connection,在此之前,为了程序的拓展性,我们把一些jdbc需要的基本配置信息放入DBConfig.properties配置文件中,方便移植数据库
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/wireless_db username=root password=root
然后写DBUtil类:
View Code
/** * 数据库工具类 */ public class DBUtil { /* * 打开数据库连接 */ public Connection openConnection() { Properties prop = new Properties(); String driver = null; String url = null; String username = null; String password = null; try { // 将properties文件载入Properties类实例 prop.load(this.getClass().getClassLoader().getResourceAsStream( "DBConfig.properties")); driver = prop.getProperty("driver"); url = prop.getProperty("url"); username = prop.getProperty("username"); password = prop.getProperty("password"); // 下句便相当于普通情况下使用jdbc的Class.forName("com.mysql.jdbc.Driver"); Class.forName(driver); return DriverManager.getConnection(url, username, password); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return null; } /* * 关闭数据库连接 */ public void closeConn(Connection conn){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
至此,对数据库连接相关操作的封装完毕
接下来要将数据库的用户表封装成User类,方便服务器端操作:
View Code
/** * 用于封装UserTbl表的实体类 */ public class User { // 编号 private int id; // 账号 private String account; // 密码 private String password; // 用户名称 private String name; // 性别 private String gender; // 权限 private int permission; // 备注 private String remark; // 下面全是7个字段的getter与setter public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getPermission() { return permission; } public void setPermission(int permission) { this.permission = permission; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } }
至此,对数据库用户表信息的封装完毕
然后编写Dao接口并为它写一个实现类:
package com.moka.dao; import com.moka.entity.User; // UesrDao接口 public interface UserDao { // 登录方法 public User login(String account,String password); }
View Code
/** * 用户登录DAO实现类 */ public class UserDaoImpl implements UserDao { /** * 通过用户名称和密码登录,登录成功返回User对象,登录失败返回null */ public User login(String account, String password) { // 查询SQL语句, String sql = " select id, account, password, name, gender, permission, remark " + "from usertbl " + "where account=? and password=? "; // 实例化数据库连接工具类,获得连接,准备PreparedStatement和结果集 DBUtil util = new DBUtil(); Connection conn = util.openConnection(); PreparedStatement ps = null; ResultSet rs = null; try { // 获得PreparedStatement ps = conn.prepareStatement(sql); // 设置查询参数 ps.setString(1, account); ps.setString(2, password); // 执行查询 rs = ps.executeQuery(); // 判断用户是否存在 if (rs.next()) { // 获得用户信息(重要细节:此处获取的位置数字要依照上面的sql语句中的顺序,而不一定是数据库中的顺序) int id = rs.getInt(1); String name = rs.getString(4); int permission = rs.getInt(6); String remark = rs.getString(7); // 封装用户信息 User user = new User(); user.setId(id); user.setAccount(account); user.setPassword(password); user.setName(name); user.setPermission(permission); user.setRemark(remark); return user; } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); rs = null; } if (ps != null) { ps.close(); ps = null; } } catch (SQLException e) { e.printStackTrace(); } util.closeConn(conn); } return null; } }
至此,数据访问操作成功封装在DAO类中
然写Tomcat服务器上运行的servlet,主要复写doGet()方法:
View Code
/** * 响应 Android客户端发来的请求 */ public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); // 获得响应的输出流 PrintWriter pw = response.getWriter(); // 获得客户端请求参数 String account = request.getParameter("account"); String password = request.getParameter("password"); //实例化数据访问对象 UserDao dao = new UserDaoImpl(); User user = dao.login(account, password); if (user != null) { // 响应客户端内容,登录成功 pw.print(build(user)); } else { // 响应客户端内容,登录失败 pw.print("0"); } pw.flush(); pw.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } // 此方法生成一个当前用户信息字符串返回给客户端 private String build(User u) { String userMsg = ""; userMsg += "id=" + u.getId(); userMsg += ";"; userMsg += "name=" + u.getName(); return userMsg; } }
最后是一些配置工作:
jdbc驱动放在WebContent下WEB_INF的lib文件夹下即可
然后要把此servlet配置在web.xml文件中:
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.moka.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/servlet/LoginServlet</url-pattern> </servlet-mapping>
至此,服务器端搭建完毕