1. 程式人生 > >jsp+servlet+mysql實現簡單登入的完整專案

jsp+servlet+mysql實現簡單登入的完整專案

一、分析專案之前要了解下properties檔案的使用
在開發專案時,有很多地方會出現重複的程式碼或者日後可能需要修改的程式碼,比如:連線資料庫、設定專案編碼格式、設定檔案上傳儲存目錄等等。重複程式碼或許可以用靜態變數來實現全域性呼叫而不必重複出現,但是畢竟是寫死在程式碼裡的,日後需要修改時還要修改原始碼,比較麻煩而且不便於維護。Java給我們提供了Properties類,可以用來解決這些問題。
Properties類以"key=value"形式儲存了一系列的配置資訊,其中Key與value都是String型別。這樣,我們可以把需要重複用的資訊,或者日後需要修改的資訊以配置的形式從原始碼中獨立出來。修改時只需修改Properties檔案,在原始碼中通過properties類物件來讀取資訊即可同步到整個專案。下面,介紹一下JavaWeb專案中使用Properties檔案使專案配置化。
1、在專案的src目錄下新建 .properties

字尾名的檔案。
把檔案放在src目錄下,在部署時會自動部署到classes目錄下的。放到別處是獲取不到檔案的。
注意: Properties檔名首字母不能大寫否則也是找不到檔案的
用文字編輯檔案或者在IDEA中開啟這個配置檔案,把專案中可以配置化的資訊提取出來,以 key=value 形式書寫。注意一行一個。
一般可以配置化的資訊有:專案中重複出現的語句,日後需要修改的資訊等。比如:資料庫驅動、資料庫url、資料庫名以及密碼、專案編碼格式、檔案上傳路徑、臨時檔案儲存路徑等等。
例如:

url=jdbc:mysql://localhost:3306/login
user:root
password=
ForMe=520 driver=com.mysql.jdbc.Driver

三:在專案中獲取配置資訊
在properties檔案中配置好資訊後,在專案中可以通過Properties類物件來讀取資訊。分四步:
1、新建properties物件
2、建立輸入流開啟properties檔案。
3、properties物件從輸入流載入配置資訊
4、通過properties.getProperties(“key”)獲取具體配置資訊
例如:

 	Properties prop = new Properties();
    InputStream in = JdbcUtils.class.getResourceAsStream
("/a"); try { prop.load(in); url = prop.getProperty("url"); user = prop.getProperty("user"); password = prop.getProperty("password"); dv = prop.getProperty("driver"); 省略以下非關鍵程式碼 }

注意:
1、 InputStream in=當前類 名.class.getClassLoader().getResourceAsStream("config.properties");
2、InputStream in=當前類名.(如果是Java App,對應src;如果是Java Web App,對應class).getClassLoader().getResourceAsStream("config.properties");
以上是兩種獲取InputStream物件的方法,但是建立輸入流時,Test.class.getClassLoader().getResourceAsStream()方法直接獲得位元組輸入流,所以不用考慮路徑中是否包含中文的問題,如果是通過Test.class.getClassLoader().getResource()方法,因為該方法返回值是URL,如果專案的目錄中有中文命名,則獲得的URL會出現亂碼。

二、分析問題:
1、用到的開發工具:IDEA、Tomcat、mysql-connector-java-5.1.25-bin.jar包
2、專案目錄
Fn7GQI.png
3、分析問題
1、首先要有一個使用者類(User類)
2、把連線資料庫所需要用到的資訊存到一個.properties檔案中
3、進行資料庫註冊驅動操作的工具類 (JdbcUtils類)
4、與資料庫進行互動的類UserDAo類
5、登入表單 (Login.jsp)
6、登錄檔單(register.jsp)
7、處理登入後的servlet (LoginServlet類)
8、處理註冊後的servlet (RegisterServlet類)
9、登入成功與失敗介面
10、配置web.xml

三、具體實現過程如下
1、User類(User.java)
包括id(int)、name(String)、password(String)、role(int)
程式碼如下:

package com.demo.bean;

/**
 * Created by ForMe
 * com.demo.bean
 * 2018/12/1
 * 15:25
 */
public class User {
    private String name;
    private int role;
    private String password;
    private Integer id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getRole() {
        return role;
    }

