【学习日记】使用Servlet实现简单的登陆注册功能

【个人学习笔记】使用Servlet实现简单的登陆注册功能

开发环境:IDEA2019、Tomcat7.0、Mysql5.5.5、Wampserver64

  1. 新建文件
    打开IDEA新建一个Java Web Application项目,选择tomcat,输入一些必要信息直到finish。
    在这里插入图片描述此次开发需要用到两个jar包
    JSP标准标签库(JSTL)
    mysql-connector-java
    选择自己适合的版本下载好之后在IDEA中导入 File -> Project Structure -> Project Settings -> Module -> Dependencies 点击+号添加jar包
    在这里插入图片描述

  2. 文件目录介绍
    初始目录下只有一个src文件夹(空)和web目录,在src文件夹下新建文件目录如图所示
    在这里插入图片描述其中:
    dao 文件夹下类主要处理与数据库的交互,登录和注册主要用到查询和插入数据库功能;
    model 文件夹主要存放实体类信息,我们只需要用到user实体类;
    service 文件夹主要存放一些业务类,个人理解为在dao层对数据库进行操作时对数据进行一个预处理;
    servlet 文件夹主要作为控制层来处理表单发送的数据,即处理用户的请求信息;
    test 文件夹主要用于开发过程中测试功能;
    util 文件夹主要存放一些工具类,例如数据库连接、数据处理方法等。
    Web 文件下主要存放需要用到的jsp文件以及一些网页的静态资源;

  3. 连接数据库工具类
    在Util 工具类中,本次仅需要用到连接数据库的功能,当然也可以在该工具类中声明一个用于判断数据是否有效的判断类,但时间关系没有用到。
    新建一个class类DBUtil,主要用于连接数据库和关闭连接

import java.sql.*;
public class DBUtil {

    //建立连接
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = //此处的3306对应安装的mysql的端口号、asd对应选择的数据库名、最后两个参数分别表示mysql用户名和密码
             DriverManager.getConnection("jdbc:mysql://localhost:3306/asd?useSSL=false","root","");
       
        return connection;
    }
    //关闭连接
    public static void closeAll(ResultSet rs, Statement stmt, Connection conn) throws SQLException {
        if(rs!=null){
            rs.close();
        }
        if(stmt!=null){
            stmt.close();
        }
        if(conn!=null){
            conn.close();
        }
    }
}

连接好数据库之后,在Dao目录下新建一个用于访问数据库的UserDao类,实现对数据库的查询和插入操作

import com.shixi.model.User;
import com.shixi.util.DBUtil;
import java.sql.*;

public class UseDao {
	//登陆查询数据库
    public User selectByName(String name) throws SQLException {
        ResultSet rs = null;
        Connection conn = null;
        PreparedStatement pstmt = null;
        DBUtil util = new DBUtil();
        User user = new User();
        try{
            conn = util.getConnection();
            pstmt = conn.prepareStatement("select * from user where name = ?");
            pstmt.setString(1,name);
            rs = pstmt.executeQuery();
            while(rs.next()){
                user.setId(rs.getInt(1));  //第几个字段
                user.setName(rs.getString(2));
                user.setPassword(rs.getString(3));
                user.setAge(rs.getString(4));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            util.closeAll(rs,pstmt,conn);
        }
        return user;
    }
	//注册插入数据库
    public boolean insertUserInfo(String name, String password) throws SQLException, ClassNotFoundException {
        ResultSet rs = null;
        Connection conn = null;
        PreparedStatement pstmt = null;
        DBUtil util = new DBUtil();
        boolean flag = true;
        try {
            conn = util.getConnection();
            pstmt = conn.prepareStatement("insert into user values(null,?,?,null)");
            pstmt.setString(1, name);
            pstmt.setString(2, password);
            pstmt.execute();
        }catch(Exception e){
                e.printStackTrace();
        }finally {
                util.closeAll(rs,pstmt,conn);
        }
        return flag;
    }

}

【踩坑心得】:插入数据库时需要使用pstmt.execute()方法而非查询的query方法,并且返回一个布尔值,当提取到的首条数据是存在的即返回true否则返回false,此处我们只需要执行了该语句,不需要用到返回的值,因此只要执行了该语句,就设置返回true。
此外此处的insert语句只需要账号和密码,因此我们需要将数据库中的id字段设置为自增长,并且将age字段设置为默认为空。

  1. 实体类和业务类
    在model目录下新建一个实体类User,声明User中的各个属性
public class User {
    private int id;
    private String name;
    private String password;
    private String age;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

在Service目录下新建一个处理User的业务类UserService,联合dao一同使用对数据处理。

import com.shixi.dao.UseDao;
import com.shixi.model.User;
import java.sql.SQLException;

public class UserService {
    static UseDao useDao = new UseDao();
    public static User selectByName(String name) throws SQLException {
        return  useDao.selectByName(name);
    }
    public static boolean insertUserInfo(String name, String password) throws SQLException, ClassNotFoundException {
        return useDao.insertUserInfo(name,password);
    }
}
  1. Servlet类
    Servlet在web.xml文件中进行配置,作为控制层对从jsp发送的表单数据进行处理,包含了doPost方法和doGet方法,LoginServlet和RegisterServlet分别处理登陆和注册

LoginServlet

import com.shixi.model.User;
import com.shixi.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

public class LoginServlet extends HttpServlet {

    UserService userService = new UserService();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        String name = req.getParameter("name");
        String password = req.getParameter("password");
       
        User user = null;
        try {
            user = userService.selectByName(name);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if(password.equals(user.getPassword())){
            resp.getWriter().write("success");
        }else{
            resp.getWriter().write("failed");
        }
    }
}

RegisterServlet:

import com.shixi.model.User;
import com.shixi.service.UserService;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;

public class RegisterServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp){
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        System.out.println(name+" "+password);
        boolean flag = false;
        try {
            flag = UserService.insertUserInfo(name,password);
            System.out.println(flag);
            if(flag){
                req.setAttribute("success","注册成功,请登录");
                req.getRequestDispatcher("index.jsp").forward(req,resp);
            }else{
                req.setAttribute("error","注册失败,请重试");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. jsp和web.xml配置
    一共用到两个jsp页面,分别是login.jsp和register.jsp(这里当初直接使用了index.jsp作为登陆界面,没有重写一个login)里面就一些基础的html布局,做的很简单。

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>登陆</title>
  </head>
  <body style="margin:0px auto; width:900px; text-align: center">
    <div >
      <h1>登陆界面</h1>
      <form action="${pageContext.request.contextPath}/login" method="post">

          <div>
            <%--@declare id="user"--%><label for="user">帐号: <input name="name" type="text"></label>
          </div>
          <div>
            <%--@declare id="password"--%><label for="password">密码: <input name="password" type="password"></label>
          </div>
          <div>
          <input type="submit" value="登陆">
          <input type="button" value="注册"onclick="javascript:window.location.href='register.jsp'">
          </div>

      </form>
    </div>
  </body>
</html>

register.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body style="margin:0px auto; width:900px; text-align: center">
<div>
    <h1>注册界面</h1>
        <form action="${pageContext.request.contextPath}/register" method="post">
        <div>
            <%--@declare id="user"--%><label for="user">账号: <input name="name" type="text"></label>
        </div>
        <div>
            <%--@declare id="password"--%><label for="password">密码: <input name="password" type="password"></label>
        </div>
        <div>
            <input type="button" value="返回"onclick="javascript:window.location.href='index.jsp'">
            <input type="submit" value="注册">
        </div>
    </form>
</div>
</body>
</html>
  1. 注册和登陆结果
    注册过程和用到的类主要有如下关系
    在这里插入图片描述运行结果:
    register.jsp页面
    在这里插入图片描述输入账号和密码进行注册,在数据库中即可添加,添加成功后会自动跳转到登陆界面
    在这里插入图片描述
    login.jsp页面:
    在这里插入图片描述输入刚才注册的账号密码,登陆成功
    在这里插入图片描述
  2. 遇到的问题
    (1) execute()和executeQuery()问题
    executeQuery()主要用于查询数据而execute()主要用于更新和插入数据。
    (2)sql语句的规范问题
    进行注册时,之前用的语句为
insert into user (name,password)values(?,?)

就会语句报错,后改成现UseDao中的

insert into user values(null,?,?,null)

即可。
(3)Servlet配置问题
我在配置tomcat启动的时候将url配置为当前deployment下的路径,因此在jsp中的action的路径没有加上该部分,这里找到一个便捷的路由配置方法,可以自动匹配tomcat中配置的url。

<form action="${pageContext.request.contextPath}/login" method="post">
  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值