大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员... 2、这几年,我整理了很多IT技术相关的教程给大家,爱生活、爱分享。3、如果您觉得文章有用,请收藏,转发,评论,并关注我,谢谢!
博客导航跳转(请收藏):邵奈一的技术博客导航 | 公众号 | 微信| CSDN | 掘金 | 51CTO | 简书 | 微博 |
0x00 教程内容
准备数据库表 初始化工程 编写后端代码 编写前端代码
温馨提示:内容较长,可以关注+收藏!
0x01 准备数据库表
1. 创建数据库并创建表
自行创建一个数据库,然后创建一张user表:
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT 'default',
`password` varchar(50) NOT NULL DEFAULT '123456',
`role` int(10) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
role字段说明:0:管理员 1:普通用户 默认注册的时候,是只能注册成普通用户。
2. 插入三条数据
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'lisa', '123123', '0');
INSERT INTO `user` VALUES ('2', 'tony', '123123', '1');
INSERT INTO `user` VALUES ('3', 'tom', '123123', '1');
0x02 初始化工程
1. 新建一个JavaWeb项目
(1)添加自己的 Tomcat
进来,选择 Web Application
,同时,如果没有选择创建 web.xml
文件的话,记得勾选一下:
2. 初始化工程目录
(1)在WEB-INF文件夹下,创建一个lib文件夹,将MySQL驱动复制进入:(2)设置MySQL驱动为需要加载的驱动:
3. 新建好包结构
(1)我的包结构如下,直接在 src
文件夹里创建即可:
└─com
└─java
├─dao
│ └─impl
├─domain
├─servlet
└─utils
0x03 编写后端代码
1. 代码及项目结构总览
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20221026_f2e2e390-54d1-11ed-a27b-fa163eb4f6be.png)
2. 编写实体类
package com.java.domain;
import java.util.Objects;
/**
* @Author shaonaiyi@163.com
* @Date 2022/3/6 11:03
* @Description 用户实体类
*/
public class User {
// 用户id
private int id;
// 用户名
private String username;
// 密码
private String password;
// 用户角色(0:管理员;1:普通用户)
private int role;
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;
}
public int getRole() {
return role;
}
public void setRole(int role) {
this.role = role;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
role == user.role &&
Objects.equals(username, user.username) &&
Objects.equals(password, user.password);
}
@Override
public int hashCode() {
return Objects.hash(id, username, password, role);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", role=" + role +
'}';
}
}
3. 编写Dao层接口
package com.java.dao;
import com.java.domain.User;
/**
* @Author shaonaiyi@163.com
* @Date 2022/3/6 14:32
* @Description 用户dao层接口
*/
public interface UserDao {
// 登录
User login(String username, String password);
// 注册
Boolean register(User user);
}
4. 编写数据库连接工具类
package com.java.utils;
import java.sql.*;
/**
* @Author shaonaiyi@163.com
* @Date 2022/3/6 12:40
* @Description 数据库连接工具类
*/
public class JdbcUtil {
/**
* 1、获取Connection
* @return Connection
* @throws Exception
*/
public static Connection getConnection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaweb","root", "123456");
return connection;
}
/**
* 2、释放资源
* @param resultSet
* @param statement
* @param connection
*/
public static void release(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
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 main(String[] args) throws Exception {
// Connection connection = JdbcUtil.getConnection();
// System.out.println(connection);
// }
}
5. 编写Dao层接口实现类
package com.java.dao.impl;
import com.java.dao.UserDao;
import com.java.domain.User;
import com.java.utils.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @Author shaonaiyi@163.com
* @Date 2022/3/6 14:32
* @Description 用户dao层实现类
*/
public class UserDaoImpl implements UserDao {
/**
* 登录
* @param username 用户名
* @param password 密码
* @return 用户对象
*/
public User login(String username, String password) {
User user = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtil.getConnection();
String sql = "select * from user where username = ? and password= ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();
if(resultSet.next()){
user = new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setRole(resultSet.getInt("role"));
System.out.println("登录成功" + user.toString());
} else {
System.out.println("用户名或者密码错误");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.release(resultSet, preparedStatement, connection);
}
return user;
}
/**
* 注册
* @param user 用户对象
*/
public Boolean register(User user){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
int result = 0;
try {
connection = JdbcUtil.getConnection();
String sql = "insert into user(username, password) values (?, ?);";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
result = preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.release(resultSet, preparedStatement, connection);
}
// 三目表达式,result等1则人会true,否则返回false
return result == 1 ? true:false;
}
}
6. 修改web.xml文件
(1)设置欢迎首页
<!--设置启动首页为login.jsp-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
(2)设置登陆和注册Servlet
<!--设置servlet-->
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.java.servlet.LoginServlet</servlet-class>
</servlet>
<!--设置servlet的url-->
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!--设置servlet-->
<servlet>
<servlet-name>registerServlet</servlet-name>
<servlet-class>com.java.servlet.RegisterServlet</servlet-class>
</servlet>
<!--设置servlet的url-->
<servlet-mapping>
<servlet-name>registerServlet</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
7. 编写LoginServlet代码
package com.java.servlet;
import com.java.dao.UserDao;
import com.java.dao.impl.UserDaoImpl;
import com.java.domain.User;
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;
/**
* @Author shaonaiyi@163.com
* @Date 2022/3/6 12:40
* @Description 登录Servlet
*/
@WebServlet(name = "/login")
public class LoginServlet extends HttpServlet {
@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 {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
// 获取前端页面传过来的值
String username = req.getParameter("username");
String password = req.getParameter("password");
String role = req.getParameter("role");
// 执行查询数据库逻辑
UserDao userDao = new UserDaoImpl();
User user = userDao.login(username, password);
// 如果根据用户名和密码能查得到值
if (user != null) {
int roleDb = user.getRole();
// 权限的选择跟数据库不匹配时,且不是管理员用户时,返回无权限
if (roleDb != Integer.parseInt(role) && roleDb != 0) {
req.setAttribute("message", "无权限登录");
req.getRequestDispatcher("/defeat.jsp").forward(req,resp);
} else {
req.setAttribute("user", user);
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
} else { // 用户名或者密码错误执行以下代码
req.setAttribute("message", "用户名或者密码错误");
req.getRequestDispatcher("/defeat.jsp").forward(req,resp);
}
}
}
8. 编写RegisterServlet代码
package com.java.servlet;
import com.java.dao.UserDao;
import com.java.dao.impl.UserDaoImpl;
import com.java.domain.User;
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;
/**
* @Author shaonaiyi@163.com
* @Date 2022/3/6 16:38
* @Description 注册servlet
*/
@WebServlet(name = "/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPut(req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
// id不需要传进来,角色默认注册是普通用户,无法注册管理员
String username = req.getParameter("username");
String password = req.getParameter("password");
User user = new User();
user.setUsername(username);
user.setPassword(password);
UserDao userDao = new UserDaoImpl();
if (userDao.register(user)) {
System.out.println("注册成功");
// 注册成功,跳转登录页面
req.getRequestDispatcher("register-success.jsp").forward(req,resp);
} else {
System.out.println("注册失败");
req.setAttribute("message", "注册失败");
req.getRequestDispatcher("register.jsp").forward(req,resp);
}
}
}
至此,后端代码已经编写好了,还需要完成前端页面代码。
0x04 编写前端代码
1. 编写login.jsp代码
<%--
Created by IntelliJ IDEA.
User: shaonaiyi
Date: 2022/3/6
Time: 14:47
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>登录页面</h2>
<form action="/login" method="post">
<table style="margin-left:40%">
<tr>
<td>用户名:</td>
<td><input type="text" size="21" name="username"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" size="21" name="password"/></td>
</tr>
<tr>
<td>角色:</td>
<td>
<input type="radio" name="role" value="0" checked="checked">管理员
<input type="radio" name="role" value="1">普通用户
</td>
</tr>
</table>
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</form>
<a href="register.jsp">跳转注册</a>
</div>
</body>
</html>
2. 编写success.jsp代码
<%@ page import="com.java.domain.User" %><%--
Created by IntelliJ IDEA.
User: shaonaiyi
Date: 2022/3/6
Time: 14:59
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>
<br>
<font color="red">
<%
User user = (User)request.getAttribute("user");
String username = user.getUsername();
%>
欢迎您:
<%
out.print(username);
%>
</font>
</body>
</html>
3. 编写defeat.jsp代码
<%--
Created by IntelliJ IDEA.
User: shaonaiyi
Date: 2022/3/6
Time: 14:59
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>
<font color="red">
<%
if(request.getAttribute("message")!= null){
out.print(request.getAttribute("message"));
}
%>
</font>
<br>
<a href="login.jsp">重新登录</a>
</body>
</html>
4. 编写register.jsp代码
<%--
Created by IntelliJ IDEA.
User: shaonaiyi
Date: 2022/3/6
Time: 16:37
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="/register" method="post">
<table style="margin-left:40%">
<h2>用户注册</h2>
<tr>
<td>用户名:</td>
<td><input name="username" type="text" size="21"></td>
</tr>
<tr>
<td>密码:</td>
<td><input name="password" type="password" size="21"></td>
</tr>
</table>
<input type="submit" value="注册">
<input type="reset" value="重置">
</form>
<a href="login.jsp">跳转登录</a>
</form>
</div>
</body>
</html>
5. 编写register-success.jsp代码
<%@ page import="com.java.domain.User" %><%--
Created by IntelliJ IDEA.
User: shaonaiyi
Date: 2022/3/6
Time: 14:59
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>
<br>
<a href="login.jsp">跳转登录</a>
<a href="register.jsp">继续注册</a>
</body>
</html>
0xFF 总结
本篇教程内容比较长,适合初学者学习,但是也需要有一点基础,比如环境的配置,但如果你稍微有点基础,操作一下这篇文章是非常不错的,特别是代码。 关于JavaWeb其他文章参考:
JavaWeb项目如何配置Servlet 使用Eclipse打开IDEA写的JavaWeb项目【全网唯一教程】
邵奈一 原创不易,如转载请标明出处,教育是一生的事业。
文章转载自邵奈一,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。