使用jsp+session實現一個登錄界面


1.1.1.1案例需求描述

提供登錄頁面,用於用戶登錄(用戶名和密碼需要查詢數據庫)。如果登錄失敗,需要回到登錄頁面(給出提示信息)。如果登錄成功,頁面進行跳轉,在成功頁面上顯示登錄成功的總人數。

1.1.1.2案例流程分析

  

 

1.1.1.3案例准備 -創建數據庫

  

1.1.1創建數據庫

1.1.1.3建表語句

create database web02_login;

use web02_login;

create table user(

uid int primary key auto_increment,

username varchar(20),

password varchar(20),

nickname varchar(20)

);


insert into user values (null,'zs','123','張三');

insert into user values (null,'ls','123','李四');

insert into user values (null,'ww','123','王五');

1.1.1.4導入相關jar包

  

 

 

 

 

  其導入的包為數據庫連接池-druid和數據庫連接驅動

  項目包結構

    

 

 

 

  

 

1.1.1.5login.jsp

  jsp的運行原理

    

 

 

 

 

  

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    /**
    * 判斷request域中是否有錯誤信息:(第一次進入登錄頁面的時候,沒有錯誤信息)
    * * 如果有錯誤信息:顯示錯誤信息
    */
    String msg = "";
    if(request.getAttribute("msg") != null){
        // 有錯誤信息:顯示錯誤信息:
        msg = (String)request.getAttribute("msg");
    }
%>
<h1>登錄界面</h1>
<h3><font color="red"><%=msg%></font></h3>
<form action="/WEB04_login/LoginServlet" method="post">
    <table border="1" width="600">
        <tr>
            <td>用戶名</td>
            <td><input type="text" name="username"/></td>
        </tr>
        <tr>
            <td>密碼</td>
            <td><input type="password" name="password"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="登錄"></td>
        </tr>
    </table>
</form>
</body>
</html>

 

1.1.1.6登錄成功的界面-success.jsp

 

<%@page import="domain.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
    //進行判斷用戶是否通過登錄界面
    if(request.getSession().getAttribute("existUser") == null){
%>
    <!-- 當需要添加html標簽時需要進行隔開 -->
    <h1>你好,你還沒有登錄,請點擊鏈接進行登錄<a href="/WEB04_login/login.jsp">登錄</a></h1>
<%
    }else{
%>
    <h1>用戶登陸成功</h1>
<%
    User user = (User)request.getSession().getAttribute("existUser");
    int count = (int)request.getServletContext().getAttribute("count");
%>
    <h3>你好:<%= user.getUsername()%></h3>
    <h3>總的登陸成功的人數<%= count %></h3>
<%
    }
%>
</body>
</html>

 

1.1.1.7控制層(controller)

  1.InitServlet.java

    

package controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *初始化的servlet
 *將這個Servlet配置成啟動時加載
 */
public class InitServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    /**
     * 初始化的方法:
     */
    public void init() throws ServletException {
        // 初始一個值為0。
        int count = 0;
        // 將這個值存入到ServletContext域中。
        this.getServletContext().setAttribute("count", count);
    }
       
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

 

  這里需要注意的是需要對這個servlet在web.xml中進行配置

  

 

   通過<load-on-startup>標簽中進行配置,標簽中填入一個大於2的整形數字(因為tomcat服務器中有一個servlet默認的優先級為1),其數字越小,在服務器啟動加載的優先級越高!

  2.LoginServlet.java

    

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.UserModel;
import domain.User;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        try {
            // 接收數據
            // 處理中文亂碼
            request.setCharacterEncoding("UTF-8");
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println(username+password);
            // 封裝數據
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            User login = UserModel.Login(username, password);
            // 處理數據
                if (login == null) {
                    // 登錄失敗
                    // 向request域中保存一個數據
                    request.setAttribute("msg", "用戶名或密碼錯誤");
                    // 使用請求轉發進行頁面跳轉
                    request.getRequestDispatcher("login.jsp").forward(request,
                            response);
                } else {
                    // 登錄成功
                    //保存用戶信息
                    HttpSession session = request.getSession();
                    session.setAttribute("existUser",login);
                    // 記錄登錄成功的人數:
                    // 將ServletContext中的值取出 +1
                    int count = (int) this.getServletContext()
                            .getAttribute("count");
                    // 進行了+1的操作
                    count++;
                    // 將+1后的值存回到ServletContext中去。
                    this.getServletContext().setAttribute("count", count);
                    // 重定向到成功頁面
                    response.sendRedirect("/WEB04_login/success.jsp");
                }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

接受數據類-User.java

  

package domain;
/**
 * @author ztr
 * @version 創建時間:2021年4月16日 上午11:00:32
 * 類說明
 */
public class User {
    private Integer uid;
    private String username;
    private String password;
    public User(Integer uid, String username, String password) {
        super();
        this.uid = uid;
        this.username = username;
        this.password = password;
    }
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    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;
    }
    
}

 

數據處理類-UserModel.java

  

package model;

import java.sql.Connection;
import domain.User;
import utils.*;

/**
 * @author ztr
 * @version 創建時間:2021年4月16日 上午11:02:13 類說明
 */
