对所学内容回顾与分享的笔记记录,包含全流程与源码
实现功能
相对完善的登录界面流程,按数据库中存储用户名账号密码核对判断能否正常登录,用户的账号注册与账号名查重,,服务端根据用户勾选的选项实现返回cookie对登录状态持久化以及session保存
流程调用关系图
使用技术
java, servlet, mybatis, mysql, tomcat
项目内容列表
实现步骤
这里以程序编写思路记录实现步骤
数据层
pojo包
简单类型java对象(Plain Ordinary Java Object),创建被操作管理数据库中要使用到的数据类型
package com.slaine.pojo;
public class User {
private Integer id;
private String username;
private String passwd;
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 getpasswd() {
return passwd;
}
public void setpasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", passwd='" + passwd + '\'' +
'}';
}
}
mapper包
对pojo包中不同类型数据进行具体操作和管理,操作实现简单时可通过注解写在接口中,复杂时写在xml中
package com.slaine.mapper;
import com.slaine.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
//用户名和密码在数据库查询对象
@Select("select * from tb_user where username = #{username} and passwd = #{passwd}")
User select(@Param("username") String username, @Param("passwd") String passwd);
// 验证用户名是否存在
@Select("select * from tb_user where username = #{username}")
User selectByUsername(String username);
//添加用户操作
@Insert("insert into tb_user values(null,#{username},#{passwd})")
void add(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.slaine.mapper.UserMapper">
</mapper>
业务层
Until包
用静态方法一次创建SqlsessionFactory对象方便之后Service中多次调用优化性能
package com.slaine.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtils {
public static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
service包
业务层具体对表现层前端用户输入账密传输到后端数据库校验判定,通过时则正常通过,并根据选项来选择是否返回cookie持久化登录并保存session
package com.slaine.service;
import com.slaine.mapper.UserMapper;
import com.slaine.pojo.User;
import com.slaine.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
public class UserService {
SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
public User login(String username, String passwd) {
SqlSession sqlSession = factory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.select(username,passwd);
sqlSession.close();
return user;
}
public boolean register(User user){
SqlSession sqlSession = factory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User u = mapper.selectByUsername(user.getUsername());
if (u == null){
mapper.add(user);
sqlSession.commit();
}
sqlSession.close();
return u == null;
}
}
表现层
web包
package com.slaine.web;
import com.slaine.pojo.User;
import com.slaine.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
private UserService service = new UserService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取用户名和密码
String username = request.getParameter("username");
String passwd = request.getParameter("passwd");
//获取复选框数据
String remember = request.getParameter("remember");
//2. 调用service查询
User user = service.login(username, passwd);
//3. 判断
if(user != null){
//登录成功,跳转到查询所有的BrandServlet
//判断用户是否勾选记住我
if("1".equals(remember)){
//勾选了,发送Cookie
//1. 创建Cookie对象
Cookie c_username = new Cookie("username",username);
Cookie c_passwd = new Cookie("passwd",passwd);
// 设置Cookie的存活时间
c_username.setMaxAge( 60 * 60 * 24 * 7);
c_passwd.setMaxAge( 60 * 60 * 24 * 7);
//2. 发送
response.addCookie(c_username);
response.addCookie(c_passwd);
}
//将登陆成功后的user对象,存储到session
HttpSession session = request.getSession();
session.setAttribute("user",user);
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/selectAllServlet");
}else {
// 登录失败,
// 存储错误信息到request
request.setAttribute("login_msg","用户名或密码错误");
// 跳转到login.jsp
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}