javaweb学习的第6天(2021-11-12)--------登录功能的实现

发布时间:2022-06-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javaweb学习的第6天(2021-11-12)--------登录功能的实现脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

思想:

根据前端登陆表单里面传过来的username和password值,去mysql数据库里面查询 select * from user where username=? and password=? 看看查出来的数据是null还是有值来判断登陆是否成功。 使用普通的JDBC的方式。

1、创建后台用户表user

javaweb学习的第6天(2021-11-12)--------登录功能的实现

javaweb学习的第6天(2021-11-12)--------登录功能的实现

2、创建java bean

javaweb学习的第6天(2021-11-12)--------登录功能的实现

package com.rtl.bean;

public class User {
    private Integer id;
    private String uname;
    private String upwd;

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpwd() {
        return upwd;
    }

    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", uname='" + uname + ''' +
                ", upwd='" + upwd + ''' +
                '}';
    }
}

3、创建接口:UserDao

javaweb学习的第6天(2021-11-12)--------登录功能的实现

package com.rtl.dao;

import com.rtl.bean.User;

public interface UserDao {
    User getUserByNameAndPwd(String uName,String uPwd);
}

4、创建接口实现类:(这里实现了JDBC的连接)

javaweb学习的第6天(2021-11-12)--------登录功能的实现

package com.rtl.daoImpl;

import com.rtl.bean.User;
import com.rtl.dao.UserDao;

import java.sql.*;

public class UserDaoImpl implements UserDao {
    @Override
    public User getUserByNameAndPwd(String uName, String uPwd) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
                User user = null;
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/servlet";
            String name = "root";
            String password = "root";
            conn = DriverManager.getConnection(url, name, password);
            String sql = "SELECT id,uname,upwd FROM user WHERE uname=? AND upwd=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,uName);
            ps.setString(2,uPwd);
            rs = ps.executeQuery();
            if(rs.next()){
                user = new User();
                user.setId(rs.getInt(1));
                user.setUname(rs.getString(2));
                user.setUpwd(rs.getString(3));
                return user;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return user;
    }
}

5、写LoginServlet类;

javaweb学习的第6天(2021-11-12)--------登录功能的实现

package com.rtl.login.servlet;

import com.rtl.bean.User;
import com.rtl.dao.UserDao;
import com.rtl.daoImpl.UserDaoImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UserDao userDao = new UserDaoImpl();
        User user = userDao.getUserByNameAndPwd(username, password);
        if(user != null){
            out.println("<h1><font color='green'>success<font></h1>");
        }else{
            out.println("<h1><font color='red'>failed<font></h1>");

        }


    }
}

6、引入mysql连接器

javaweb学习的第6天(2021-11-12)--------登录功能的实现

7、web.xml配置文件:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.rtl.login.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>

8、login.html

javaweb学习的第6天(2021-11-12)--------登录功能的实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body bgcolor="#ffc0cb">
<div>
  <form action="login" method="post">
    <h1>欢迎登录</h1>
    用户名称:<input type="text" name="username">
    <br>
    用户密码:<input type="password" name="password">
    <br>
    <input type="submit" name="login" value="login">
  </form>
</div>
</body>
</html>

浏览器验证效果: 输入URL: http://localhost:8080/login/login.html 进入登陆页面

javaweb学习的第6天(2021-11-12)--------登录功能的实现

输入admin和admin 点击登陆

javaweb学习的第6天(2021-11-12)--------登录功能的实现

输错了:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

改进版:

将数据库连接的获取封装成工具类。 1、右键src新建文件 db.properties 2、写ConnectionUtils 使用静态代码块读取配置文件db.properties 因为静态代码块只会执行一次。 再使用ThreadLocal技术,来保证同一个进程里面只有一个连接。 以往就是要一个连接就开一个,很浪费。 使用类加载器来读取db.properties配置文件。 不能使用之前的

props.load(new FileInputStream());

