一、相关技术
MVC三层架构、Servlet、Jsp、JDBC 、EL和JSTL标签的使用。
二、核心代码
- dao层,实现连接数据库的操作类DB。
package user.dao;
import java.sql.*;
import user.entity.User;
public class DB {
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
//设置数据库连接地址
private static final String DB_URL ="jdbc:mysql://localhost:3306/userdb?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
/* 数据库用户名 */
private static final String dbUser = "root";
/* 数据库密码 */
private static final String dbPass = "xiatian123";
public static void main(String[]args) {
User user = new User();
Connection connection = DB.getConnection();
Statement statement = DB.createStatement(connection);
ResultSet rSet = DB.executeQuery(statement,"select * from t_user ");
/*
* rs记录集向下滚动一次(next)
* 若成功滚动, 表明查到了数据,将记录指针移动到查找到的第一条记录
* 将数据库中的用户名和密码读取出来,封装为一个user对象;
*/
try {
while(rSet.next()) {
user=new User();
user.setUserName(rSet.getString("user_name"));
user.setPassword(rSet.getString("user_password"));
}
} catch (SQLException e){
e.printStackTrace();
}
}
//获取数据库连接
public static Connection getConnection(){
Connection connection = null;
try {
Class.forName(JDBC_DRIVER);
connection = DriverManager.getConnection(DB_URL,dbUser,dbPass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//操作数据库
public static Statement createStatement(Connection connection){
Statement statement = null;
try {
statement = connection.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return statement;
}
// 返回结果集
public static ResultSet executeQuery(Statement statement, String SQL){
ResultSet rSet = null;
try {
rSet = statement.executeQuery(SQL);
} catch (SQLException e) {
e.printStackTrace();
}
return rSet;
}
//插入数据
public static int executeUpdate(Statement statement, String SQl){
int ret = 0;
try {
ret = statement.executeUpdate(SQl);
} catch (SQLException e) {
e.printStackTrace();
}
return ret;
}
//关闭数据库连接
public static void closeDB(ResultSet rs, Statement sta, Connection conn) {
try {
if(rs!=null) {
rs.close();
}
if(sta!=null) {
sta.close();
}
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.entity层,即封装user用户的相关方法和属性
package user.entity;
public class User {
private int id;
private String userName;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3.Servlet层
登陆的servlet
package user.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import user.dao.DB;
import user.entity.User;
public class ServletUserLogin extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置编码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("GBK");
//前台得到用户输入数据
boolean isloginSuccess = false;
String inputUsername = req.getParameter("userName");
String inputPassword= req.getParameter("passWord");
//进行数据库查询
Connection connection = DB.getConnection();
Statement statement = DB.createStatement(connection);
ResultSet res = DB.executeQuery(statement, "select * from t_user where user_name = '"+inputUsername +"'");
//判断用户名和密码是否正确
try {
//int loginResult = -1;
if(res.next()) {
String username = res.getString("user_name");
String userpass = res.getString("user_password");
if(username.equals(inputUsername) && userpass.equals(inputPassword)) { //用户名和密码正确
User user = new User();
user.setUserName(inputUsername);
user.setPassword(inputPassword);
PrintWriter out = resp.getWriter();
out.print("<script>alert('欢迎回来,登陆成功!');window.location.href='/LoginTest/index.jsp'</script>");//弹出网页提示并跳转
//将用户对象放到session中
req.getSession().setAttribute("user",user);
// System.out.println("用户名:"+user.getUserName()+" "+"用户密码:"+user.getPassword());
}else if(!(username.equals(inputUsername)) || !(userpass.equals(inputPassword)) ){ //用户名或密码错误
if(!userpass.equals(inputPassword))
{//用户密码错误
req.setAttribute("error", "用户密码错误!");
req.getRequestDispatcher("/UserLogin.jsp").forward(req, resp);
return;
}
if(!userpass.equals(inputPassword)) {//用户名错误
req.setAttribute("error", "用户名错误!");
req.getRequestDispatcher("/UserLogin.jsp").forward(req, resp);
return;
}
}else{ //用户密码和名都错误
req.setAttribute("error", "用户名和密码错误!");
req.getRequestDispatcher("/UserLogin.jsp").forward(req, resp);
return;
}
}else{
req.setAttribute("error", "用户名或密码错误!");
req.getRequestDispatcher("/UserLogin.jsp").forward(req, resp);
return;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注册的Servlet页面
package user.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import user.dao.DB;
import user.entity.User;
public class ServletUserRegister extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("GBK");
//前台得到用户输入数据
String userName = req.getParameter("registerUsername");
String password1 = req.getParameter("registerPassword1");
String password2 = req.getParameter("registerPassword2");
int isLogin=1;//设置标志值判断注册用户是否已经存在
String sql="select * from t_user where user_name='"+userName+"'";
Connection connection = DB.getConnection();
Statement statement = DB.createStatement(connection);
ResultSet res = DB.executeQuery(statement, sql);
try {
if(res.next()) { //判断用户是否已经注册
req.setAttribute("error", "用户名已经存在!");
req.getRequestDispatcher("/UserRigister.jsp").forward(req, resp);
return;
}else {//检验输入的用户名和密码是否合法
if(userName.length()>=3&&userName.length()<=10)
{ //设置用户名长度在3-10个字符之间
if(password1.length()>=6&&password1.length()<=12 && password2.length()>=6&&password2.length()<=12 )
{//设置用户密码长度在6-12个字符之间
if(password1.equals(password2))
{//两次输入的密码一致
//Connection connection = DB.getConnection();
//Statement statement = DB.createStatement(connection);
DB.executeUpdate(statement, "insert into t_user (user_name,user_password) values (\""+userName+"\",\""+password1+"\")");
PrintWriter out = resp.getWriter();
out.print("<script>alert('恭喜你,注册成功!');window.location.href='/LoginTest/UserLogin.jsp'</script>");//弹出网页提示并跳转
}else{
req.setAttribute("error", "两次输入的密码不一致!");
req.getRequestDispatcher("/UserRigister.jsp").forward(req, resp);
return;
}
}else{
req.setAttribute("error", "密码长度错误");
req.getRequestDispatcher("/UserRigister.jsp").forward(req, resp);
return;
}
}else {
req.setAttribute("error", "用户名不能为空!");
req.getRequestDispatcher("/UserRigister.jsp").forward(req, resp);
return;
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.登陆与注册的jsp页面 我是引用的bootstrap页面,仅供参考
登陆页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>欢迎来到登陆界面!</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="all,follow">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/4.2.1/css/bootstrap.min.css">
<link rel="stylesheet" href="bootstrap/css/style.default.css" id="theme-stylesheet">
</head>
<body>
<form action="doLogin" method="post">
<div class="page login-page">
<div class="container d-flex align-items-center">
<div class="form-holder has-shadow">
<div class="row">
<!-- Logo & Information Panel-->
<div class="col-lg-6">
<div class="info d-flex align-items-center">
<div class="content">
<div class="logo">
<h1>欢迎登录</h1>
</div>
<p>后台管理系统</p>
</div>
</div>
</div>
<!-- Form Panel -->
<div class="col-lg-6 bg-white">
<div class="form d-flex align-items-center">
<div class="content">
<form method="post" action="dologin" class="form-validate" id="loginFrom">
<div class="form-group">
<input id="login-username" type="text" name="userName" required data-msg="请输入用户名" placeholder="用户名" value="admin" class="input-material">
</div>
<span style="color:red;">${requestScope.error}</span>
<div class="form-group">
<input id="login-password" type="password" name="passWord" required data-msg="请输入密码" placeholder="密码" class="input-material">
</div>
<button id="login" type="submit" class="btn btn-primary">登录</button>
<div style="margin-top: -40px;">
<!-- <input type="checkbox" id="check1"/> <span>记住密码</span>
<input type="checkbox" id="check2"/> <span>自动登录</span> -->
<div class="custom-control custom-checkbox " style="float: right;">
<input type="checkbox" class="custom-control-input" id="check2" >
<label class="custom-control-label" for="check2">自动登录</label>
</div>
<div class="custom-control custom-checkbox " style="float: right;">
<input type="checkbox" class="custom-control-input" id="check1" >
<label class="custom-control-label" for="check1">记住密码 </label>
</div>
</div>
</form>
<br />
<small>没有账号?</small><a href="UserRigister.jsp" class="signup"> 注册</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- JavaScript files-->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</form>
</body>
</html>
注册页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>欢迎来到注册界面!</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="all,follow">
<!-- Bootstrap CSS-->
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Poppins:300,400,700">
<link rel="stylesheet" href="bootstrap/css/style.default.css" id="theme-stylesheet">
</head>
<body>
<form action="doRegister" method="post">
<div class="page login-page">
<div class="container d-flex align-items-center">
<div class="form-holder has-shadow">
<div class="row">
<!-- Logo & Information Panel-->
<div class="col-lg-6">
<div class="info d-flex align-items-center">
<div class="content">
<div class="logo">
<h1>欢迎注册</h1>
</div>
<p>请注册</p>
</div>
</div>
</div>
<!-- Form Panel -->
<div class="col-lg-6 bg-white">
<div class="form d-flex align-items-center">
<div class="content">
<div class="form-group">
<input id="register-username" class="input-material" type="text" name="registerUsername" placeholder="请输入用户名/姓名" >
<div class="invalid-feedback">
用户名必须在2~10位之间
</div>
</div>
<span style="color:red"> ${requestScope.error } </span>
<div class="form-group">
<input id="register-password" class="input-material" type="password" name="registerPassword1" placeholder="请输入密码" >
<div class="invalid-feedback">
密码必须在6~10位之间
</div>
</div>
<div class="form-group">
<input id="register-passwords" class="input-material" type="password" name="registerPassword2" placeholder="确认密码" >
<div class="invalid-feedback">
两次密码必须相同 且在6~10位之间
</div>
</div>
<div class="form-group">
<button id="regbtn" type="submit" name="registerSubmit" class="btn btn-primary">注册</button>
</div>
<small>已有账号?</small><a href="UserLogin.jsp" class="signup"> 登录</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- JavaScript files-->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</form>
</body>
</html>
结语:刚开始学写博客,主要是为了记录自己的学习状态,有不足的地方大家可以一起交流讨论。