您的位置:首页 > 理论基础 > 计算机网络

Android网络编程之——Android登录系统模块的实现(服务器端Servlet+Mysql)

2014-11-26 20:36 966 查看
原地址:http://www.cnblogs.com/moka/archive/2013/05/13/3075417.html

该模块主要实现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类:



/**
*    数据库工具类
*/
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类,方便服务器端操作:



/**
*    用于封装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);
}




/**
* 用户登录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()方法:



/**
* 响应 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>


至此,服务器端搭建完毕
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat java mysql
相关文章推荐