首页 > 编程语言 >【Javaweb】JavaEE项目的三层架构 | 快速搭建

【Javaweb】JavaEE项目的三层架构 | 快速搭建

时间:2023-02-01 01:12:16浏览次数:44  
标签:username 架构 Javaweb JavaEE sql return password public String

逻辑类图

 

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

不同的层有不同的包

web层       com.stguigu.web/servlet/controller

service层       com.atguigu.service          Service接口包

            com.atguigu.service.impl          Service接口实现类

dao持久层     com.atguigu.dao             Dao接口包

实体Bean对象   com.atguigu.poio/entity/domain/bean          JavaBean类

测试包      com.atguigu.test/junit

工具类      com.atguigu.utils

编码环节

1、先创建项目所需要的数据库和表

DROP DATABASE IF exists javaweb05;

CREATE DATABASE javaweb05;

use javaweb05;

create table t_user(
    `id` int primary key auto_increment,
    `username` varchar(20) NOT NULL UNIQUE,
    `password` varchar(32) not null,
    `email` varchar(200)
);

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

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

    public User() {
    }

    public User(Integer id, String username, String password, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", 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;
    }
}
部分代码

3、编写工具类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);
            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public static Connection getConnection(){
        Connection connection=null;
        try {
            connection=dataSource.getConnection();
        }catch (Exception e){
            e.printStackTrace();
        }
        return connection;
    }
    public static void close(Connection connection){
        if(connection!=null){
            try {
                connection.close();
                }catch (SQLException e){
                    e.printStackTrace();
                    }
                }
            }
部分代码

4、编写BaseDao

public abstract class BaseDao {
//    使用DbUtils操作数据库
    private QueryRunner queryRunner=new QueryRunner();
    /**
     * update()方法用来执行,Insert\Update\Delete语句
     * @return 如果返回-1,说明执行失败<br>返回其他表示影响的行数
     * @author yan
     * @create 2023/1/30
     **/
    public int update(String sql,Object ... args){
        Connection connection= JdbcUtils.getConnection();
        try {
            return queryRunner.update(connection,sql,args);
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.close(connection);
        }
        return -1;
    }
    /*
     * 查询返回一个JavaBean的sql语句
     * 
     * @param type 返回的对象类型
     * @param sql 执行的sql语句
     * @param args sql对应的参数值
     * @param <T> 返回的类型的泛型
     * @return 
     * @author yan
     * @create 2023/1/30
     **/
    public <T>T queryForOne(Class<T>type,String sql,Object ... args){
        Connection connection=JdbcUtils.getConnection();
        try {
            queryRunner.query(connection, sql, new BeanHandler<T>(type), args);
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.close(connection);
        }
        return null;
    }
    /*
     * 查询返回多个JavaBean的sql语句
     *
     * @param type 返回的对象类型
     * @param sql 执行的sql语句
     * @param args sql对应的参数值
     * @param <T> 返回的类型的泛型
     * @return
     * @author yan
     * @create 2023/1/30
     **/
    public <T>List<T> queryForList(Class<T>type,String sql,Object ... args){
        Connection connection=JdbcUtils.getConnection();
        try {
            queryRunner.query(connection, sql, new BeanHandler<T>(type), args);
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.close(connection);
        }
        return null;
    }
    /*
     * 查询返回多个JavaBean的sql语句
     *
     * @param type 返回的对象类型
     * @param sql 执行的sql语句
     * @param args sql对应的参数值
     * @return
     * @author yan
     * @create 2023/1/30
     **/
    public Object queryForSingleValue(String sql,Object ... args){
        Connection connection=JdbcUtils.getConnection();
        try {
           return queryRunner.query(connection, sql, new ScalarHandler<>(), args);
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.close(connection);
        }
        return null;
    }
}
BaseDao

5、编写UserDao测试

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 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);
    }

    @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());
    }
}
UserDaoImpl

 

 6、编写UserService和测试

private UserDao userDao=new UserDaoImpl();

    @Override
    public void register(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){
//            等于null,说明没查到,没查到表示可用
            return false;
        }
        return true;
    }
UserServiceImpl

7、编写web层

