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

數據庫表:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章