zoukankan      html  css  js  c++  java
  • 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>

    至此,服务器端搭建完毕

  • 相关阅读:
    HTML4如何让一个DIV居中对齐?float输入日志标题
    HTML3层叠样式表
    面向对象 学生考试计分题目
    C#总复习
    HTML2列表表单框架
    HTML1网页三部份内容
    HTML 5 JavaScript初步 编译运行.doc
    初识MYSQL
    数据库设计
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/moka/p/3075417.html
Copyright © 2011-2022 走看看