今天学习了测试驱动开发(TDD)模式,用这个方法写一个简单的前端登录功能(基于servlet&Jsp的登录功能-三层架构实现)
不知道测试驱动开发,可以点这个:
https://blog.csdn.net/qq_40542534/article/details/108473822
- 编写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("账号或者密码错误,登录失败。");
}
}
}
- 写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;
}
}
- 写需要的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 + '\'' +
'}';
}
}
- 写dao层访问数据库
//dao层 数据库访问层
public class UserDao {
//查找方法
public boolean getUserByNameAndPassword(User user) {
//三层架构 查找数据库库 DB是模拟数据库查询类
return DB.getUserByNameAndPassword(user);
}
}
- 模拟数据库查询,这里不连接数据库,直接自己创建数据了
//模拟数据库查询
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
}
}
- 执行测试,看是否有错误
- 通过测试发现,逻辑没有问题,也没有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>
-
测试页面
-
写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("账号或者密码错误,登录失败。");
}
}
}
- 运行测试
登录成功,跳转响应界面
登录失败测试