(10)第三个Web项目(Servlet登录案例 - 附源码)

(10)第三个Web项目(Servlet登录案例 - 附源码)

一、创建项目

该项目为了简单,就不连接数据库了。

1.项目大纲

在这里插入图片描述

2.接口和类

User类:用户实体类(存数据啥的)

IUserDao 接口:用户 数据层(接口规范)

UserDaoImpl 类:用户 数据层实现(数据层具体的实现)

IUserService 接口:用户 服务层(接口规范)

UserServiceImpl 类:用户 服务层实现(业务的具体实现)

LoginPageServlet 类:登录页面(请求/LoginServlet只是返回一个页面)

LoginServlet 类:处理点击登录按钮登录功能(登录按钮功能)

3.示例代码

User类:用户实体类

package com.changsheng.login.pojo;

/**
 * 用户实体类
 * 
 * @author changsheng
 */
public class User {
	
	/** 用户名 */
	private String username;
	
	/** 密码 */
	private String password;
	
	public User() {
		super();
	}
	
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	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;
	}
	
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
}

IUserDao 接口:用户 数据层

package com.changsheng.login.dao;

import java.util.List;

import com.changsheng.login.pojo.User;

/**
 * 用户 数据层
 * 
 * @author changsheng
 */
public interface IUserDao {
	
	/**
	 * 查询用户列表
	 * 
	 * @param user 用户信息
	 * @return 用户集合
	 */
	public List<User> selectUserList(User user);
}

UserDaoImpl 类:用户 数据层实现

package com.changsheng.login.dao.impl;

import java.util.ArrayList;
import java.util.List;

import com.changsheng.login.dao.IUserDao;
import com.changsheng.login.pojo.User;

/**
 * 用户 数据层实现
 * 
 * @author changsheng
 */
public class UserDaoImpl implements IUserDao{

	/**
	 * 查询用户列表
	 * 
	 * @param user 用户信息
	 * @return 用户集合
	 */
	@Override
	public List<User> selectUserList(User user) {
		// 这里我为了简单起见,就不连接数据库了
		// 只要用户名为admin密码是123456那么则查询成功
		if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
			// 假装查询到了,放入list中
			List list = new ArrayList();
			list.add(user);
			return list;
		}
		// 如果不是admin和123456,那么返回null
		return null;
	}
}

IUserService 接口:用户 服务层

package com.changsheng.login.service;

import java.util.List;

import com.changsheng.login.pojo.User;

/**
 * 用户 服务层
 * 
 * @author changsheng
 */
public interface IUserService {
	
	/**
	 * 查询用户列表
	 * 
	 * @param user 用户信息
	 * @return 用户集合
	 */
	public List<User> selectUserList(User user);
}

UserServiceImpl 类:用户 服务层实现

package com.changsheng.login.service.impl;

import java.util.List;

import com.changsheng.login.dao.IUserDao;
import com.changsheng.login.dao.impl.UserDaoImpl;
import com.changsheng.login.pojo.User;
import com.changsheng.login.service.IUserService;

/**
 * 用户 服务层实现
 * 
 * @author changsheng
 */
public class UserServiceImpl implements IUserService{

	IUserDao ud = new UserDaoImpl(); // 用于查询数据
	
	/**
	 * 查询用户列表
	 * 
	 * @param user 用户信息
	 * @return 用户集合
	 */
	@Override
	public List<User> selectUserList(User user) {
		List<User> list = ud.selectUserList(user);
		return list;
	}
}

LoginPageServlet 类:登录页面

package com.changsheng.login.servlet;

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

/**
 * 登录页面
 * 
 * @author changsheng
 */
@WebServlet("/LoginPageServlet")
public class LoginPageServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应编码格式,返回html
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 下面是即将响应的html代码(等后面学JSP后就不会这样写了)
		StringBuilder html = new StringBuilder();
		html.append("<html>")
			.append("<body>")
			.append("<h1>登录页面</h1>")
			.append("<form method=\"post\" action=\"/LoginServlet\">") // 引号需要使用 \ 转换。action="另一个Servlet的URI路径"。使用post请求,你可不想使用get请求在浏览器上显示你的账号密码吧。
			.append("用户名:<input type=\"text\" name=\"username\"><br>")
			.append("密码:<input type=\"text\" name=\"password\"><br>")
			.append("<input type=\"submit\" value=\"登录\">")
			.append("</form>")
			.append("</body>")
			.append("</html>");
		// 设置响应实体
		resp.getWriter().write(html.toString());
	}
}

LoginServlet 类:处理点击登录按钮登录功能

package com.changsheng.login.servlet;

import java.io.IOException;
import java.util.List;

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 com.changsheng.login.pojo.User;
import com.changsheng.login.service.IUserService;
import com.changsheng.login.service.impl.UserServiceImpl;

/**
 * 处理点击登录按钮登录功能
 * 
 * @author changsheng
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

	IUserService us = new UserServiceImpl();

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 2.设置响应编码格式
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 3.获取请求信息
		String username = req.getParameter("username"); // 获取用户名
		String password = req.getParameter("password"); // 获取密码
		System.out.println("输入的用户名为:"+username+" 密码:"+password);
		// 4.处理请求信息
		User user = new User(); // 创建User对象,存放值
		user.setUsername(username); // 这边获取的信息在控制台打印时没有乱码,所以就不转换编码格式了。如果出现乱码需要转换编码!
		user.setPassword(password);
		List<User> list = us.selectUserList(user); // 查询该用户对象是否存在
		// 5.响应处理结果
		if (list == null || list.isEmpty()) { // 如果查询到的list为null或者为空,说明登录失败
			// 登录失败
			System.out.println("登录失败!\n"+user);
			// 重定向到登录页Servlet
			resp.sendRedirect(req.getContextPath() + "/LoginPageServlet");
		} else {
			// 登录成功
			resp.getWriter().write("登录成功!");
		}
	}
}

二、调用流程图

在这里插入图片描述

三、演示

1.访问登录页面

在这里插入图片描述

2.输入错误账号密码登录

在这里插入图片描述

3.登录失败

重定向到了LoginPageServlet页面(重定向代码为:resp.sendRedirect("/LoginPageServlet");)
在这里插入图片描述

4.输入正确的账号密码

在这里插入图片描述

5.点击登录,登录成功!

(这句向浏览器输出了一句话:resp.getWriter().write("登录成功!");)
在这里插入图片描述

源码链接

源码下载链接分享:https://pan.baidu.com/s/1kKNaNiZFSGUBUm-84GcUNw
提取码:f6aw