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

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

//    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//
//    }
    protected  void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        request.setCharacterEncoding("UTF-8");
        //PrintWriter out = response.getWriter();
        response.setContentType("text/html;charset=UTF-8");
        int id = Integer.valueOf(request.getParameter("id"));
        String username = request.getParameter("name");
        String password = request.getParameter("password");
        int role = Integer.valueOf(request.getParameter("role"));

        User user = new User();
        user.setId(id);
        user.setName(username);
        user.setPassword(password);
        user.setRole(role);
        UserDAo userDAo = new UserDAo();
        userDAo.addUser(user);
        System.out.println("註冊成功");
        request.getRequestDispatcher("Login.jsp").forward(request,response);
    }
}

9、簡單的登錄成功與失敗頁面
success.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/12/1
  Time: 16:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登錄成功頁面</title>
</head>
<body>
<h1>
    登錄成功
</h1>
<hr>
</body>
</html>

defeat.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/12/1
  Time: 16:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登錄失敗</title>
</head>
<body>
<h1>登錄失敗</h1>
<hr>
<a href="Login.jsp">重新登錄</a>
<br>
<a href="register.jsp">註冊</a>
</body>
</html>

10、配置we.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.demo.service.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>com.demo.service.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/RegisterServlet</url-pattern>
    </servlet-mapping>
</web-app>

訪問的時候先訪問register.jsp進行註冊,註冊成功後會跳轉到登錄界面進行登錄。結果如下:
Fn70YQ.png
Fn76O0.png
Fn72wT.png
當登陸失敗時,結果如下:
Fn7olR.png
各個頁面的具體功能等待完善… …
完整的項目保存在github上:ForMe的github

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