目录
6、编写接口UserDao与类UserDaoImpl,实现注册功能与登陆功能
1、组建架构
2、创建数据库表格用于接收数据
数据库版本:MySQL5.7
3、创建JavaBean对象
package pojo;
public class User {
private Integer id;
private String username;
private String password;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public User(Integer id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
4、编写JdbcUtils工具类
导入Jar包
编写配置文件用于连接数据库
编写数据库初始化程序与获取、关闭连接代码
package utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtils {
private static DruidDataSource dataSource;
static {
try {
Properties properties = new Properties();
//读取jdbc.properties配置文件
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//从流中加载数据
properties.load(inputStream);
//创建数据库连接池
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接池中的连接
* @return 如果返回值为null,说明获取连接失败;否则则是获取连接成功
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭连接,放回数据库连接池
* @param conn
*/
public static void closeConnection(Connection conn) {
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试JdbcUtils功能
- 导入相关Jar包
- 编写测试程序
public class JdbcUtilsTest {
@Test
public void test() {
for (int i = 0; i < 15; i++) {
Connection conn = JdbcUtils.getConnection();
System.out.println(conn);
JdbcUtils.closeConnection(conn);
}
}
}
5、编写BaseDao类,用于实现对数据库的修改和查询
导入Jar包
编写代码
package dao.impl;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
public abstract class BaseDao {
//使用DBUtils操作数据库
private QueryRunner queryRunner = new QueryRunner();
/**
* update()方法用来对数据库执行Insert/Update/Delete操作
* @return 如果返回值为-1,代表操作失败;否则返回值代表此次操作影响的行数
*/
public int update(String sql,Object...args){
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.update(conn,sql,args);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeConnection(conn);
}
return -1;
}
/**
* queryForOne()查询返回一行数据
* @param type 返回对象类型
* @param sql 查询的sql语句
* @param args 查询的参数
* @param <T> 返回类型的泛型
* @return 如果返回值为null,代表操作失败;否则返回查询到的对象
*/
public <T> T queryForOne(Class<T> type,String sql,Object...args) {
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.query(conn,sql,new BeanHandler<T>(type),args);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeConnection(conn);
}
return null;
}
/**
* queryForList() 查询返回多行数据
* @param type 返回对象类型
* @param sql 查询的sql语句
* @param args 查询的参数
* @param <T> 返回类型的泛型
* @return 如果返回值为null,代表操作失败;否则返回查询到的对象
*/
public <T>List<T> queryForList(Class<T> type,String sql,Object...args) {
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.query(conn,sql,new BeanListHandler<T>(type),args);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeConnection(conn);
}
return null;
}
/**
* queryForSingleValue() 查询返回一行一列数据
* @param sql 查询的sql语句
* @param args sql语句的参数
* @return 如果返回值为null,代表操作失败;否则返回查询到的单个数据
*/
public Object queryForSingleValue(String sql,Object...args) {
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.query(conn,sql,new ScalarHandler(),args);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeConnection(conn);
}
return null;
}
}
6、编写接口UserDao与类UserDaoImpl,实现注册功能与登陆功能
UserDao接口
package dao;
import pojo.User;
public interface UserDao {
/**
* 根据用户名查询用户信息
* @param username 用户名
* @return 如果返回值为null,代表当前用户名不存在
*/
public User queryByUsername(String username) ;
/**
* 保存用户信息
* @param user
* @return 如果返回值为-1,代表操作失败;否则返回此次操作影响的行数
*/
public int saveUser(User user);
/**
* 根据用户名和密码查询用户信息
* @param username 用户名
* @param password 密码
* @return 如果返回值为null,代表用户名或密码错误;否则返回用户信息
*/
public User queryByUsernameAndPassword(String username,String password);
}
UserDaoImpl类
package dao.impl;
import dao.UserDao;
import pojo.User;
public class UserDaoImpl extends BaseDao implements UserDao {
@Override
public User queryByUsername(String username) {
String sql = "select `id`,`username`,`password`,`email` from t_user where username=?";
return queryForOne(User.class,sql,username);
}
@Override
public int saveUser(User user) {
String sql = "insert into t_user(username,password,email) values(?,?,?)";
return update(sql,user.getUsername(),user.getPassword(),user.getEmail());
}
@Override
public User queryByUsernameAndPassword(String username, String password) {
String sql = "select `id`,`username`,`password`,`email` from t_user where username=? and password=?";
return queryForOne(User.class,sql,username,password);
}
}
测试UseDao功能
package test;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import org.junit.Test;
import pojo.User;
import static org.junit.Assert.*;
public class UserDaoTest {
UserDao userDao = new UserDaoImpl();
@Test
public void queryByUsername() {
if(userDao.queryByUsername("admin") == null) {
System.out.println("当前用户名可用");
} else {
System.out.println("此用户名已存在!");
}
}
@Test
public void saveUser() {
if(userDao.saveUser(new User(null,"asd123","123456",null)) == -1) {
System.out.println("注册失败!");
} else {
System.out.println("注册成功");
}
}
@Test
public void queryByUsernameAndPassword() {
if(userDao.queryByUsernameAndPassword("admin","admin") == null) {
System.out.println("登录失败!");
} else {
System.out.println("登陆成功");
}
}
}
7、实现注册、登陆、用户名查询业务
编写UserService
package service;
import pojo.User;
public interface UserService {
/**
* 实现用户注册
* @param user 用户信息
*/
public void registUser(User user);
/**
* 检查用户名是否存在
* @param username 用户名
* @return 如果返回值为false,表示用户名不存在;否则表示已存在
*/
public boolean existsUsername(String username);
/**
* 实现用户登陆
* @param username 用户名
* @param password 密码
* @return 如果返回值为null,表示用户名或密码错误;否则返回用户信息
*/
public User login(String username,String password);
}
编写UserServiceImpl
package service.impl;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import pojo.User;
import service.UserService;
public class UserServiceImpl implements UserService {
UserDao userDao = new UserDaoImpl();
@Override
public void registUser(User user) {
userDao.saveUser(user);
}
@Override
public boolean existsUsername(String username) {
if(userDao.queryByUsername(username) == null) {
return false;
} else {
return true;
}
}
@Override
public User login(String username, String password) {
if(userDao.queryByUsernameAndPassword(username,password) != null) {
return userDao.queryByUsernameAndPassword(username,password);
}
return null;
}
}
测试UserService及UserServiceImpl
package test;
import org.junit.Test;
import pojo.User;
import service.UserService;
import service.impl.UserServiceImpl;
import static org.junit.Assert.*;
public class UserServiceTest {
UserService userService = new UserServiceImpl();
@Test
public void registUser() {
userService.registUser(new User(null,"zxc123","123456","zxc123@163.com"));
}
@Test
public void existsUsername() {
if(userService.existsUsername("zxc123")) {
System.out.println("已存在");
} else {
System.out.println("可以用");
}
}
@Test
public void login() {
if(userService.login("zxc123","123456") == null) {
System.out.println("用户名或密码错误");
} else {
System.out.println("登陆成功");
}
}
}
8、使用客户端注册账户功能的实现
编写RegistServlet
package web;
import pojo.User;
import service.UserService;
import service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RegistServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1 获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
String code = req.getParameter("code");
// 2 校验验证码
if("abcd".equalsIgnoreCase(code)) {
// 验证码正确
// 3 验证用户名是否存在
if(userService.existsUsername(username)) {
// 用户名不可用
System.out.println("用户名不可用");
// 跳转回注册页面
req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);
} else {
// 用户名可用
// 保存注册信息
userService.registUser(new User(null,username,password,email));
// 跳转到注册成功页面
req.getRequestDispatcher("/pages/user/regist_success.html").forward(req,resp);
}
} else {
//验证码错误
System.out.println("验证码错误");
// 跳回注册页面
req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);
}
}
}
在web.xml中配置 RegistServlet
<servlet>
<servlet-name>RegistServlet</servlet-name>
<servlet-class>web.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegistServlet</servlet-name>
<url-pattern>/registServlet</url-pattern>
</servlet-mapping>
设置注册页面的数据提交地址(采用base+相对地址的方式)
9、使用客户端登陆账户功能的实现
编写LoginServlet
package web;
import service.UserService;
import service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet{
private UserService userService = new UserServiceImpl();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1 获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 2 调用UserService业务查询
if(userService.login(username,password) == null) {
// 返回值为null,登陆失败
System.out.println("登陆失败!");
// 跳转回登录页面
req.getRequestDispatcher("/pages/user/login.html").forward(req,resp);
} else {
// 返回值不为null,登陆成功
// 跳转到登陆成功页面
req.getRequestDispatcher("/pages/user/login_success.html").forward(req,resp);
}
}
}
在web.xml中配置LoginServlet
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
设置注册页面的数据提交地址(采用base+相对地址的方式)
注:本文章所含内容来源于尚硅谷教育,仅供学习参考使用。