public class RegisterServlet 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、检查验证码是否正确 ---- 正确===写死,要求验证码为123
        if ("123".equalsIgnoreCase(code)) {
//3、检查用户名是否可用 ----可用
            if (userService.existsUsername(username)) {
//            不可用
                System.out.println("用户名[" + username + "]已存在!");
//                跳回注册页面
                req.getRequestDispatcher("/register/register.html").forward(req, resp);
            } else {
//              可用
//4、调用Service保存到数据库
                userService.register(new User(null, username, password, email));
//5、跳到注册成功页面 register_success.html
                req.getRequestDispatcher("/register/registersuccess.html").forward(req, resp);

            }
//6、否则跳回注册页面
        } else {
            System.out.println("验证码[" + code + "]错误");
            req.getRequestDispatcher("/register/register.html").forward(req, resp);
        }


    }
}
RegisterServlet

7.2IDEA中Debug调试的使用

Debug调试代码,首先需要两个元素:断点+Debug启动器

1、断点,只需要在代码需要停的行的左边上单击,就可以添加和取消

2、Debug启动Tomcat运行代码

 

 调试工具栏:

 

     让代码往下执行一行

    可以进入当前方法体内(自己写的代码,非框架源码)

 

     强制进入当前方法体内

 

     跳出当前方法体外

 

     停在光标所在行,相当于是个临时断点

 

 

变量窗口

可以查看当前方法范围内所有有效的变量

 

 方法调用栈窗口

1、可以查看当前线程有哪些方法的调用信息

2、下面的调用上面的方法

 

 其他常用调试相关按钮

 

 7.3用户登录功能的实现

 

 利用断点进行测试

信息错误时

 

 信息正确时

 

 

 

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.login()登录处理业务
       User loginUser= userService.login(new User(null,username,password,null));
//3、根据login()方法返回结果判断登录是否成功
//        如果等于null,说明登录 失败!
       if(loginUser==null){
// 跳回登陆页面
           req.getRequestDispatcher("/register/login.html").forward(req,resp);
       }else {
//           登陆成功
// 跳到成功页面login_success.html
           req.getRequestDispatcher("/register/login_success.html").forward(req,resp);
        }
    }
}
LoginServlet

 

标签:username,架构,Javaweb,JavaEE,sql,return,password,public,String
From: https://www.cnblogs.com/gbrr/p/17081276.html

相关文章

  • 中断ISR技术架构
    架构一ISR采用立即响应思路,技术架构如下图: 优点:简单。缺点:处理性能不高,中断优先级规划性不高(仅仅区分CPU的32个优先级别,针对不同类型中断优先级不支持)。选型:对于......
  • 大型互联网公司微服务架构总图
    这张图是我写文章做笔记用的概念图。大家要用的话截图下面就可以啦,画起来也不麻烦,重点是里面的内容。......
  • 5. RGCA架构设计过程
    介绍RGCA:RequirementGoalConceptArchitecture需求目标概念架构利益相关者与需求系统因为使人受益而存在;系统的主要需求也来源于利益相关方通过系统为一些......
  • ElasticSearch概念与架构原理
    一、概述ElasticSearch简介简介ES是建立在Lucene基础之上的分布式准实时搜索引擎,它所提供的诸多功能中有一大优点,就是实时性好。比如:在业务需求中,新增数据需要1min才......
  • K8S 架构
    主要组件:etcd保存了整个集群的状态;kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;kube-controller-manager负责维护集群的......
  • MCU逻辑控制架构图
    ​......
  • 1.1 架构的底层逻辑-介绍
    主要目标GOALS了解架构的底层逻辑,跳出CRUD思维用面向对象思维来进行分析和设计,掌握最佳设计原则和设计模式通过OPM对业务进行分析和建模,通过RGCA四步方法来进行架构......
  • 1.4 架构的底层逻辑-架构师
    架构师的职责与能力架构包含业务架构数据架构应用架构技术架构技能地图分析能力:软件架构分析,项目管理和测量的常规分析思维领导力:工作指导,团队建设,建立愿景......
  • 1.3 架构的底层逻辑-架构介绍
    架构是什么架构是定义系统的结构,行为及其他视图的模型架构虚设是有关系统的正是描述以及呈现,以有助于了解系统结构和行为的方式来组织认识架构4+1视图模型在4+1......
  • 1.2 架构的底层逻辑-系统思维
    认识系统系统是什么1.由若干实体组成2.系统也是另一个系统中的实体如何认识系统,系统有什么特征系统具有形式属性(静态结构)和功能属性(动态结构)系统同时也是一个提......