    public void setRole(int role) {
        this.role = role;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

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

2、properties檔案(a.properties)
在src目錄下建立a.properties檔案

url=jdbc:mysql://localhost:3306/login
user:root
password=ForMe=520
driver=com.mysql.jdbc.Driver

3、資料庫註冊驅動的工具類(JdbcUtils.java)
此類只實現了資料庫的註冊驅動,並實現了關閉資源的功能。

package com.demo.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * Created by ForMe
 * com.demo
 * 2018/12/1
 * 15:31
 */
public class JdbcUtils {
    private static String url = null;
    private static String user = null;
    private static String password = null;
    private static String dv = null;

    static{
        Properties prop = new Properties();
        InputStream in = JdbcUtils.class.getResourceAsStream("/a");//不能是a.properties,因為在IDEA中檔名字就是a,與eclipse不同

        try {
        //以下四步避免了以後資料庫名字等資訊改變後來修改原始碼
            prop.load(in);
            url = prop.getProperty("url");
            user = prop.getProperty("user");
            password = prop.getProperty("password");
            dv = prop.getProperty("driver");

            //註冊驅動
            Class.forName(dv);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    public static Connection getconn() throws SQLException {
        Connection connection = DriverManager.getConnection(url,user,password);
        return connection;

    }

    public static void close(Statement statement, Connection connection){
        if(statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(PreparedStatement preparedStatement, Connection connection, ResultSet result) {
        if(preparedStatement != null){
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(result != null){
            try {
                result.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

4、與資料庫進行互動的類(UserDAo.java)
與資料庫進行互動,實現了註冊(向資料庫中插入新的使用者User)功能,登入(訪問資料庫與表格中所填資料比較,若一致則登陸成功,否則登入失敗)功能
具體實現程式碼如下:

package com.demo.dao;

import com.demo.bean.User;
import com.demo.utils.JdbcUtils;

import javax.xml.transform.Result;
import java.sql.*;

/**
 * Created by ForMe
 * com.demo
 * 2018/12/1
 * 15:59
 */
public class UserDAo {
    //資料庫連線物件
    //此方法用於在資料庫中查詢資訊並與Login.jsp表格中所填資訊比較,若資料庫中存在
    //與表格所填資料一一對應相等,則登陸成功,否則登入失敗
    public User login(String username, String password){
        User u = null;
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            connection = JdbcUtils.getconn();
            String sql = "select * from user where name=? and password=?";
            preparedStatement = (PreparedStatement)connection.prepareStatement(sql);
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            resultSet = preparedStatement.executeQuery();
            if(resultSet.next()){
                u = new User();
                u.setName(resultSet.getString("name"));
                u.setPassword(resultSet.getString("password"));
                System.out.println("登入成功");
            }
            else{
                System.out.println("使用者名稱或者密碼錯誤");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally{
            JdbcUtils.close(preparedStatement,connection);
        }
            return u;
    }

    //此方法實現註冊功能,向資料庫中寫入新使用者的資訊
    public void addUser(User user){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            connection = JdbcUtils.getconn();
            String sql = "insert into user(id,name,password,role)values(?,?,?,?);";
            preparedStatement = (PreparedStatement)connection.prepareStatement(sql);
            preparedStatement.setInt(1,user.getId());
            preparedStatement.setString(2,user.getName());
            preparedStatement.setString(3,user.getPassword());
            preparedStatement.setInt(4,user.getRole());
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JdbcUtils.close(preparedStatement,connection);
        }

    }

}

5、登入表單(Login.jsp)
登入介面的設計還是很簡單的,是一個表單,如下:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/12/1
  Time: 15:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登入介面</title>
    <style type="text/css">
        body{
            background-position: center;
            background-repeat: no-repeat;
        }
    </style>
</head>
<body>
<div style="text-align:center;margin-top:120px">
<h2>ForMe的主頁</h2>
<form action="/LoginServlet" method="post">
    <table style="margin-left:40%">
        <marquee width="200" scrolldelay="250">使用者登入</marquee>

        <tr>
            <td>使用者名稱:</td>
            <td><input type="text" size="21" name="username"/></td>

        </tr>
        <tr>
            <td>密碼:</td>
            <td><input type="text" name="password" size="21"/></td>
        </tr>

    </table>
    <input type="submit" value="登入"/>
    <input type="reset" value="重置"/>
</form>
<br>
<a href="register.jsp">註冊</a>
</div>
</body>
</html>

6、登錄檔單(register.jsp)
與登入表單相似,如下所示

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/12/1
  Time: 16:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>註冊介面</title>
    <style type="text/css">
        body{
            background-repeat: no-repeat;
            background-position: center;
        }

    </style>
</head>
<body>
<div style="text-align:center;margin-top: 120px">
    <form action="/RegisterServlet" method="post">
        <table style="margin-left:40%">
            <caption>使用者註冊</caption>
            <tr>
                <td>ID:</td>
                <td><input name="id" type="text" size="20"></td>
            </tr>
            <tr>
                <td>登入名:</td>
                <td><input name="name" type="text" size="20"></td>
            </tr>
            <tr>
                <td>密碼:</td>
                <td><input name="password" type="password" size="20"></td>
            </tr>
            <tr>
                <td>角色:</td>
                <td><input name="role" type="text" size="20"></td>
            </tr>
        </table>
        <input type="submit" value="註冊">
        <input type="reset" value="重置">
    </form>
    <br>
    <a href="Login.jsp">登入</a>
    </form>
</div>

</body>
</html>

7、處理Login.jsp的servlet類(LoginServlet)
主要是獲取登入表單所填寫的使用者名稱和密碼,並呼叫UserDAo類訪問資料庫中的資訊,將二者相比較,若是存在資料庫中資訊與表單資訊相等,則登入成功,否則登入失敗,失敗或者成功後都將跳轉到對應的頁面。相對實現較為簡單

package com.demo.service;

import com.demo.bean.User;
import com.demo.dao.UserDAo;

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 java.io.IOException;

/**
 * Created by ForMe
 * ${PACKAGE_NAME}
 * 2018/12/1
 * 15:57
 */
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        UserDAo userDAo = new UserDAo();
        User user = userDAo.login(username,password);
        if(user != null){
            request.getRequestDispatcher("success.jsp").forward(request,response);
        }
        else {
            request.getRequestDispatcher("defeat.jsp").forward(request,response);
        }
    }
}

8、處理register.jsp表單的servlet類(RegisterServlet.java)
與處理登入表單資料相似,當註冊時,首先要把登錄檔單的資訊獲取到,並新建一個User類的物件,是User物件具備註冊表單的註冊資訊,在呼叫UserDAo類的addlogin(User user)方法向資料庫中寫入此User物件,完成註冊功能。具體實現如下:

package com.de