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>

至此,服务器端搭建完毕

posted @ 2013-05-13 12:13  来杯冰镇魔卡  阅读(2479)  评论(0编辑  收藏  举报