JavaEE MVC 项目创建

JavaEE 三层架构

 

 

web层           web/servlet/controller
service层       service & serviceImpl             
dao持久层      dao & daoImpl                      
实体bean对象  pojo/entity/domain/bean  

1.创建数据库及相关需要的表

drop database if EXISTS book;
create database book;
use book;
create table t_user(
`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','admin@atbook.com');
select * from t_user;

2.编写数据库表对应的bean

package com.book.pojo;

public class User {
    
    private Integer id;
    private String username;
    private String password;
    private String email;
    
    
    public User() {
        super();
    }
    
    public User(Integer id, String username, String password, String email) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = 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;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email + "]";
    }
    
}

3.编写工具类BaseDao

package com.book.dao;

import java.sql.Connection;
import java.util.List;

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 com.book.utils.JdbcUtils;

public abstract class BaseDao {
    //使用DBUtils操作数据库
    private QueryRunner queryRunner = new QueryRunner();
    
    /*
     * Update方法用来执行:Insert/Update/Delete语句
     */
    
    public int update(String sql,Object...args) {
        Connection conn = new JdbcUtils().getConnection();
        try {
            return queryRunner.update(conn, sql, args);
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return -1;
    }
    
    /*
     * 查询返回一个Javabean的sql语句
     */
    public <T>T queryForOne(Class<T> type ,String sql,Object...args) {
        Connection conn = new JdbcUtils().getConnection();
        try {
            return queryRunner.query(conn,sql, new BeanHandler<T>(type), args);
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return null;
        
    }
    /*
     * 查询返回多个JavaBean List的sql语句
     */
    
    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 (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return null;
    }
    
    /*
     * 执行返回一行一列的sql语句
     * 
     */
    public Object queryForSingleValue(String sql,Object...args) {
        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn, sql, new ScalarHandler(), args);
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        
        return null;
    }
    
}

4.编写数据库表对应的dao接口 UserDao

/**
 * 
 */
package com.book.dao;

import com.book.pojo.User;

/**
 * 处理User数据库的接口
 * @author lye
 *
 */
public interface UserDao {
    
    
    //* 根据用户名查询用户信息,如果返回null,说明这个用户不存在,反之亦然。
    public User queryUserByUserName(String username);
    
    //保存用户信息,返回-1表示失败,返回其他数字是sql语句影响的行数
    public int saveUser(User user);
    
    //根据用户名和密码查询用户,如果返回null,说明这个用户名或密码错误,反之亦然。
    public User queryUserByUsernameAndPassword(String username,String password);

}

5.实现dao接口 UserDaoImpl

/**
 * 
 */
package com.book.dao;

import com.book.pojo.User;
import com.book.test.UserDaoTest;

/**
 * @author lye
 *
 */
public class UserDaoImpl extends BaseDao implements UserDao{

    @Override
    public User queryUserByUserName(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 queryUserByUsernameAndPassword(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);
    }

}

6.编写service层UserService,用于控制和操作数据,相当于视图层和数据库层的中间连接层

/**
 * 
 */
package com.book.service;

import com.book.pojo.User;

/**
 * @author lye
 *
 */
public interface UserService {
    
    //注册用户
    public void registUser(User user);
    
    //登录
    public User login(User user);
    
    //检查用户名是否可用,返回true表示用户名已存在,返回false表示用户名可用
    public boolean existsUsername(String username);

}

7.实现Service层接口UserServiceImpl

/**
 * 
 */
package com.book.service.impl;

import com.book.dao.UserDao;
import com.book.dao.UserDaoImpl;
import com.book.pojo.User;
import com.book.service.UserService;

/**
 * @author lye
 *
 */
public class UserServiceImpl implements UserService{
    
    private UserDao userDao = new UserDaoImpl();

    @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;
        }
        return true;
    }

}

 

8.在web层创建对应视图页面业务的Servlet

1)注册页面RegistServlet

/**
 * 
 */
package com.book.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.book.pojo.User;
import com.book.service.UserService;
import com.book.service.impl.UserServiceImpl;

/**  
* @ClassName: RegistServlet  
* @Description: TODO 
* @author lye  
* @date Nov 12, 2021    
*/
public class RegistServlet extends HttpServlet{
    UserService userService = new UserServiceImpl();

    @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");
        
        //检查 验证码是否正确  ==写死,要求验证码为:abcde
        if("abcde".equalsIgnoreCase(code)) {
            //正确:
            //检查用户名是否可用
            boolean existsUsername = userService.existsUsername(username);
            if(existsUsername) {
                //不可用
                System.out.println("用户名 " + username +" 已存在");
                //跳回注册页面
                req.getRequestDispatcher("/pages/user/regist.html").forward(req, resp);
            }else {
                //可用
                //调用service保存到数据库
                userService.registUser(new User(null,username,password,email));
                req.getRequestDispatcher("/pages/user/regist_success.html").forward(req, resp); 
            }
            
        }else {
            //不正确 跳回到注册页面
            System.out.println("验证码" + code + "错误");
            req.getRequestDispatcher("/pages/user/regist.html").forward(req, resp);
        }
        
        
    }
    
    

}

2)登录页面LoginServlet

/**
 * 
 */
package com.book.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.book.pojo.User;
import com.book.service.UserService;
import com.book.service.impl.UserServiceImpl;

/**  
* @ClassName: LoginServlet  
* @Description: TODO 
* @author lye  
* @date Nov 12, 2021    
*/
public class LoginServlet extends HttpServlet{
    
    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.login()处理业务
        User loginUser = userService.login(new User(null, username, password, null));
        //如果等于null ,说明登录失败
        if(loginUser == null) {
            
            req.getRequestDispatcher("/pages/user/login.html").forward(req, resp);
        }else {
            //登录成功
            req.getRequestDispatcher("/pages/user/login_success.html").forward(req, resp);
        }
        
    }
    

}

 关于分页的分析:

 

posted @ 2021-11-14 13:59  donkey8  阅读(65)  评论(0)    收藏  举报