实现注册登录,游客人数、会员人数

第一步:编写DbUtil包、类

 

 

import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Queue;

public class DbUtil {
    static DruidDataSource dataSource;//定义数据源
    static QueryRunner run; //run静态, = new QueryRunner(dataSource)初始化

    static {
        Properties p = new Properties();
        try {
            //src/mian/resources/db.properties那个文件
            p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(p);//properties
            //DruidDataSource 用Druid 连数据库
            run = new QueryRunner(dataSource);//初始化
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //链接 获取链接
    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    //统计个数
    public int count(String sql, Object... params) {
        int result = 0;
        //QueryRunner run = new QueryRunner(dataSource);
        try {
            //sresult = run.query(sql,new ScalarHandler<>(),params);,long类型
            //吧long强转成int
            long res = run.query(sql, new ScalarHandler<>(), params);
            result = (int) res;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return result;
    }

    //登录查询
    public Map<String, Object> find(String sql,Object...params) {
        Map<String, Object> map = null;
        try {
            map = run.query(sql, new MapHandler(), params);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return map;
    }

    //查询
    public List<Map<String, Object>> query(String sql, Object... params) {
        List<Map<String, Object>> list = null;
        //QueryRunner run = new QueryRunner(dataSource);
        try {
            list = run.query(sql, new MapListHandler(), params);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return list;
    }

    //可以实现删除,插入,修改
    public int update(String sql, Object... params) {
        int result = 0;
        //QueryRunner run = new QueryRunner(dataSource);
        try {
            result = run.update(sql, params);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return result;
    }
}

第二步:使用resources/properties链接数据库

#db.driver
druid.driverClassName = com.mysql.cj.jdbc.Driver 
druid.url = jdbc:mysql://localhost:3306/qq?serverTimezone=PRC&useUnicode=true&characterEncoding=utf8
druid.username = root
druid.password =
#初始化
druid.initialSize=20
druid.filters=stat
druid.maxActive=300
druid.maxWait=60000

第三步:编写index.jsp主页 、login.jsp登录、reg.jspz注册页面,并统计游客人数

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>首页</title>
</head>
<body>

<%       //统计在线人数
        int online = application.getAttribute("num")==null?0 :Integer.parseInt(application.getAttribute("num").toString());
        if(session.getAttribute("num")==null){
            online++;
            session.setAttribute("num",online);
            application.setAttribute("num",online);
        }
%>
<h4>当前在线:${applicationScope.num}</h4>
<h4>会员:${applicationScope.now==null ? 0:applicationScope.now}</h4>


<c:if test="${sessionScope.user==null}">
    <a href="reg.jsp">新用户注册</a>&nbsp;
    <a href="login.jsp">登录</a>
</c:if>

<c:if test="${sessionScope.user!=null}">
    <h3>欢迎:${sessionScope.username}!!</h3>
    <a href="/logout">安全退出</a>
</c:if>

</body>
</html>

reg.jspz注册页面

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html lang="zh-CN">
<style>
.err{
color: red;
}

</style>
<head>
<meta charset="utf-8">
<title>会员注册</title>
</head>
<body>
<p class="err">${requestScope.error}</p><!--输出错误提示信息 -->
<h3>会员注册</h3>
<%-- regsave 接值--%>
<form action="/regsave" method="post">
账号:<input type="text" name="account"><br>
密码:<input type="password" name="passwd"><br>
确认密码:<input type="password" name="password2"><br>
真实姓名:<input type="text" name="truename"><br>
<input type="submit" value="注册新用户"><br>
<hr>
<a href="index.jsp">返回首页</a>
</form>
</body>
</html>

login.jsp登录

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html lang="zh-CN">
<style>
    .err{
        color: red;
    }

</style>
<head>
    <meta charset="utf-8">
    <title>会员登录</title>
</head>
<body>
<p class="err">${requestScope.error}</p>
<h3>会员登录</h3>
<%--              regsave 接值--%>
<form action="/checklogin" method="post">
    账号:<input type="text" name="account"><br>
    密码:<input type="password" name="passwd"><br>
    <input type="submit" value="登录"><br>
    <hr>
    <a href="index.jsp">返回首页</a>
</form>
</body>
</html>

第四步编写注册类

package servlet;

import utils.DbUtil;

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.time.LocalDateTime;

@WebServlet("/regsave")
public class RegSave extends HttpServlet {
        @Override
            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            String a =request.getParameter("account");
            String p =request.getParameter("passwd");
            String p2 =request.getParameter("password2");
            DbUtil db = new DbUtil();
            //为null 或者是空字段
            if(a==null || "".equals(a.trim())){
                request.setAttribute("error","注册失败,必须填写账号");

                request.getRequestDispatcher("reg.jsp").forward(request,response);
                //转发是一个服务器行为,当用户请求到达服务器后,在服务器内部完成对请求的处理以及准发操作,然后将相应的资源返回给客户端。
                //A找B借钱,B没有,然后B去找C借钱,不管借没借到都把消息告诉A
            }else if(!p.equals(p2)) { //!是非运算符号,比如a为真,则!a则为假。a如果为假,则!a为真。
                request.setAttribute("error", "注册失败,两次密码不一致");
                request.getRequestDispatcher("reg.jsp").forward(request, response);

            }else if(db.count("select count(*) from wx_users where account = ?",a)>0){
                request.setAttribute("error","注册失败,账号已被占用");
                request.getRequestDispatcher("reg.jsp").forward(request,response);
            } else {
                    String n = request.getParameter("truename");
                    DbUtil du = new DbUtil();
                    du.update("insert into wx_users(account,passwd,truename,regtime) value(?,?,?,?)",a,p,n, LocalDateTime.now());
                    response.sendRedirect("/");
            }

            }
}

编写登录类、登录时欢迎,如登陆错误返回主页重新登录或注册,统计会员人数

package servlet;

import utils.DbUtil;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Map;

@WebServlet("/checklogin")
public class CheckLogin extends HttpServlet {
        @Override
            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            String a =request.getParameter("account");
            String p =request.getParameter("passwd");
            DbUtil db = new DbUtil();
            HttpSession session = request.getSession();
            //为null 或者是空字段
            if(a==null || "".equals(a.trim())){
                request.setAttribute("error","登录失败,必须填写账号");
                request.getRequestDispatcher("login.jsp").forward(request,response);
                //转发是一个服务器行为,当用户请求到达服务器后,在服务器内部完成对请求的处理以及准发操作,然后将相应的资源返回给客户端。
                //A找B借钱,B没有,然后B去找C借钱,不管借没借到都把消息告诉A
            }else {
                Map<String, Object> map = db.find("select account,truename from wx_users where account = ? and passwd=?",a,p);
                if(map ==null){
                    request.setAttribute("error","登陆失败,账号密码不正确");
                    request.getRequestDispatcher("login.jsp").forward(request,response);
                }else {

                    //设置过度id和真实姓名
                    session.setAttribute("user",a);
                    session.setAttribute("username",map.get("truename"));

                    //会员人数
                    ServletContext app = request.getServletContext();
                    int us = app.getAttribute("now") == null ?0: Integer.parseInt(app.getAttribute("now").toString());
                    app.setAttribute("now",++us);

                    response.sendRedirect("/");//执行完
            }
        }
            }
}

编写logout类 和index。jsp配合,实现会员登录欢迎,失败后返回重新登录或注册

package servlet;


import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/logout")
public class Logout extends HttpServlet {
        @Override
            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            HttpSession session = request.getSession();
            //设置过度id和真实姓名
            session.removeAttribute("user");
            session.removeAttribute("username");

            //会员退出
            ServletContext app = request.getServletContext();
            if(session.getAttribute("user")==null) {//退出后为空后才执行
                int us = app.getAttribute("now") == null ? 0 : Integer.parseInt(app.getAttribute("now").toString());
                app.setAttribute("now", --us);
            }
            response.sendRedirect("./");
        }
            }

中途可以使用test/java/DbUtilTest 测试类是否有错误

 

 

package cn.demo;

import org.junit.Test;
import utils.DbUtil;

public class DbUtilTest {
    @Test
    public void tt(){
        //System.out.println(DbUtil.getConnection());
        DbUtil db = new DbUtil();
        //System.out.println(du.count("select count(*) from wx_users"));//查询有几条数据,count计数
        //System.out.println(du.query("select *from wx_users"));
        System.out.println(db.find("select truename,account from wx_users where account = ?","444"));
            }
}

 

posted @ 2020-11-25 20:41  谷先生  阅读(254)  评论(0)    收藏  举报