java servlet实现登录-jdbc连接数据库

1.先说前后端交互方式:

路由控制方式两种:

  • web.xml里面添加servlet映射
  • 注解的方式

1.web.xml方式

  <servlet>
     <!-- 类名 随便取-->
    <servlet-name>login-check</servlet-name>
    <!-- 所在的包  导入本地的servlet类 -->
    <servlet-class>Controller.Loginservlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <!--与上方servlet-name保持一致-->
    <servlet-name>login-check</servlet-name>
    <!-- 自己设置 访问的网址路由  -->
    <url-pattern>/servlet/login-check</url-pattern>
    </servlet-mapping>

前端页面这样的:
(这个action=“与上方自己web.xml里面设置的路径要一样”,那么提交表单的时候,就会访问到你的servlet那个类去了。)
在这里插入图片描述

2.注解的方式(推荐)

意思是我们不需要在web.xml里面再写servlet映射了,我们在后台servlet类里面上方注解路径就可以了。
在这里插入图片描述
前端页面 action指向的话就是与注解的路径保持一致。 上面我注解的是/login-check,那么页面action=“/login-check”

在这里插入图片描述

通过上述方法,就可以讲前后台连接起来了。

2.后台servlet类跳转方法

两种方法:一种是服务器跳转,一种是客户端跳转。
客户端跳转,意味着前台展示的页面的连接地址会变化,服务端跳转就是当前页面路径不变,但展示的内容变了。

客户端跳转:resopnse.sendRedirect("/success.jsp")
服务端跳转:request.getRequestDispatcher("/success.jsp").forward(request, response);

(比如我这里登录验证密码 密码正确就重定向到logined.jsp页面)
在这里插入图片描述

3.用servlet实现登录 前后台交互

最重要的目录结构:
在这里插入图片描述

采取MVC架构,分离不同的文件。
Controller控制前后台数据的,页面交互的。
Model就是存放数据库模型类,也写一些关于这个表的一些方法。
View视图就是在web目录里,存放一些静态文件。

登录的流程:
1.用户前端输入数据 action指向到后台的servlet函数类Loginservlet,进行处理验证密码,然后返回数据或者页面。

前端页面:index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 张川
  Date: 2020/5/15
  Time: 15:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  pageEncoding="UTF-8" %>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>川 | 学生信息查询系统</title>
  <link rel="shortcut icon"href="./static/images/favicon.ico">
  <link rel="stylesheet"  href="./static/css/login.css">
</head>
<body>
<div class="sign-in-wrap">
  <pre ><h1 id="aa"></h1></pre>
  <div class="title"  style="display:none" id="w">外网-重邮学生信息查询理系统</div>
  <form method="post" action="/login-check" class="gh-signin" id="html_element">
    <input tabindex="1" name="username" placeholder="姓名" autofocus="" type="text" class="gh-input">
    <input tabindex="2" name="password" placeholder="密码" type="password" class="password gh-input ember-view">
    <input tabindex="3" type="submit" class="login-button" value="登录">
  </form>
  <footer class="c-login__footer">
    <a class="c-login__footer-link pull-left" href="register.jsp">注册账户</a>
    <a class="c-login__footer-link pull-right" href="https://zhangchuan.blog.csdn.net">作者</a>
  </footer>
</div>
</body>
<script style="display:none"  src="./static/js/login.js"></script>

</html>

后台LoginServlet验证登录:

package Controller;

import Model.ClassMethod.Userdatabase;
import Model.domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @Author zhangchuan
 * @Date 2020-05-15
 */

@WebServlet("/login-check")
public class LoginServlet extends HttpServlet {
    
    

    private static final long serialVersionUID = 1L;

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    
    
        request.setCharacterEncoding("utf-8");
        PrintWriter out=response.getWriter ();
        //接收表单信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //根据用户名查询用户
        User user = null;
        try{
    
    
            user =new Userdatabase ().findUser(username);

        }
        catch(Exception e){
    
    
            System.out.println ("findUser方法错误");
        }

        if(user.getUsername ()!=null){
    
    
            if(((User) user).getPassword().equals(password)){
    
    
                HttpSession session=request.getSession ();
                session.setAttribute("username", username);
                session.setAttribute("password", password);
                response.sendRedirect("../admin/logined.jsp");
            }else {
    
    
                out.print ("<script language='javaScript'> alert('password is error');</script>");
                response.setHeader ("refresh", "0;url=../index.jsp");
            }
        }else {
    
    
            out.print ("<script language='javaScript'> alert('this user not exists ');</script>");
            response.setHeader ("refresh", "0;url=../index.jsp");

        }

    }

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

    }

}

