JavaWeb——Servlet案例用户登录和用户注册和sqllsessionfactory工具类
创始人
2025-05-30 14:13:18
0

用户登录

流程步骤

项目文件结构 

环境准备 

数据库建表语句如下 

-- 创建用户表
CREATE TABLE tb_user(id int primary key auto_increment,username varchar(20) unique,password varchar(32)
);-- 添加数据
INSERT INTO tb_user(username,password) values('zhangsan','123'),('lisi','234');SELECT * FROM tb_user;

 在pojo包下创建数据库属性的实体类如下

public class User {private Integer id;private String username;private String password;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;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

坐标导入

这里有mybatis驱动和mysql驱动程序的依赖,mysql驱动的版本根据自己电脑上mysql版本决定

 org.mybatismybatis3.5.5mysqlmysql-connector-java8.0.31

 创建mybatis核心配置文件

mysql8.0以上版本要加cj

xml里面&是特殊字符要转义使用&




创建mapper包下的接口映射以及resources文件下的对应目录XML文件



mapper映射接口实现

在mybatis接口方法里面有多个参数的话要加上@Param注解做映射将sql语句里面的#{}参数占位符内的名称和@Param()内的参数相对应


public interface UserMapper {/*** 根据用户名和密码查询用户对象* @param username* @param password* @return*/@Select("select * from tb_user where username = #{username} and password = #{password}")User select(@Param("username") String username,@Param("password")  String password);/*** 根据用户名查询用户对象* @param username* @return*/@Select("select * from tb_user where username = #{username}")User selectByUsername(String username);/*** 添加用户* @param user*/@Insert("insert into tb_user values(null,#{username},#{password})")void add(User user);
}

html页面设置

定义如下的表单,action里面的路径要加上虚拟目录

    

LOGIN IN

Username:

Password:

LoginServlet配置

第一步

接收登录界面传来的数据,这里使用Parameter通过键来获取值

String username = request.getParameter("username");String password = request.getParameter("password");

第二步

调用mybatis

获取sqlsessionFactory对象

(通过mybatis配置文件的输入流构建一个sqlsessionFactory对象)

有点像对着施工图纸完成一座工厂,一座专门用于产出sqlsession的工厂

String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

获取sqlsession对象

像是从工厂里面获取一个产品

SqlSession sqlSession = sqlSessionFactory.openSession();

获取Mapper对象

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

调用方法

User user = userMapper.select(username, password);

释放资源

sqlSession.close();

汇总代码: 

@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");//2. 调用MyBatis完成查询//2.1 获取SqlSessionFactory对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.2 获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();//2.3 获取MapperUserMapper userMapper = sqlSession.getMapper(UserMapper.class);//2.4 调用方法User user = userMapper.select(username, password);//2.5 释放资源sqlSession.close();//获取字符输出流,并设置content typeresponse.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();//3. 判断user释放为nullif(user != null){// 登陆成功writer.write("登陆成功");}else {// 登陆失败writer.write("登陆失败");}}

第三步

判断user是否为null

根据查询的不同结果使用response返回不同的响应数据,这里返回的始终所以需要设置字符集为utf-8

 //获取字符输出流,并设置content typeresponse.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();//3. 判断user释放为nullif(user != null){// 登陆成功writer.write("登陆成功");}else {// 登陆失败writer.write("登陆失败");}

这里成功使用数据库里面的账号登陆成功输出如下

失败登陆也有如下

以上就是用户登录的实现 

用户注册

注册流程

 定义mapper映射sql语句

在上面mapper接口实现类里面有了

创建一个新的RegisterServlet

和上面的流程机器相似,这里放全代码,以后有机会在来看两眼

@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收用户数据String username = request.getParameter("username");String password = request.getParameter("password");//封装用户对象User user = new User();user.setUsername(username);user.setPassword(password);//2. 调用mapper 根据用户名查询用户对象//2.1 获取SqlSessionFactory对象/* String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();//2.2 获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();//2.3 获取MapperUserMapper userMapper = sqlSession.getMapper(UserMapper.class);//2.4 调用方法User u = userMapper.selectByUsername(username);//3. 判断用户对象释放为nullif( u == null){// 用户名不存在,添加用户userMapper.add(user);// 提交事务sqlSession.commit();// 释放资源sqlSession.close();}else {// 用户名存在,给出提示信息response.setContentType("text/html;charset=utf-8");response.getWriter().write("用户名已存在");}}

