servlet实现简单登录功能-基于测试驱动开发TDD

今天学习了测试驱动开发(TDD)模式,用这个方法写一个简单的前端登录功能(基于servlet&Jsp的登录功能-三层架构实现)

不知道测试驱动开发,可以点这个:
https://blog.csdn.net/qq_40542534/article/details/108473822

  1. 编写service业务逻辑层的测试代码
import org.junit.Test;

public class UserServiceTest {
    //1、添加Junit测试
    @Test
    public void testUserLogin(){
      //2、业务逻辑
        UserService userService = new UserService();
      //3、登录业务
        String username = "user222";
        String password = "123456";
      //4、登录 是否成功
        boolean result = userService.login(username,password);
      //5、返回结果
        if(result){
            System.out.println("登录成功");
        }else{
            System.out.println("账号或者密码错误,登录失败。");
        }
    }
}
  1. 写service层代码
//业务类
public class UserService {

    public boolean login(String username, String password) {
       //三层架构模式
        //1、servic调用dao
        UserDao userDao = new UserDao();

        //2、封装user对象
        User user = new User(username,password);

        //3、调用dao去数据库查找user
        boolean flag = userDao.getUserByNameAndPassword(user);

        //4、返回是否查找成功
        return flag;
    }
}
  1. 写需要的bean/pojo类
//实体类
public class User {
    private Long id;
    private String username;
    private String password;

    public User() {
    }

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

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  1. 写dao层访问数据库
//dao层 数据库访问层
public class UserDao {

    //查找方法
    public boolean getUserByNameAndPassword(User user) {
        //三层架构  查找数据库库  DB是模拟数据库查询类
        return DB.getUserByNameAndPassword(user);
    }
}
  1. 模拟数据库查询,这里不连接数据库,直接自己创建数据了
//模拟数据库查询
public class DB {
    //这里没有连接数据库,用ArrayList模拟数据
    private static List<User> userList = new ArrayList<>();

    static{
        //静态代码块,当前类被夹在的时候执行,只执行一次
        User user1 = new User("user111","123456");
        userList.add(user1);
        User user2 = new User("user222","123456");
        userList.add(user2);
        User user3 = new User("user333","123456");
        userList.add(user3);
    }

    public static boolean getUserByNameAndPassword(User user) {
        User result = null;//存放查询的user对象
        for(User u:userList){
            if(u.getUsername().equals(user.getUsername()) && u.getPassword().equals(user.getPassword())){
                result = u;
            }
        }
        //遍历结果
        return result != null?true:false;//查询到用户就返回true
    }
}
  1. 执行测试,看是否有错误
    用户名密码不对时测试
    用户名密码正确测试
  2. 通过测试发现,逻辑没有问题,也没有bug,这时候再来写页面,直接套用就很快了,写页面
<html>
  <head>
    <title>登录</title>
  </head>
  <body>
      <form action="login" method="post">
        <table>
          <tr>
            <td>用户名:</td>
            <td><input name="username" type="text" placeholder="请输入用户名"></td>
          </tr>
          <tr>
            <td>密码:</td>
            <td><input name="password" type="text" placeholder="请输入密码"></td>
          </tr>
        </table>
        <input type="submit" value="登录">
      </form>

  </body>
</html>
  1. 测试页面
    在这里插入图片描述

  2. 写servlet (将你编写的测试代码UserServiceTest进行复制修改就写)

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        //登录访问次数统计
        //1、获取ServletContext
        ServletContext servletContext = getServletContext();//一个项目只有一个ServletContext,在第一次访问的时候创建
        //2、添加一个统计数值 count 默认是0
        servletContext.setAttribute("count",0);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        UserService userService = new UserService();
        //1、获取参数 从页面获取用户登录信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //2、查找是否存在
        boolean result = userService.login(username,password);
        response.setContentType("text/html;charset=utf-8");//修改编码
        //3、返回结果
        if(result){
            //登录成功
            //a、获取servletContext
            ServletContext servletContext = getServletContext();
            //b、获取里面的count统计数
            Integer count = (Integer)servletContext.getAttribute("count");

            count++;
            servletContext.setAttribute("count",count);
            //响应给浏览器
            response.getWriter().println("Login successful, welcome to use!\n Login Number : "+count);
            System.out.println("登录成功");
        }else{
            response.getWriter().println("Login failed due to incorrect account or password.");
            System.out.println("账号或者密码错误,登录失败。");
        }
    }
}
  1. 运行测试
    在这里插入图片描述
    登录成功,跳转响应界面
    在这里插入图片描述
    登录失败测试
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40542534/article/details/108475684