Userdatabase用户的一些方法:

package Model.ClassMethod;


import Model.domain.User;
import Util.JDBCUtil;

import java.sql.*;


/**
 * @Author zhangchuan
 * @Date 2020-05-27
 * User表控制用户
 */
public class Userdatabase{
    
    

    //根据用户名查找用户密码
    public User findUser(String username) {
    
    
        String sql = "select * from user where name="+"'"+username+"'";
        Connection con = JDBCUtil.getConnection ();
        ResultSet rs = null;
        Statement st=null;
        User user = new User ();
        try {
    
    
            st=con.createStatement ();
            rs=st.executeQuery (sql);
            if (rs.next ()) {
    
    
                user.setUsername (rs.getString ("name"));//从数据库得到数据  添加到user
                user.setPassword (rs.getString ("password"));
            }
            System.out.println (sql);

        } catch (SQLException e) {
    
    
            e.printStackTrace ();
        } finally {
    
    
            if (rs!=null || st!=null || con != null){
    
    
                JDBCUtil.close (rs,st,con);
                System.out.println ("RusultSet关闭,Statement通道关闭,Connection连接器关闭");
            }
        }
        return user;
    }

    //添加用户
    public boolean addUser(String username, String psw) {
    
    
        Connection con = JDBCUtil.getConnection ();
        PreparedStatement pstmt = null;
        String sql = "INSERT INTO user(username,password) VALUES(?,?)";
        boolean res = false;
        try {
    
    
            pstmt = con.prepareStatement (sql);
            pstmt.setString (1, username);
            pstmt.setString (2, psw);
            res = (pstmt.executeUpdate () == 1);
        } catch (SQLException e) {
    
    
            if (!e.getMessage ().contains ("PRIMARY")) {
    
    
                e.printStackTrace ();
            }
        } finally {
    
    
            try {
    
    
                if (pstmt != null) pstmt.close ();
                if (con != null) con.close ();
            } catch (SQLException e) {
    
    
                e.printStackTrace ();
            }
        }
        return res;
    }
}


User类,(User表)

package Model.domain;



/**
 * @Author zhangchuan
 * @Date 2020-05-20
 */
public class User {
    
    

    private String username;

    private String password;
    private int count=0;


    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;
    }

    public int getCount() {
    
    
        return ++this.count;
    }
}

JDBCUtil工具类,获得数据库的连接对象的,因为每一个用到数据库的表,都会连接一次数据库,就单独拿出来作为工具类。

package Util;

/**
 * @Author zhangchuan
 * @Date 2020-05-27
 */
import java.sql.*;

/**
 * @Author zhangchuan
 * @Date 2020-05-19
 */



public  class JDBCUtil {
    
    
    private static String url = "jdbc:mysql://localhost:3306/javaweb_learning";
    private static String user = "root";
    private static String pwd = "123456";
    private static String driverName = "com.mysql.jdbc.Driver";

    static{
    
    
        //1,加载驱动
        try {
    
    
            Class.forName (JDBCUtil.driverName);
        } catch (ClassNotFoundException e) {
    
    
            e.printStackTrace ();
        }

    }

    //获取连接对象
    public static Connection getConnection() {
    
    
        Connection cnn=null;
        try {
    
    
            cnn = DriverManager.getConnection (JDBCUtil.url,JDBCUtil.user, JDBCUtil.pwd);
        } catch (Exception e) {
    
    
            e.printStackTrace ();
        }
        System.out.println ("数据库连接成功");
        return  cnn;
    }


    /***
     * 释放资源
     * 1.结果资源  2.Statement通道资源  3.Connection  java与mysql数据库之间得连接资源
     */
    public static void   close(ResultSet res, Statement st, Connection cnn){
    
    
        if (res!= null) {
    
    
            try {
    
    
                res.close ();
            } catch (SQLException e) {
    
    
                e.printStackTrace ();
            } finally {
    
    
                if (st != null)
                    try {
    
    
                        st.close ();
                    } catch (SQLException e) {
    
    
                        e.printStackTrace ();
                    }if(cnn!=null){
    
    
                    try {
    
    
                        cnn.close();
                    } catch (SQLException e) {
    
    
                        e.printStackTrace ();
                    }
                }
            }
        }
    }
}

数据库表:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43919632/article/details/106381854