【本案例采用IDEA软件开发】

1、创建数据库

DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) 

【在表中插入一条数据】:

在这里插入图片描述

2、开始使用idea实现

【1】、新建web项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【2】、新建完成目录结构

在这里插入图片描述

【3】、开始配置tomcat

在这里插入图片描述
在这里插入图片描述
【注意这里选择自己的下载的tomcat地址】完成后全程确定即可
在这里插入图片描述

【4】、导入mysql驱动包文件

【在web下的WEB-INF下新建一个目录文件夹来存放我们的架包】
在这里插入图片描述
【将所需要的架包复制到lib目录下】
在这里插入图片描述
【添加架包到我们的项目模块中】
在这里插入图片描述
在这里插入图片描述

【5】、开始准备jsp页面

【新建jsp方法】
在这里插入图片描述

【1、编写login页面,直接在默认的index.jsp中进行修改】

<%--
  Created by IntelliJ IDEA.
  User: 执手天涯
  Date: 2021/10/22
  Time: 20:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定义一个path表示我们项目的根路径--%>
<% String path = request.getContextPath(); %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<%--method表示提交方式 可以改变为post--%>
<%-- action我们先不写,后面我们写逻辑代码的时候添加--%>
<%--action表示的是我们提交的地址--%>
<form action="<%=path%>/login" method="post">
    请输入用户名:<input name="username" type="text"><br>
    请输入密码:<input name="password" type="password"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

【6】、准备登录成功页面

<%--
  Created by IntelliJ IDEA.
  User: 执手天涯
  Date: 2021/10/18
  Time: 12:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<--这里的xxx我们后面在从数据库获取-->
<h1>欢迎XXX登录成功</h1>
</body>
</html>

【7】、准备登录失败页面

<%--
  Created by IntelliJ IDEA.
  User: 执手天涯
  Date: 2021/10/18
  Time: 12:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
对不起,登陆失败!
</body>
</html>

3、开始编写java代码

【首先我们来说一下MVC结构,详情大家可以百度】
在这里插入图片描述

【1】、创建mvc目录结构

【创建包的方法】
在这里插入图片描述
在这里插入图片描述

【2】、开始编写MVC模式

【3.2.1】、编写数据库连接工具类