public class UserModel {
    public static User Login(String username, String password) throws Exception {

        Connection connection = JdbcUtils.GetConnection();
        String sql = "select username,password from user where username = ? and password = ?";
        User user = BaseDao.GetInstance(connection, User.class, sql, username,
                password);
        return user;

    }
}

 

數據庫連接工具類

  JdbcUtils.java

  

package utils;

import java.io.InputStream;
import java.util.Properties;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;


import com.alibaba.druid.pool.DruidDataSourceFactory;

/**
 * @author ztr
 * @version 創建時間:2021年3月29日 上午10:20:16 類說明
 */
/*
 * 獲取連接
 * 
 * @return Connection
 */
public class JdbcUtils {

    public JdbcUtils() {
        super();
        // TODO Auto-generated constructor stub
    }

    private static DataSource source;
    static {
        try {
            Properties pro = new Properties();
            InputStream is = JdbcUtils.class.getClassLoader()
                    .getResourceAsStream("druid.properties");
            pro.load(is);

            source = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Connection GetConnection() throws Exception {

        Connection connection = source.getConnection();
        return connection;

    }

    /*
     * 關閉資源
     */
    public static void closeResource(Connection connection, PreparedStatement ps) {
        try {
            if (ps != null)
                ps.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            if (connection != null)
                connection.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /*
     * 關閉資源
     */
    public static void closeResource1(Connection connection,
            PreparedStatement ps, ResultSet rs) {
        try {
            if (ps != null)
                ps.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            if (connection != null)
                connection.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

 

  BaseDao.java

  

package utils;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;


/**
 * @author ztr
 * @version 創建時間:2021年4月16日 上午11:21:09 類說明
 */
public class BaseDao {
    // 通用的增刪改操作
    public static void update(Connection connection, String sql, Object... args) {
        // 獲取數據連接
        // 預編譯sql語句返回preparedStatement
        PreparedStatement prepareStatement = null;
        try {
            prepareStatement = connection.prepareStatement(sql);
            // 填充占位符
            // prepareStatement.setObject的下標從1開始
            for (int i = 0; i < args.length; i++) {
                prepareStatement.setObject(i + 1, args[i]);
            }
            // 執行
            prepareStatement.execute();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 資源的關閉
            JdbcUtils.closeResource(null, prepareStatement);
        }
    }

    /**
     * 返回一個數據
     * 
     * @param clazz
     * @param sql
     * @param args
     * @return
     */
    public static <T> T GetInstance(Connection connection, Class<T> clazz,
            String sql, Object... args) {
        PreparedStatement prepareStatement = null;
        // 獲取結果集
        ResultSet resultSet = null;
        try {
            prepareStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                prepareStatement.setObject(i + 1, args[i]);
            }
            resultSet = prepareStatement.executeQuery();
            // 獲取元數據
            ResultSetMetaData metaData = resultSet.getMetaData();
            // 通過metaData獲取結果集中的列數
            int columnCount = metaData.getColumnCount();
            if (resultSet.next()) {
                T newInstance = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    // 獲取列值
                    Object columnValue = resultSet.getObject(i + 1);
                    // 獲取每列的列名
                    String columnName = metaData.getColumnLabel(i + 1);
                    // 利用反射
                    Field field = clazz.getDeclaredField(columnName);
                    // 考慮該屬性是否為私有
                    field.setAccessible(true);
                    field.set(newInstance, columnValue);
                }
                return newInstance;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 關閉資源
            JdbcUtils.closeResource1(null, prepareStatement, resultSet);
        }

        return null;

    }
    /**
     * 返回多條數據
     * @param connection
     * @param clazz
     * @param sql
     * @param args
     * @return
     */
    public static <T> List<T> getList(Connection connection, Class<T> clazz,
            String sql, Object... args) {
        PreparedStatement prepareStatement = null;
        // 獲取結果集
        ResultSet resultSet = null;
        try {
            prepareStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                prepareStatement.setObject(i + 1, args[i]);
            }
            resultSet = prepareStatement.executeQuery();
            // 獲取元數據
            ResultSetMetaData metaData = resultSet.getMetaData();
            // 通過metaData獲取結果集中的列數
            int columnCount = metaData.getColumnCount();
            // 創建集合對象
            ArrayList<T> list = new ArrayList<T>();
            while (resultSet.next()) {
                T newInstance = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    // 獲取列值
                    Object columnValue = resultSet.getObject(i + 1);
                    // 獲取每列的列名
                    String columnName = metaData.getColumnLabel(i + 1);
                    // 利用反射
                    Field field = clazz.getDeclaredField(columnName);
                    // 考慮該屬性是否為私有
                    field.setAccessible(true);
                    field.set(newInstance, columnValue);
                }
                list.add(newInstance);
            }
            return list;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 關閉資源
            JdbcUtils.closeResource1(null, prepareStatement, resultSet);
        }

        return null;
    }
}

 

數據庫連接池配置文件-druid.properties

  

url=jdbc:mysql://localhost:3306/web02_login
username=root
password=XXX
driverClassName=com.mysql.cj.jdbc.Driver

 

 

 

運行結果

  登錄界面

  

 

   用戶名或者密碼錯誤

  

 

   登陸成功

  

 

 以上博文只是記錄學習,若有錯誤之處,還請大家諒解。

 

 

 

 

 

 

 

 

  

 

 

 

 

 

   

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM