基于servlet+原生dbc的登录案例(含servlet知识点梳理)


前言

为什么写这篇文章:我的一篇学习笔记,同时分享给大家,互帮互助共同进步。
适宜人群:java初学者
你将学习到:servlet相关知识
条件:java开发相关环境(jdk、mysql、Tomcat、idea)
资料参考:网络,https://blog.csdn.net/qq_19782019/article/details/80292110

注意:本文仅供学习使用,如有侵权,请联系作者删除。

一、servlet知识点梳理

1.什么是servlet

servlet是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet技术的核心是Servlet,它是所有Servlet类必须直接或者间接实现的一个接口。

2.servlet是如何工作的?

  • 客户端发送请求到服务器
  • 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
  • 服务器将响应返回客户端

3.servlet的工作原理

用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。

4.servlet接口中定义的5个方法

  • init():只有在servlet第一次被请求时会调用此方法,调用这个方法时,Servlet容器会传入一个ServletConfig()对象进来从而对Servlet对象进行初始化。
  • getServletConfig:这个方法会返回Servlet的一段描述,可以返回一段字符串。
  • service():每当请求Servlet时,Servlet容器就会调用这个方法。
  • getServletInfo():返回Servlet的一段描述,返回由Servlet容器传给init( )方法的ServletConfig对象。
  • destroy():当Servlet被销毁时,Servlet容器就会调用这个方法,一般在这个方法中会写一些清除代码。

5.servlet的生命周期

init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。

1.init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用,就像人只能“出生”一次一样。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。
2.service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。就像人一样,需要不停的接受老板的指令并且“工作”。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
3.destory,当要销毁Servlet时,Servlet容器就会调用这个方法,就如人一样,到时期了就得死亡。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。

6.ServletRequset接口

Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法。其中,ServletRequest对象内封装了关于这个请求的许多详细信息。
方法:
在这里插入图片描述

7.ServletResponse接口

ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。
方法:
在这里插入图片描述

8.ServletContext对象

有了ServletContext对象,就可以共享从应用程序中的所有资料处访问到的信息,并且可以动态注册Web对象。
方法:
在这里插入图片描述

9.解决Request的乱码问题

post提交方式:

request.setCharacterEncoding("UTF-8");

get提交的方式:

parameter = newString(parameter.getbytes("iso8859-1"),"utf-8");

10.解决Response的乱码问题

 response.setContentType("text/html;charset=utf-8");

上面这行代码做了两件事情:设置HttpServletResponse使用utf-8编码,通知浏览器使用utf-8编码。

11.会话跟踪技术(cookie和session)

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
(1)什么是cookie
可以理解为服务器给客户端们颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了
(2)什么是session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
(3)cookie和session的区别

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • 安全性方面来说,session要比cookie安全。
  • 存储容量方面,单个cookie保存的数据不能超过4K,Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型。
  • 生存周期不同,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)

二、基于servlet+jdbc的登录案例

1.需求分析

(1)编写login.html登录页面,username & password两个输入框
(2)使用原生JDBC操作数据库
(3)登录成功,跳转到Success页面,显示“登陆成功。用户名,欢迎您”
(4)登录失败,跳转到Fail页面,显示“登录失败,用户名或密码错误”

2.准备以下文件

(1)login.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>

<body>
	<form action="/servlet/loginServlet" method="post">
	用户名:<input type="text" name="username"><br>
	密码:<input type="password" name="password"><br>
	<input type="submit" value="登录">
	</form>
</body>

</html>

注意路径,form表单里的action属性对应自己的

(2)jdbc.properties

url=jdbc:mysql:///servlet
user=root
password=root
driver=com.mysql.jdbc.Driver

这里的servlet为我的数据库

(3)相关jar包
链接:https://pan.baidu.com/s/1MHayI9JG3XcMqaUlzwUC_w
提取码:c9hc
复制这段内容后打开百度网盘手机App,操作更方便哦
在这里插入图片描述
(4)创建数据库环境

CREATE DATABASE servlet;
USE servlet;
CREATE TABLE user(
		id INT PRIMARY KEY AUTO_INCREMENT,
		username VARCHAR(32) UNIQUE NOT NULL,
		password VARCHAR(32) NOT NULL
);

数据库创建好后,可以自己添加一两行测试数据

3.创建新的javaEE项目

在这里插入图片描述

4.将login.html复制到web目录下,将jdbc.properties复制到src下

在这里插入图片描述

5.导入jar包

链接:https://pan.baidu.com/s/1VTTv4tF0Oxa_UXDoE3Sdxw
提取码:3c92
复制这段内容后打开百度网盘手机App,操作更方便哦
在这里插入图片描述
在这里插入图片描述

6.编写Dao

在这里插入图片描述

public class UserDao {
    /**
     * 登录方法
     *
     * @param username
     * @param password
     * @return
     */
    public boolean login(String username, String password) {
        if (username == null || password == null) {
            return false;
        }

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            //获取连接
            conn = JDBCUtils.getConnection();
            //定义SQL
            String sql = "select * from user where username = ? and password = ?";
            //获取执行SQL的对象
            pstmt = conn.prepareStatement(sql);
            //给问号赋值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //执行查询,获取结果集对象
            rs = pstmt.executeQuery();
            //判断结果
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, pstmt, conn);
        }

        return false;
    }
}

7.创建JDBC工具类

在这里插入图片描述

public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;


    /**
     * jdbc.properties文件的读取
     */
    static {
        try {
            Properties pro = new Properties();
            //获取src路径下的文件
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();
            pro.load(new FileReader(path));

            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     *
     * @return
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /**
     * 释放资源
     *
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

8.编写LoginServlet类

在这里插入图片描述
(1)LoginServlet

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("utf-8");
        //获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //调用UserDao的login方法
        boolean flag = new UserDao().login(username, password);
        //判断
        if (flag) {
            //存储数据
            req.setAttribute("username",username);
            //转发
            req.getRequestDispatcher("/successServlet").forward(req,resp);

        } else {
            req.getRequestDispatcher("/failServlet").forward(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

(2)SuccessServlet

@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取request域中共享的数据
        String username = (String) request.getAttribute("username");
        //设置编码
        response.setContentType("text/html;charset=utf-8");
        //输出
        response.getWriter().write("登录成功!"+username+"欢迎你。");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

(3)FailServlet

@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        response.setContentType("text/html;charset=utf-8");
        //输出
        response.getWriter().write("登录失败,用户名或密码错误");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

9.启动Tomcat展示结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值