package com.Utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnUtil {
    //定义一个方法来获取数据库的连接
    public static Connection getConn() {
        //初始化数据库连接对象conn
        Connection conn = null;
        //利用try...catch处理异常
        try {
            //注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            //开始连接自己的数据库
            //test是数据库名称
            //root 一般不需要修改
            //password:修改为自己数据库的密码
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                    "root",
                    "XING0710");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

【3.2.2】、编写两个万能的工具类

package com.Utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BaseDao {
    /**
     * 功能描述
     * 增删改的万能方法
     *
     * @param sql 表示我们传入的sql语句
     * @param obj 表示我们自定义的参数
     * @return int
     */
    public int modifyData(String sql, Object[] obj) {
        Connection conn = ConnUtil.getConn();
        int result = 0;
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 功能描述
     * 查询的万能方法
     * @param sql 我们传入的查询sql语句
     * @param obj 我们传入的自定义参数
     * @return java.sql.ResultSet
     */
    public ResultSet getDataByAny(String sql, Object[] obj) {
        Connection conn = ConnUtil.getConn();
        ResultSet rs = null;
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
            rs = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
}

【3.2.3】开始从实体层entity编写

package com.Entity;

/**
 * 功能描述
 * 这个类是对于数据库表中tb_user的实体类
 * 并添加了get和set方法
 */
public class User {
    private Integer id;
    private String username;
    private String password;

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public User() {
    }

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

【3.2.4】、编写dao层接

package com.Dao;

/**
 * 功能描述
 * 这里放的是我们所有的用户表的方法
 */
public interface userDao {
    /**
     * 功能描述
     * 用户登录
     * @param username 传入获取的用户名
     * @param password 传入获取的密码
     * @return boolean
     * @date
     */
    public boolean login(String username, String password);
}

【3.3.5】、编写到dao接口的实现类

package com.Dao.DaoImpl;

import com.Dao.userDao;
import com.Utils.BaseDao;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 功能描述
 * 我们通过继承的方法来调用BaseDao工具类中我们写好的查询数据的方法
 * 再实现UserDao接口中的方法
 */
public class UserDaoImpl extends BaseDao implements userDao {
    @Override
    public boolean login(String username, String password) {
        //定义一个查询的sql语句
        String sql = "select *from tb_user where username=? and password=?";
        /**
         *功能描述
         * 利用super关键字调用BaseDao中getDataByAny方法(也可以用this)
         * @param username 我们的查询依据
         * @param password 我们查询依据
         * @return boolean 返回一个布尔数据类型
         * ResultSet 返回一个结果集
         */
        ResultSet result = super.getDataByAny(sql, new Object[]{username, password});
        //定义一个boolean的变量来确定我们查询是否成功
        boolean flag = false;
        try {
            while (result.next()) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }
}

【3.3.6】、编写service层接口

package com.Service;

public interface userService {
    /**
     * 功能描述
     * 用户登录 这里和UserDao一样,方便我们servlet的调用
     * @param username 传入获取的用户名
     * @param password 传入获取的密码
     * @return boolean
     * @date
     */
    public boolean login(String username, String password);
}

【3.3.7】、编写service层接口实现类

package com.Service.Impl;

import com.Dao.DaoImpl.UserDaoImpl;
import com.Dao.userDao;
import com.Service.userService;

public class userServiceImpl implements userService {
    /**
     * 功能描述
     * 由于我们在UserDaoImpl中已经实现了该方法,所以我们在这里不必再去实现该方法
     *
     * @return
     */
    //调用dao层的方法 实例化一个userDao
    userDao userDao = new UserDaoImpl();

    @Override
    public boolean login(String username, String password) {
        return userDao.login(username, password);
    }
}

【3.3.8】、编写servlet层

package com.Servlet;

import com.Service.Impl.userServiceImpl;
import com.Service.userService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//使用注解的方式来访问我们的servlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //这里我们为了简单可以在doPost中调用doGet
        doGet(request, response);
        //这里是设置数据库获取到的数据的字符集,不设置可能会导致获取的数据是乱码
        request.setCharacterEncoding("utf-8");
        //从数据库获取用户名和密码
        String username = request.getParameter("username");
        String psssword = request.getParameter("password");
        //这里我们直接调用service层的方法,不必再去调用dao层的方法
        userService user = new userServiceImpl();
        //开始对获取的结果进行判断
        if (user.login(username, psssword)) {
            //登录成功
            //这里我们设置了一个会话来存放我们获取到的用户名,一会我们将会把用户名渲染到页面当中
            request.getSession().setAttribute("username", username);
            //登录成功,采用转发的方式到登录成功的页面,当然也可使用重定向
            request.getRequestDispatcher("/success.jsp").forward(request, response);
        } else {
            //登录失败,转发到登录失败页面...
            request.getRequestDispatcher("/error.jsp").forward(request, response);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

【3.3.9】、修改登录成功页面获取用户名

<%--
  Created by IntelliJ IDEA.
  User: 执手天涯
  Date: 2021/10/22
  Time: 20:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>欢迎你
<%--我们使用session.getAttribute(),获取我们的用户名--%>
    <%
    Object object=session.getAttribute("username");
    if(object!=null) {
        out.print(object.toString());
    }%>
    登录成功</h1>
</body>
</html>

4、开始测试一波

在这里插入图片描述

【运行成功】

在这里插入图片描述

【输入我们数据库中的账号密码】

在这里插入图片描述

【输入其他账号密码】

在这里插入图片描述

5、总结

本次案例,主要是利用面向对象的方式,利用MVC开发模式,做了一个简单的登录案例,里面还有很多缺陷,大家可以自行维护,并没有做到完全的面向对象开发,开发过程主要使用了jsp的一些知识,主要设计jsp的九大内置对象的使用,还有部分servlet的使用。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