这种方式只是适合本地项目。 但是我们现在的项目以后是要部署到Tomcat服务器上运行。 所以必须采用以下方式读取文件。 使用类加载器读取文件

1、新建一个连接的工具类:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

package com.rtl.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class ConnectionUtils {

    private static String driver = null;
    private static String url = null;
    private static String username= null;
    private static String password = null;
    private static Properties props = new Properties();
    private static ThreadLocal<Connection> tl =new ThreadLocal<>();

    static{
        //
        try {
            InputStream is = ConnectionUtils.class.getClassLoader().getResourceAsStream("db.properties");
            props.load(is);
            driver = props.getProperty("jdbc.driver");
            url = props.getProperty("jdbc.url");
            username = props.getProperty("jdbc.username");
            password = props.getProperty("jdbc.password");
            //这个也是只会执行一次。所以也选择放在这里。
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConn() throws SQLException {
        Connection conn = tl.get();
        if(conn == null){
            conn = DriverManager.getConnection(url, username, password);
            tl.set(conn);
        }
        return conn;
    }

    public static void closeConn() throws SQLException {
        Connection conn = tl.get();
        if(conn != null){
            conn.close();
        }
        tl.set(null);

    }

    public static void main(String[] args) throws SQLException {
        Connection conn = ConnectionUtils.getConn();
        System.out.println(conn);
    }
}

2、配置文件:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/servlet?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
jdbc.username=root
jdbc.password=root

3、细节:jar包要要是这样的。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

请求重定向:

登陆的时候,错误的时候,直接再次进入登陆页面。 重定向的状态码:302 服务器会给浏览器发送一个302的状态码以及一个新的地址

javaweb学习的第6天(2021-11-12)--------登录功能的实现

if(user != null){
            out.println("<h1><font color='green'>success<font></h1>");
        }else{
            resp.sendRedirect("login.html");

        }

修改这里的代码。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

现在就是: 登陆错误的时候,会重新回到登陆页面,但是

问题是:没有错误提示。 补充错误提示功能。

结合请求转发和JSP页面来做。

JSP技术是运行再服务器端的。 JSP可以写HTML代码,也可以写java代码,还有JSP标签 JSP本质就是Servlet Servlet擅长处理业务 JSP擅长处理服务器页面 注意: JSP页面是和html页面结构同级的。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

他们都不在WEB-INF里面

在jsp页面里怎么写java片段:

1、随便写

javaweb学习的第6天(2021-11-12)--------登录功能的实现

2、写表达式。 表达式一定要给一个输出的结果。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

解释JSP页面的执行原理。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

HTML,css, js ,表达式代码呢? 通过输出流out.write()往出写 java代码呢?照搬!!

javaweb学习的第6天(2021-11-12)--------登录功能的实现

JSP真正的作用:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

现在准备: 将原先登陆的页面由login.html换成login.jsp 使用jsp技术来展示页面。 那么,重定向的时候应该写成login.jsp 完全把login.html的代码换成login.jsp就行了。 新建login.jsp

javaweb学习的第6天(2021-11-12)--------登录功能的实现

修改LoginServlet里面登陆错误的时候,重定向到jsp里面。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

浏览器: http://localhost:8080/login/login.jsp

javaweb学习的第6天(2021-11-12)--------登录功能的实现

现在使用jsp页面展示登陆页面之后,我们还需要再

登陆失败的时候,不仅能够回到这个页面,还需要在用户名称后面写上一个提示:用户名或者密码错误。 这个即使叫做:转发技术。

一定要区分请求转发和请求重定向的区别。

请求转发:是服务器内部的转发。 只能转发给当前服务器里面的某个组件 客户端浏览器向服务器发送了一个登陆请求,服务器中的Servlet只能处理,这个登陆是否成功。具体成功或者失败需要返回的页面交给JSP去做,JSP也是服务器这里的组件之一。所以请求转发是服务器内部的转发。

请求重定向:可以重定向到任何一个地方。 点击登陆,进入LoginServlet的doPost方法,里面使用response的sendRedirect方法,传入一个地址参数。这个就叫做重定向。 如果是登陆失败,再回到登陆页面,那就再写登陆页面的地址。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

请求转发只有一次请求,一次请求就只有一个请求对象和响应对象。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

需要将登陆失败这个信息绑定到request上面,然后由LogServlet传递给JSP。

三行代码:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

1、修改LogServlet里面doPost()里面登陆失败的处理逻辑。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

2、再次编写jsp页面。 jsp页面需要显示错误信息。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

javaweb学习的第6天(2021-11-12)--------登录功能的实现

浏览器: http://localhost:8080/login/login.jsp 发现一个问题:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

还没登陆,第一次进入登陆页面就会出现这个null。 登陆 错误导致的,可以。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

解决第一次输入:

http://localhost:8080/login/login.jsp 进入登陆页面,右边出现null的问题。 之前的jsp:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

现在的jsp:

javaweb学习的第6天(2021-11-12)--------登录功能的实现

javaweb学习的第6天(2021-11-12)--------登录功能的实现

javaweb学习的第6天(2021-11-12)--------登录功能的实现

解释: 刚才在jsp里面写java片段的时候:

<%
            String logingMsg = (String)request.getAttribute("login_msg");
        %>

这里的request对象是哪里来的? JSP里面的内置对象。是从LoginServlet那边传过来的。

九大内置对象:(15678是重要)

1、out:JspWriter 4、pageContext:相当于当前页面的上下文,jsp页面本质是一个Servlet,这个pageContext代表整个Servlet(在后面EL表达式有用到) 5、servletContext:整个web app只有一个 6、request: 7、response 8、session

之前使用请求转发+JSP技术实现,登陆失败之后提示及跳转的功能。 现在准备改进:使用EL实现同样功能。

实际开发中: jsp页面中少出现java代码 EL是JSP内置的表达式语言。 EL的基本语法:

${}

EL表达式用来代替JSP的

<%=%>

JSP里面的四大域对象:

1、最小的: pageContext:代表当前整个JSP页面 2、 requestScope: 当前请求的域对象

3、sessionScope 当前会话的(后面讲)

4、applicationScope 整个web的,这个最大的域范围。

EL取对象的时候,没有指定,默认从小范围到大范围。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

我们在登陆失败处理的时候: 将输出的提示错误信息,已经绑定到request对象里面去了

javaweb学习的第6天(2021-11-12)--------登录功能的实现

所以,后面EL表达式,应该获取requestScope这个域对象。

javaweb学习的第6天(2021-11-12)--------登录功能的实现

javaweb学习的第6天(2021-11-12)--------登录功能的实现

javaweb学习的第6天(2021-11-12)--------登录功能的实现

一个小细节就是: 使用EL表达式,不需要像前面写java代码那样判断是否log_msg为null 它会自动判断,有数据,输出,没有数据,啥也不输出。

现在功能实现了。

但是有个缺陷: 我登陆—>失败---->提示我用户名或者密码错误–>我重新点击文本框准备第二次输入账号密码,这个时候,右边的提示信息:用户名或者密码错误一直还在,这个很恶心。

改进:在我准备第二次重新输入账号密码的时候,右边错误信息消失。 不要一直显示。 这个使用到的技术是:javaScript

介绍JS

它可以写到HTML,也可以写到JSP里面。 由客户端浏览器来执行。 弱类型,

javaweb学习的第6天(2021-11-12)--------登录功能的实现

javaweb学习的第6天(2021-11-12)--------登录功能的实现

脚本宝典总结

以上是脚本宝典为你收集整理的javaweb学习的第6天(2021-11-12)--------登录功能的实现全部内容,希望文章能够帮你解决javaweb学习的第6天(2021-11-12)--------登录功能的实现所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:数据库