文件目录结构
在需要创建子文件夹的文件夹上面右键,选择New,平移过去,选择Directory
项目准备工作:
导包,数据库驱动,剩下两个包可以在tomcat安装目录,apache-tomcat-8.5.54\webapps\examples\WEB-INF\lib
数据库语句,建库,建表,插入测试数据
CREATE DATABASE USER
CREATE TABLE tbl_emp(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
PASSWORD VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
)
INSERT INTO tbl_emp(username,PASSWORD,email) VALUES('aaa','111','aaaa'),
('sss','222','dddd'),('ddd','222','dddd'),('fff','222','ffff'),('ggg','222','gggg')
web.xml 配置servlet
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
UserServlet
com.yuanwu.servlet.UserServlet
UserServlet
/action
1、User.java【JavaBean】
package com.yuanwu.bean;
/**
* @Author YuanWu
* @ClassName User
* @Date 2020/10/24
**/
public class User {
private int id;
private String username;
private String password;
private String email;
public User() {
}
public User(int id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2、UserDao.java
【dao层以及dao层实现类】是和数据库直接打交道的,sql语句,预编译等等
package com.yuanwu.dao;
import com.yuanwu.bean.User;
import java.util.List;
public interface UserDao {
//查询所有
public List getAddSave();
//登录,
public User getByIdAndUserName(String email,String userName);
//注册
public boolean insertAll(User user);
//先把要修改的id,查询出来
public User updateBySave(User user);
//根据id修改
public User updateByIdSave(Integer id);
//删除
public boolean delByIdSave(Integer id);
}
2、1,UserDaoImpl.java
【实现接口】
package com.yuanwu.dao.Impl;
import com.yuanwu.bean.User;
import com.yuanwu.dao.UserDao;
import com.yuanwu.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @Author YuanWu
* @ClassName UserDaoImpl
* @Date 2020/10/24
**/
public class UserDaoImpl implements UserDao {
List userList = new ArrayList<>();
@Override
public List getAddSave() {
Connection conn = DBUtil.getConn();
String sql = "select Id,username,password,email from tbl_emp";
try {
PreparedStatement pstm = conn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
userList.add(user);
}
return userList;
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return null;
}
@Override
public User getByIdAndUserName(String email, String userName) {
String sql = "select * from tbl_emp where email=? and username=?";
User user = null;
try {
Connection conn = DBUtil.getConn();
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1,email);
pstm.setString(2,userName);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
user = new User();
user.setId(rs.getInt("Id"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setUsername(rs.getString("userName"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.getClose();
}
return user;
}
@Override
public boolean insertAll(User user) {
boolean flag = false;
String sql = "insert into tbl_emp(username,password,email) values(?,?,?)";
Connection conn = DBUtil.getConn();
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1, user.getUsername());
pstm.setString(2, user.getPassword());
pstm.setString(3, user.getEmail());
if (pstm.executeUpdate() >1){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.getClose();
}
return flag;
}
@Override
public User updateBySave(User user) {
String sql = "UPDATE tbl_emp SET username=?,PASSWORD=?,email=? WHERE Id=?";
Connection conn = DBUtil.getConn();
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1, user.getUsername());
pstm.setString(2,user.getPassword());
pstm.setString(3, user.getEmail());
pstm.setInt(4, user.getId());
pstm.executeUpdate();
System.out.println("成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return user;
}
@Override
public User updateByIdSave(Integer id) {
String sql = "select * from tbl_emp where Id=?";
Connection conn = DBUtil.getConn();
User user = null;
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setInt(1,id);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
user = new User();
user.setId(rs.getInt("ID"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return user;
}
@Override
public boolean delByIdSave(Integer id) {
String sql = "delete from tbl_emp where Id=?";
int row = 0;
boolean flag = false;
Connection conn = DBUtil.getConn();
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setInt(1, id);
row = pstm.executeUpdate();
if (row > 0){
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return flag;
}
}
servlet
【相当于控制层controller】用户通过selvlet增删改查数据库,
BaseServlet.java
通过反射来减少if else的重复代码,
不过最好是所有的方法都用public修饰,可能会出现反射不到方法,出现异常
解决代码冗余,工具类
package com.yuanwu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
/**
* @Author YuanWu
* @ClassName BaseServlet
* @Date 2020/10/24
**/
public class BaseServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
System.out.println(action);
try {
Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
UserServlet.java
这里有点问题,请求转发不能填写jsp文件名,只能填写请求方法action?action=querySave,不然的话查询所有的页面查询不到,有点问题,暂时没想到解决办法。可能学习的知识不够全面,学漏了;
package com.yuanwu.servlet;
import com.yuanwu.bean.User;
import com.yuanwu.dao.Impl.UserDaoImpl;
import com.yuanwu.dao.UserDao;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* @Author YuanWu
* @ClassName UserServlet
* @Date 2020/10/24
**/
public class UserServlet extends BaseServlet{
//全部查询
protected void querySave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserDao userDao = new UserDaoImpl();
List list = userDao.getAddSave();
req.setAttribute("list",list);
req.getRequestDispatcher("/list.jsp").forward(req,resp);
}
//登录
protected void loginSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String email = req.getParameter("email");
String name = req.getParameter("username");
UserDao userDao = new UserDaoImpl();
User u = userDao.getByIdAndUserName(email,name);
if (u != null){
req.getSession().setAttribute("user",u);
req.getRequestDispatcher("/action?action=querySave").forward(req,resp);
// resp.sendRedirect("/action?action=querySave");
}else{
// req.getP
req.getSession().setAttribute("msg", "账号或者密码错误,请重新登录");
resp.sendRedirect("/login.jsp");
}
}
//注册
protected void registerSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
boolean flag = userDao.insertAll(user);
if (flag = true){
//sendRedirect
// resp.sendRedirect("/login,jsp");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}else {
req.getRequestDispatcher("/register").forward(req,resp);
}
}
//先根据id查询出想要修改的信息
protected void updateByIdSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
UserDao userDao = new UserDaoImpl();
User user = userDao.updateByIdSave(Integer.valueOf(id));
req.setAttribute("userId", user);
req.getRequestDispatcher("/update.jsp").forward(req,resp);
}
//修改
protected void updateByAllSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setId(Integer.parseInt(id));
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
try {
userDao.updateBySave(user);
} catch (Exception e) {
e.printStackTrace();
}
resp.sendRedirect(req.getContextPath()+"/action?action=querySave");
}
//删除
protected void deleteSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
UserDao userDao = new UserDaoImpl();
try {
userDao.delByIdSave(Integer.parseInt(id));
} catch (NumberFormatException e) {
e.printStackTrace();
}
resp.sendRedirect(req.getContextPath()+"/action?action=querySave");
}
}
UBUtil.java
工具类,将数据库连接封装起来,使用的时候,直接类名调用方法即可,因为用static修饰
不同的数据库,数据库驱动不同,数据库连接也不同,使用的时候按照自己数据库的要求填写。
这个数据库连接工具包其实还可以优化,
使用QueryRunner类(org.apache.commons.dbutils.QueryRunner),需要导入commons-dbutils-1.3.jar包,
package com.yuanwu.util;
import java.security.PrivateKey;
import java.sql.*;
/**
* @Author YuanWu
* @ClassName DBUtil
* @Date 2020/10/24
**/
public class DBUtil {
private static Connection conn;
private static PreparedStatement pstm;
private static ResultSet rs;
private static String url = "jdbc:mysql://localhost:3306/user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
public static Connection getConn(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn= DriverManager.getConnection(url, "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void getClose(){
try {
if (rs != null){
rs.close();
}
if (pstm != null){
pstm.close();
}
if (conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
index.jsp
这个是测试的,实际使用的时候没用到他
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 19:46
To change this template use File | Settings | File Templates.
--%>
$Title$--%>
list.jsp
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 20:05
To change this template use File | Settings | File Templates.
--%>
卢本伟NBDate date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = dateFormat.format(date);
%>
当前用户:${sessionScope.user.username},登录时间:
Iduserpasswordemail操作
${user_list.id}${user_list.username}${user_list.password}${user_list.email}查询的效果图
login.jsp
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 20:14
To change this template use File | Settings | File Templates.
--%>
卢本伟NBregister.jsp
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 21:59
To change this template use File | Settings | File Templates.
--%>
卢本伟NB注册卢本伟广场
User Name
Pass Word
Email address
Submit
update.jsp
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/25
Time: 17:37
To change this template use File | Settings | File Templates.
--%>
卢本伟NB修改的效果图
至此,基本的登录注册【增,查询】就做完了,还有修改、删除,后期有时间了会更新