实现注册登录,游客人数、会员人数
第一步:编写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>
<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")); } }
浙公网安备 33010602011771号