用户通过浏览器访问页面,所需要做的工作主要分为以下几个阶段
客户端-->表现层-->业务逻辑层-->数据访问层-->数据库
以下为流程图
关于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.效果展示
总之,这些内容并不是多么难理解,但是需要多加练习。学习随笔。