 成功输出如下 

 sqlsessionfactory工具类使用

在LoginServlet和RegisterServlet创建了两次sqlsessionfactory对象,代码重复量极大。

sqlsessionfactory对象都绑定了一个连接池,多个工厂有多个连接池,资源消耗极大。

所以要优化sqlsessionfactory的创建代码

 

创建工具类

public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {//静态代码块会随着类的加载而自动执行,且只执行一次try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSessionFactory getSqlSessionFactory(){return sqlSessionFactory;}
}

这里不把sqlsession对象的创建也放进去是因为

 最后Servlet里面创建工厂时直接调用方法返回值就可以了

 //2.1 获取SqlSessionFactory对象/* String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

相关内容

热门资讯

最新或2023(历届)山西高职... 3月20日前 招生院校制定《自主招生章程》并向社会公布 3月31日至4月1日 考生登陆山西招生考试网...
最新或2023(历届)北京高考...   最新或2023(历届)高考外语口试将于4月11日、12日进行,全市共设六个考点。4月23日起,考...
吉林将10所省重点高校2%招生... 最新或2023(历届)吉林省教育工作会昨日在吉林省宾馆召开。会议总结了最新或2023(历届)我省教育...
使用GPT-4生成QT代码 一、概述 最近ChatGPT火爆起来了,ChatGPT是一种基于GPT的自然语言处理模...
最新或2023(历届)湖南大学... 湖南大学坐落在中国历史文化名城长沙,校区位于湘江之滨、岳麓山下,享有“千年学府,百年名校”之誉。她不...
教育部要求直属高校设置独立内部...  教育部今日公布了《关于加强直属高等学校内部审计工作的意见》(以下简称《意见》),这是第一次专门对直...
报名CSGO/steam游戏搬... 报名CSGO/steam游戏搬砖项目前,这些内幕一定要了解 我相信大多数人都经常困惑...
最新或2023(历届)海南高考... 最新或2023(历届)海南高考一本录取结果查询通知书发放时间,理科录取7214人文科录取1926人海...
最新或2023(历届)上海高考... 最新或2023(历届)上海高考二本线上投档文科院校投档分数线和录取结果查询最新或2023(历届)上海...
css问题 display:none;与visibility:hidden; 与 opacity:0的区别 联系...
最新或2023(历届)延边大学... 最新或2023(历届)延边大学录取通知书发放时间及开学时间和新生入学指南军训须知延边大学(Yanbi...
最新或2023(历届)广东高考... 最新或2023(历届)广东高考二A院校补录征集志愿安排资格线和录取结果查询时间我省二A院校开始征集志...
最新或2023(历届)吉林大学... 最新或2023(历届)吉林大学录取通知书发放时间及开学时间和新生入学指南军训须知 吉林大学于2000...
深度文本分类之DPCNN 文章目录深度文本分类之DPCNNDPCNN结构Region Embedding等长卷积固定Featu...
串行通信协议(I2C、SPI、... 推荐一部书,在这本书里面详细介绍了I2C、SPI、UART和CAN等通信协议ÿ...
最新或2023(历届)上海高考... 一、平行志愿的投档规则1.各招生院校根据生源情况,一般按本校在本批次公布招生计划数的100%至105...
最新或2023(历届)山西高考... 最新或2023(历届)山西高考第一批本科A类院校征集计划第一批本科A类院校征集计划院校院校名称专业专...
最新或2023(历届)海南高考... 最新或2023(历届)海南高考二本录取分数线公布,本科第二批正式投档高招本科第二批正式投档  本报海...
最新或2023(历届)吉林高考... 最新或2023(历届)吉林省普通高校招生录取地方重点高校招收农村学生专项计划批(地方专项计划)第二轮...
最新或2023(历届)山西高考... 最新或2023(历届)山西高考一本征集志愿补录分数线,B类院校征集计划最新或2023(历届)山西高考...