书城项目-用户的注册与登录

用户通过浏览器访问页面,所需要做的工作主要分为以下几个阶段

客户端-->表现层-->业务逻辑层-->数据访问层-->数据库

以下为流程图

 书城项目-用户的注册与登录

 

 

关于JavaEE项目的三层架构主要分为表现层(User Interface),业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。

对于这三层的相关介绍为:

表现层:又称为Web层/视图展示层,它的功能大致有以下几点:1.用于获取请求参数,封装成为Bean对象。2.调用业务逻辑层对其传来的对象进行处理。3.对业务逻辑层的响应数据发给客户端,还包括请求转发和重定向等功能。

业务逻辑层:又称为Servic业务层,它的功能有:1.处理业务逻辑。2.调用数据访问层对数据进行保存操作。

数据访问层:又称为Dao(Data Access Object)持久层,它的功能是负责与数据库进行交互,主要是进行CRUD(Create Read Update Delete)操作。

 

关于分层的目的是为了解耦,降低代码的耦合度,方便项目后期的维护和升级。

一个简单的JavaEE项目根据他的三层架构以及操作的需求来创建以下几个包:

表现层:web包,用于对客户端传来的请求和响应进行相关的操作

业务逻辑层:service接口包,用于业务逻辑接口的定义,

      serviceimpl包,用于对接口进行实现,通过实接口客户端传来的数据进行操作

数据访问层:dao接口包,用于操作数据库接口的定义,

      daoimpl包,用于对接口的实现,通过实现接口对数据库进行操作

实体bean对象:bean包,用于对客户端传来的数据进行封装

测试包:用于对其他包的测试

工具类:用于数据库的连接以及其他工具的使用

书城项目-用户的注册与登录

 

 

 

下面开始正式操作:

1.创建书城所需要的数据库和表

CREATE DATABASE IF NOT EXISTS BOOK;    #CREAT NEW DATABASE
CREATE TABLE IF NOT EXISTS t_user(            #CREATE TABLE
           `id` int primary key auto_increment,
            `username` varchar(20) not null unique,
            `password` varchar(32) not null,
            `email` varchar(200)   
);
INSERT INTO T_USER(`username`,`password`,`email`) 
values (‘admin‘,‘admin‘,‘xxx@163.com‘); #INSERT DATA SELECT * FROM t_user; #QUERY DATA

 2.编写数据库表对应的JavaBean对象

public class User { 
    private Integer id; 
    private String username;
    private String password; 
    private String email;
}

3.编写工具类JdbcUtils

3.1 在src源码目录下编辑jdbc.properties属性配置文件

username=root 
password=root 
url=jdbc:mysql://localhost:3306/book 
driverClassName=com.mysql.jdbc.Driver 
initialSize=5 
maxActive=10

 3.2 编写JdbcUtiles工具类:

