# 只用Servlet搞定登录与注册

# 基础项目环境的搭建

  1. 使用maven的web项目结构创建项目,并添加核心的java目录

  2. 引入插件

    pom.xml

    <dependencies>
            <!--apache io工具类        -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.11.0</version>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.11</version>
            </dependency>
    
            <dependency>
                <groupId>org.mariadb.jdbc</groupId>
                <artifactId>mariadb-java-client</artifactId>
                <version>3.0.7</version>
            </dependency>
    
        </dependencies>
        <build>
            <finalName>servlet</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
            </plugins>
    </build>
    
    

# Mybaits配置

  1. 创建数据表

  2. 编写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="top.brightzm.pojo"/>
        </typeAliases>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--数据库连接信息 -->
                    <property name="driver" value="org.mariadb.jdbc.Driver"/>
                    <property name="url" value="jdbc:mariadb://127.0.0.1:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value="ROOT"/>
                </dataSource>
            </environment>
        </environments>
        <!--扫描mapper -->
        <mappers>
            <package name="top.brightzm.mapper"/>
        </mappers>
    
    </configuration>
    
  3. 编写sql映射文件 UserMapper.xml

    注意路径 top/brightzm/mapper

    <?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="top.brightzm.mapper.UserMapper">
    
        <!--查询用户 -->
        <select id="select" resultType="top.brightzm.pojo.User">
            SELECT * FROM tb_user2
            WHERE username = #{username}
            AND password = #{password}
        </select>
        <select id="selectByName" resultType="User">
            SELECT *
            FROM tb_user2
            WHERE username = #{username};
        </select>
    
        <!-- 创建用户 -->
        <insert id="add">
            INSERT INTO tb_user2(username, password)
            VALUES (#{username}, #{password})
        </insert>
    
    </mapper>
    
  4. 编写pojo类 User.java

    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 + '\'' +
                    '}';
        }
    }
    
    
  5. 编写mapper接口 UserMapper.java

    注意路径

    public interface UserMapper {
        User select(@Param("username") String username, @Param("password") String password);
    
        User selectByName(@Param("username") String username);
    
        void add(User user);
    
    }
    

# 编写servlet核心代码

  1. 静态文件编写

    form表单 action指向servlet的url

  2. 编写SqlSessionFactory工具类

    public class SqlSessionFactoryUtils {
        // SqlSessionFactory对象获取
    
        private static SqlSessionFactory sqlSessionFactory;
    
        static {
            try {
                String resources = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resources);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e){
                e.printStackTrace();
            }
        }
    
    
        public static SqlSessionFactory getSqlSessionFactory(){
            return sqlSessionFactory;
        }
    
    }
    
  3. login servlet

    @WebServlet("/login")
    public class login extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 获取用户名和密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
    
            // 调用Mybatis完成查询
            // 获取sqlSessionFactory对象 和sqlSession对象
            SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 获取mapper并查询
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
            User user = mapper.select(username, password);
    
            sqlSession.close();
    
            // 判断user是否为null并输出信息
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            if (user != null) {
                // 登陆成功
                writer.write("登陆成功");
            } else {
                // 登陆失败
                writer.write("登陆失败");
            }
    
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
  4. register servlet

    @WebServlet("/register")
    public class register extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 注册的实现
            // 获取用户名和密码
            String newName = req.getParameter("username");
            String newPassword = req.getParameter("password");
    
            User newUser = new User();
            newUser.setUsername(newName);
            newUser.setPassword(newPassword);
    
            // 使用mybatis添加用户
            // 获取sqlsession
            SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
            
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 获取mapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 判断用户名是否重复
            User user = mapper.selectByName(newName);
            boolean result = user == null;
    
            // 添加用户并返回信息
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter writer = resp.getWriter();
            if (result){
                mapper.add(newUser);
    
                // 提交事务
                sqlSession.commit();
                sqlSession.close();
                
                writer.write("注册成功");
            }else {
                writer.write("用户名重复");
            }
            
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    

    运行项目 完成