JavaWeb小项目(一)- 用户登录与注册(Request/Response综合应用)
涉及技术栈:Java,Servlet(Request/Response),Tomcat,MySql,MyBatis
需要自行导入的包链接:提取码:6666
文章目录
用户登录
业务逻辑
- 用户填写用户名密码,提交到 LoginServlet
- 在 LoginServlet 中使用 MyBatis 查询数据库,验证用户名密码是否正确
- 如果正确,响应"登录成功",如果错误,响应“登录失败”
环境搭建
-
将静态页面项目到webapp目录下(资源路径:)
-
创建 db1 数据库,创建 tb_user 表,并导入实验数据
-
在com.itheima下创建pojo包,并在该包下创建 User 实体类
/** * 在com.itheima.web下创建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; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
-
在pom.xml 配置文件中导入 MyBatis 坐标,MySQL驱动坐标
<!-- 导入mybatis坐标 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!-- 注意事项:Mysql驱动需要尽可能用最新版本,否则版本过低会无法连接数据库 导致报错 --> <!-- 导入Mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency>
-
在 resourses 资源目录下创建 mybatis-config.xml 核心配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--起别名--> <typeAliases> <package name="com.itheima.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true"/> <property name="username" value="root"/> <property name="password" value="XXX"/> </dataSource> </environment> </environments> <mappers> <!--扫描mapper--> <package name="com.itheima.mapper"/> </mappers> </configuration>
-
在 resources 资源文件夹下创建com.itheima.mapper包,并创建UserMapper.xml 映射文件;
<?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.itheima.mapper.UserMapper"> </mapper>
-
在com.itheima下创建 mapper包,创建 UserMapper 接口
public interface UserMapper { }
业务逻辑实现
- 添加 UserMapper 接口新功能
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); }
- com.itheima目录下创建 LoginServlet,并实现对应的登录处理逻辑
@WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } }
运行效果
- 登录界面:
- 登录成功
- 登录失败
用户注册
业务逻辑
- 用户填写用户名,密码等信息,点击注册按钮,提交到 RegisterServlet
- 在 RegisterServlet 中使用 MyBatis 保存数据
- 保存前,需要判断用户名是否已经存在:即根据用户名查询数据库
业务逻辑实现
-
添加 UserMapper 接口新功能
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); }
-
创建 RegisterServlet 并实现注册业务逻辑处理代码
@WebServlet("/registerServlet") public class RegisterServlet extends HttpServlet { protected void doPost(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); //2.2 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //2.3 获取Mapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //2.4 调用方法 User u = userMapper.selectByUsername(username); //3.判断用户对象是否为null if(u==null){ //用户名不存在,添加用户 userMapper.add(user); //提交事务 sqlSession.commit(); //注册成功提示 response.setContentType("text/html;charset=utf-8"); response.getWriter().write("用户注册成功"); //释放资源 sqlSession.close(); }else{ //用户名存在,给出提示信息 response.setContentType("text/html;charset=utf-8"); response.getWriter().write("用户名已存在"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
运行效果
-
注册页面
-
注册成功
-
用户存在
代码优化
问题引入
- 代码重复:通过创建工具类将代码简化
- SqlSessionFactory 工厂只创建一次,不需要重复创建静态代码块
解决方案
创建创建 util 包,并在该包下创建SqlSessionFactoryUtils类
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
//静态代码块随着类的加载回自动执行,且执行一次
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getsqlSessionFactory(){
return sqlSessionFactory;
}
}
将XXXServlet该段代码替换为
/*String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getsqlSessionFactory();