jsp+servlet+mysql实现简单登录的完整项目

  • Post author:
  • Post category: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



版权声明:本文为qq_43060759原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。