zoukankan      html  css  js  c++  java
  • 【JavaWeb】从零实现用户登录

    1.数据库预备

     

    1.1 SQL

        创建数据库

    create database db;

        创建表

    create table userInfo(
        id int primary key ,
        name varchar(20),
        password varchar(20),
        age int,
        email varchar(20)
    );

        导入测试数据

    insert into userInfo values(1,'super','123',25,'123456@nova.com');
    insert into userInfo values(2,'nova','111',26,'test@nova.com');

    在SQLog或Navicat执行以上SQL语句之后,即完成了数据库的基础数据的预备

    2. JavaWeb编程

    2.1 配置文件    

        考虑在后续开发中,数据库的路径、用户名、密码等内容是可能会改变的,后续的开发中,应该尽量的避免修改代码,所以创建DBConfig.properties配置文件,将后续可能发生改变的内容放在配置文件中,后续只要修改配置文件即可。DBConfig.properties文件是以键值对的形式存储的。

    DBConfig.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/db
    user=root
    password=(这里写你的数据库密码)

    2.2 封装数据库工具类

          在编程中,应该习惯于使用面向对象的思想,增强代码的复用性、健壮性、可读性。所以,这里我将程序中对数据库的操作封装成一个工具类,并且内部的方法使用static修饰。

        用static修饰的好处在于, static修饰的方法被放在JVM的静态方法区,随着类的加载而加载,能够使用类名调用方法,并且static执行的效率高,速度快,所以,我们封装的工具类应尽量使用静态的,要注意的是,静态的方法中,只能调用静态的成员变量。

    DBUtil.java

    package com.nova.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ResourceBundle;
    /**
     * 数据库工具类
     * @author supernova
     * 
     */
    public class DBUtil {
        private static String url;
        private static String user;
        private static String pwd;
        //因为获取文件配置信息和加载驱动只需要执行一次,所以将这两个功能放入静态代码块中,随着类的加载而加载,能提高代码的效率
        static {
            //获取配置文件信息
            ResourceBundle bundle = ResourceBundle.getBundle("DBConfig");
            url = bundle.getString("url");
            user = bundle.getString("user");
            pwd = bundle.getString("password");
            //利用反射,加载驱动
            try {
                Class.forName(bundle.getString("driver"));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        
        //获取连接通道
        public static Connection getConnection() throws SQLException{
            return DriverManager.getConnection(url,user,pwd);
        }
        //关闭所有资源
        public static void closeAll(Connection connection,PreparedStatement pStmt, ResultSet resultSet) throws SQLException{
            if(connection != null){
                connection.close();
            }
            if(pStmt != null){
                pStmt.close();
            }
            if(resultSet != null){
                resultSet.close();
            }
        }
    }

        2.3 JavaBean编程思想

            在用户登录中,往往会需要在客户端显示当前登录用户的信息,比如当前用户名等,所以为了加强程序的可扩展性,在服务端的JDBC编程中执行数据库查询操作时,应将查询到的内容存到对象中,在后续需要使用用户信息时,只需将该对象返回给客户端即可,所以这就需要创建一个bean类,称为模型。bean类中成员变量的个数,类型应尽量与数据库表中的一致,以方便使用。

    UserInfo.java

    package com.nova.bean;
    
    public class UserInfo {
        private int id;
        private String name;
        private String password;
        private int age;
        private String email;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public UserInfo(int id, String name, String password, int age, String email) {
            super();
            this.id = id;
            this.name = name;
            this.password = password;
            this.age = age;
            this.email = email;
        }
        public UserInfo() {
            super();
        }
        @Override
        public String toString() {
            return "UserBean [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + ", email=" + email
                    + "]";
        }
    }

        2.3 服务端主程序

    ServerMain.java

    package com.nova.test;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.nova.bean.UserInfo;
    import com.nova.util.DBUtil;
    /**
     * 服务端主程序
     * @author supernova
     *
     */
    public class ServerMain extends HttpServlet {    
        private static final long serialVersionUID = 1L;
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取客户端发来的用户名和密码
            String user = req.getParameter("user");
            String pwd = req.getParameter("pwd");
            //打印流
            PrintWriter pw = resp.getWriter();;
            
            Connection con = null;
            PreparedStatement pStmt = null;
            ResultSet resultSet = null;
            UserInfo userInfo = null;
            
            try{
                con = DBUtil.getConnection();//获取数据库连接,
                String sql = "select * from userInfo where name = ? and password = ?";
                pStmt = con.prepareStatement(sql);
                pStmt.setString(1, user);
                pStmt.setString(2, pwd);
                resultSet = pStmt.executeQuery();
                
                if(resultSet.next()){
                    userInfo = new UserInfo();
                    userInfo.setId(resultSet.getInt("id"));
                    userInfo.setName(resultSet.getString("name"));
                    userInfo.setPassword(resultSet.getString("password"));
                    userInfo.setEmail(resultSet.getString("email"));
                }
                if(userInfo != null){
                    //登录成功
                    pw.print("Login Success");
                }else {
                    //登录失败
                    pw.print("Login Failed");
                }
            }catch(SQLException e){
                e.printStackTrace();
            }finally{
                //最后需要把所有资源关闭
                pw.close();
                try {
                    DBUtil.closeAll(con, pStmt, resultSet);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }    

    2.4 导入mysql的jar包

            下载mysql驱动jar包 下载链接:https://download.csdn.net/download/xin93/10334399

            下载解压后,将jar包复制到MyEclipse工程目录的WebRoot/WEB-INF/lib中,并右键build path --> Add to build path

    2.4 模拟客户端(网页)

     

            在网页客户端的body标签中添加表单:

        <form action="login">
            username:<input type="text" name="user"/><br/>
            password:<input type="password" name="pwd"/><br/>
            <input type="submit" value="login"/>
        </form>

    2.5 web.xml

        在WebRoot/WEB-INF的目录下,打开web.xml文件,在web-app标签下添加:

     
     <servlet>
          <servlet-name>ServerMain</servlet-name>
          <servlet-class>com.nova.test.ServerMain</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>ServerMain</servlet-name>
          <url-pattern>/login</url-pattern>
      </servlet-mapping>

    3. 运行测试

    输入正确的用户名和密码:

    点击Login按钮,登录成功。

    输入错误的用户名密码,

    登录失败

  • 相关阅读:
    bash 教程 shell 基础语法
    使用 Flutter 开发 Windows 桌面应用 [MD]
    小tips:使用babelupgrade从babel6升级babel7
    JS的可选链操作符(?.)与双问号(??),你用到了吗?
    JS处理html的编码(encode)与解码(decode)
    pdf A3 到 A4
    grub4dos 制作U盘启动盘
    amixer的用法
    一个tomcat设置多个端口
    PostgreSQL 配置内存参数
  • 原文地址:https://www.cnblogs.com/snova/p/9195705.html
Copyright © 2011-2022 走看看