public class JdbcUtils2 {
    private static DruidDataSource dataSource;
    static {
        Properties properties = new Properties(); 
        InputStream resourceAsStream = JdbcUtils2.class.getClassLoader().getResourceAsStream("jdbc.properties");
        try {
            properties.load(resourceAsStream);
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnction(){
        Connection connection = null;
        try {
            connection=dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        return connection;
    }
    public static void Close(Connection connection){
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

3.3 JdbcUtils测试

在IDEA下按快捷键CTRL+SHIFT+T快捷生成测试类

public class JdbcUtils2Test1 {

    @Test
    public void getConnction() {
        for (int i=0;i<66;i++){
            Connection connction = JdbcUtils2.getConnction();
            System.out.println(connction);
            JdbcUtils2.Close(connction);
        }
    }
}

测试如图:

书城项目-用户的注册与登录

 

 4.编写BaseDao

4.1 编写BaseDao类(抽象类)

 

public abstract class BaseDao {
    //使用DbUtils操作数据库
    /**
     * update() 用于执行IUD语句
     *
     * @return 如果返回-1,说明执行失败,返回其他则表示影响的行数
     */
    private QueryRunner queryRunner = new QueryRunner();
    private int update(String sql,Object...objects){
        Connection connection = JdbcUtils2.getConnction();
        try {
            return queryRunner.update(connection,sql,objects);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils2.Close(connection);
        }
        return -1;
    }
    /**
     * 查询返回一个JavaBean的sql语句
     *
     * @param type 返回对象的类型
     * @param sql 执行的sql语句
     * @param objects sql语句对应的参数值
     * @param <T> 返回值的类型
     *
     */
    public <T> T queryForOne(Class<T> type,String sql,Object...objects){
        Connection connection = JdbcUtils2.getConnction();
        try {
            return queryRunner.query(connection,sql,new BeanHandler<T>(type),objects);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils2.Close(connection);
        }
        return null;
    }

    /**
     * 查询返回多个JavaBean对象
     * @param type 返回对象的类型
     * @param sql   执行的sql语句
     * @param objects   sql对应的参数
     * @param <T>   返回的类型的泛型
     * @return
     */
    public <T> T queryForList(Class<T> type,String sql,Object...objects){
        Connection connection = JdbcUtils2.getConnction();
        try {
            return queryRunner.query(connection, sql, new BeanHandler<T>(type), objects);
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils2.Close(connection);
        }
        return null;
    }

    /**
     * 执行返回一行一列的sql语句
     * @param sql   执行的sql语句
     * @param objects   sql语句对应的参数
     * @return  如果失败返回null,成功返回一个对象
     */
    public  Object queryForSingleValue(String sql,Object...objects){
        Connection connection = JdbcUtils2.getConnction();
        try {
            return queryRunner.query(connection, sql, new ScalarHandler(), objects);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils2.Close(connection);
        }
        return null;
    }
}

5.编写UserDao和测试类

5.1UserDao类

public interface UserDao1 {
    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return  如果null说没这个对象
     */
    public User queryUserByUsername(String username);

    /**
     * 根据用户名和密码查询用户
     * @param username
     * @param password
     * @return
     */
    public User queryUserByUsernameAndPassword(String username,String password);

    /**
     * 保存用户信息
     * @param user
     * @return 如果返回-1表示失败,其他是sql语句影响的行数
     */
    public int saveUser(User user);
}

5.2编写实现类

public class UserDaoImpl1 extends BaseDao implements UserDao1 {
    @Override
    public User queryUserByUsername(String username) {
        String sql = "select `id`,`username`,`password` from t_user where username=?";

        return queryForone(User.class,sql,username);
    }

    @Override
    public User queryUserByUsernameAndPassword(String username, String password) {
        String sql = "select `id`,`username`,`password` from t_user where username = ? and password = ?";
        return queryForone(User.class,sql,username,password);
    }

    @Override
    public int saveUser(User user) {
        String sql = "insert into t_user(`username`,`password`,`email`)values(?,?,?)";
        return update(sql,user.getUsername(),user.getPassword(),user.getPassword());
    }
}

5.3测试

public class UserDaoImpl1Test1 {
    UserDao1 userDao1 = new UserDaoImpl1();
    @Test
    public void queryUserByUsername() {
        if (userDao1.queryUserByUsername("admin111")==null){
            System.out.println("用户名可用");
        }else {
            System.out.println("用户名已存在");
        }
    }

    @Test
    public void queryUserByUsernameAndPassword() {
        if (userDao1.queryUserByUsernameAndPassword("admin","admin")==null){
            System.out.println("用户名或者密码错误");
        }else {
            System.out.println("登陆成功");
        }
    }

    @Test
    public void saveUser() {
        System.out.println(userDao1.saveUser(new User(null,"ldy123","ldy123","xxx@qqq.com")));
    }
}

测试结果如下:

书城项目-用户的注册与登录

 

 

6.编写UserService类

6.1.编写Userervice接口

public interface Userservice1 {
    /**
     * 用于用户注册
     * @param user
     */
    public void registUser(User user);

    /**
     * 用于用户登录
     * @param user
     * @return
     */
    public User login(User user);

    /**
     * 用于检查用户名是否存在
     * @param username
     * @return
     */
    public boolean existsUsername(String username);
}

6.2.实现Userservice的接口

public class UserServiceImpl1 implements Userservice1 {
    private UserDao1 userDao = new UserDaoImpl1();
    @Override
    public void registUser(User user) {
        userDao.saveUser(user);
    }

    @Override
    public User login(User user) {
        return userDao.queryUserByUsernameAndPassword(user.getUsername(), user.getPassword());
    }

    @Override
    public boolean existsUsername(String username) {
        if (userDao.queryUserByUsername(username)==null){
            return false;
        }else{
            return true;
        }
    }
}

6.3测试Userservice实现类

public class UserServiceImpl1Test {
    Userservice1 userservice1 = new UserServiceImpl1();
    @Test
    public void registUser() {
        userservice1.registUser(new User(null,"ldytest","123456","ldy@qq.com"));
    }

    @Test
    public void login() {
        System.out.println(userservice1.login(new User(null, "ldytest", "123456", null)));
    }

    @Test
    public void existsUsername() {
        System.out.println(userservice1.existsUsername("ldytest"));
    }
}

测试结果如下:

书城项目-用户的注册与登录

 

 

7 编写web层

7.1 实现用户注册与登录的功能

7.1.1用户注册的流程

书城项目-用户的注册与登录

 

 

7.1.2 编写RegistServlet程序

public class RegsitServlet1 extends HttpServlet {
    Userservice1 userservice = new UserServiceImpl1();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        String code = req.getParameter("code");
        if("abcd".equalsIgnoreCase(code)){
            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);
        }
    }
}

7.2编写LoginService程序

public class Login extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        UserService userService = new UserServiceImpl();
        User login = userService.login(new User(null, username, password, null));
        if (login==null){
            request.getRequestDispatcher("/pages/user/login.html").forward(request,response);
        }else {
            request.getRequestDispatcher("/pages/user/login_success.html").forward(request,response);
        }
    }
}

8.效果展示

书城项目-用户的注册与登录书城项目-用户的注册与登录

 

 总之,这些内容并不是多么难理解,但是需要多加练习。学习随笔。

书城项目-用户的注册与登录

上一篇:django的ORM框架


下一篇:EdgexGo1.3编译-4 虚拟机VirtualBox扩充磁盘