Create Table CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL, `password` varchar(32) NOT NULL, `email` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
查找替换:
ctrl+shift+r
ctrl +r
package domain;
import java.util.Objects;
public class User {
private Integer id;
private String username;
private String password;
private String email;
public User(Integer 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
+ '''
+ '}';
}
@Override
public int hashCode() {
return Objects.hash(id, username, password, email);
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
public User() {}
}
2.3 JDBCUtils
package utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
private static DruidDataSource ds;
static {
// 记得lib目录要add as li
try {
// 1.加载配置文件
Properties pro = new Properties();
// 使用Classloader加载配置文件,获取字节输入流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
// 这个异常try catch一下
// 2.初始化连接池对象
ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro);
// 写完这个去UserDao完成login方法
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return ds;
}
public static Connection getConnection() throws Exception {
Connection conn = null;
try {
conn = ds.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
public static void close(Connection conn) {
if (conn != null) {
//
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
2.3.1 bug
2.3.1.1 空指针异常
原因:是数据库驱动版本问题
IDEA JE项目,将配置文件放在resources目录下
方法1:clean 一下 :没用
方法2 :添加 mysql-connector-java依赖 并下载jar包
修改pom文件dependencies 变成如下
mysql mysql-connector-java8.0.25
并去SQL官网下载 mysql-connector-java-8.0.25-bin.jar 并更改project structure内的内容,详见上面部分 【自己sql的版本】
sql官网connector下载
添加到自己工程lib目录下并修改如下:
报错:java.sql.SQLException: validateConnection false
原因:durid 版本过低,与sql-connector版本不匹配
查询后修改pom文件,增加
com.alibaba druid1.1.22
并下载 druid 1.1.22 【根据自己情况二选一】
下载地址
变成如下: 终于连接好了
方法1 :
方法2
很奇怪,这里无法get connection
于是换成
解决!
代码如下
package test;
import org.junit.Test;
import utils.JDBCUtils;
public class JdbcUtilsTest {
@Test
public void TestJdbcUtils() throws Exception {
System.out.println(JDBCUtils.getConnection());
}
}
测试结果如下:
并注意:
package impl;
import com.alibaba.druid.util.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import utils.JDBCUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
public abstract class baseDao {
//用 DbUtils操作数据库
private QueryRunner qr = new QueryRunner();
public int update(String sql, Object... args) throws Exception {
Connection conn = JDBCUtils.getConnection();
try {
return qr.update(conn, sql, args);
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.close(conn);
}
return -1;
}
public T queryForOne(Classtype,String sql,Object ...args) throws Exception {
Connection conn = JDBCUtils.getConnection();
try {
return qr.query(conn,sql,new BeanHandler(type),args);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally{
JdbcUtils.close(conn);
}
return null;
}
public List queryForList(Classtype, String sql, Object ...args) throws Exception {
Connection conn = JDBCUtils.getConnection();
try {
return qr.query(conn,sql,new BeanListHandler(type),args);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally{
JdbcUtils.close(conn);
}
return null;
}
public Object queryForSinglevalue(String sql,Object ...args) throws Exception {
Connection conn = JDBCUtils.getConnection();
try {
return qr.query(conn,sql,new ScalarHandler(),args);
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.close(conn);
}
return null;
}
}
2.4 UserDao
2.3.1 userDao
package dao;
import domain.User;
public interface UserDao {
public User queryUserByUserName(String username) throws Exception;
public User queryUserNameAndPassword(String username, String Password) throws Exception;
public int saveUser(User user) throws Exception;
}
2.3.2 UserDaoImpl
package dao.impl;
import dao.UserDao;
import domain.User;
public class UserDaoImpl extends baseDao implements UserDao {
@Override
public User queryUserByUserName(String username) throws Exception {
String sql = "select `id`,`username`,`password`,`email` from t_user where username = ?";
return queryForOne(User.class, sql, username);
}
@Override
public User queryUserNameAndPassword(String username, String password) throws Exception {
String sql =
"select `id`,`username`,`password`,`email` from t_user where username = ? and password = ?";
return queryForOne(User.class, sql, username, password);
}
@Override
public int saveUser(User user) throws Exception {
String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";
return update(sql, user.getUsername(), user.getPassword(), user.getEmail());
}
}
2.3.2.1 测试
生成方法:Ctrl+shift+t
package test;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.User;
import org.junit.Test;
public class UserDaoImplTest {
UserDao userDao = new UserDaoImpl();
@Test
public void queryUserByUserName() throws Exception {
if (userDao.queryUserByUserName("admin") == null) {
System.out.println("用户名可用");
} else {
System.out.println("用户名已存在");
}
}
@Test
public void queryUserNameAndPassword() throws Exception {
if (userDao.queryUserNameAndPassword("admin", "admin") == null) {
System.out.println("用户名或密码错误");
} else {
System.out.println("查询成功");
}
}
@Test
public void saveUser() throws Exception {
System.out.println(userDao.saveUser(new User(2, "admin1", "123456", "shdgyd@qq.com")));
}
}
2.3.2.2 测试bug junit 版本过低
junit 版本过低
解决方法:
Junit8下载链接
2.3.2.3 没有查询出结果sql没存入数据
解决:
INSERT INTO t_user(`username`,`password`,`email`) VALUES('admin ','admin','admin@qq.com');
2.5 Service
2.5.1 UserService
package service;
import domain.User;
public interface UserService {
public void registUser(User user) throws Exception;
public User login(User user) throws Exception;
public boolean existUsername(String username) throws Exception;
}
2.5.2 UserServiceImpl
package service.impl;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.User;
import service.UserService;
public class UserServiceImpl implements UserService {
// 需要操作数据库
private UserDao userDao = new UserDaoImpl();
@Override
public void registUser(User user) throws Exception {
userDao.saveUser(user);
}
@Override
public User login(User user) throws Exception {
return userDao.queryUserNameAndPassword(user.getUsername(), user.getPassword());
}
@Override
public boolean existUsername(String username) throws Exception {
if (userDao.queryUserByUserName(username) == null) {
// 等于null表示没查到,也就是可用
return false;
}
return false;
}
}
2.5.3 test
package test;
import domain.User;
import org.junit.Test;
import service.UserService;
import service.impl.UserServiceImpl;
public class UserServiceTest {
UserService userService = new UserServiceImpl();
@Test
public void registUser() throws Exception {
userService.registUser(new User(2, "bb2635", "44444", "hsgsyvs@qq.com"));
}
@Test
public void login() throws Exception {
System.out.println(userService.login(new User(2, "bb2635", "44444", "hsgsyvs@qq.com")));
}
@Test
public void existUsername() throws Exception {
if (userService.existUsername("bb2635")) {
System.out.println("用户名已存在");
} else {
System.out.println("用户名可用");
}
}
}
2.6 RegistServlet
2.6.1 web.xml
RegistServlet web.servlet.RegietServlet RegistServlet /registServlet
!! 项目的开发中用绝对路径(框架阶段) 或 base+相对路径(web阶段)
本阶段用base+相对路径,所以要给需要的页面都加base
启动成功
package web.servlet;
import domain.User;
import service.UserService;
import service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RegistServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
private static final long serialVersionUID = -8085319310579984236L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
String code = req.getParameter("code");
// 2、检查 验证码是否正确 === 写死,要求验证码为:abcde
if ("abcde".equalsIgnoreCase(code)) {
// 3、检查 用户名是否可用
try {
if (userService.existUsername(username)) {
System.out.println("用户名[" + username + "]已存在!");
// 跳回注册页面
req.getRequestDispatcher("loginRegist.html").forward(req, resp);
} else {
// 可用
// 调用Service保存到数据库
userService.registUser(new User(null, username, password, email));
//
// 跳到注册成功页面 regist_success.html
req.getRequestDispatcher("loginRegist_success.html").forward(req, resp);
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("验证码[" + code + "]错误");
req.getRequestDispatcher("loginRegist.html").forward(req, resp);
}
}
}
2.4 loginServlet
2.4.1 web.xml
LoginServlet
web.servlet.LoginServlet
LoginServlet
/loginServlet
2.4.2 LoginServlet
package web.servlet;
import domain.User;
import service.UserService;
import service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 6815621054614223781L;
private UserService userService = new UserServiceImpl();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 调用 userService.login()登录处理业务
User loginUser = null;
try {
loginUser = userService.login(new User(null, username, password, null));
} catch (Exception e) {
e.printStackTrace();
}
// 如果等于null,说明登录 失败!
if (loginUser == null) {
// 跳回登录页面
req.getRequestDispatcher("loginRegist.html").forward(req, resp);
} else {
// 登录 成功
// 跳到成功页面login_success.html
req.getRequestDispatcher("login_success.html").forward(req, resp);
}
}
}
2.5 UserServlet 【Regist Login Servlet 合并】
2.5.2 映射路径
import javax.servlet.annotation.WebServlet;
@WebServlet("/userServlet")注解代替读取web.xml的配置,即:
package web.servlet;
import domain.User;
import service.UserService;
import service.impl.UserServiceImpl;
import utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/userServlet")
public class UserServlet extends baseServlet {
private static final long serialVersionUID = -8091529342806668006L;
private UserService userService = new UserServiceImpl();
protected void login(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 1、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 调用 userService.login()登录处理业务
User loginUser = userService.login(new User(null, username, password, null));
// 如果等于null,说明登录 失败!
if (loginUser == null) {
// 把错误信息,和回显的表单项信息,保存到Request域中
req.setAttribute("msg", "用户或密码错误!");
req.setAttribute("username", username);
// 跳回登录页面
req.getRequestDispatcher("/login.jsp").forward(req, resp);
} else {
// 登录 成功
// 跳到成功页面login_success.html
req.getRequestDispatcher("/login_success.jsp").forward(req, resp);
}
}
protected void regist(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 1、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
String code = req.getParameter("code");
User user = WebUtils.copyParamToBean(req.getParameterMap(), new User());
// 2、检查 验证码是否正确 === 写死,要求验证码为:abcde
if ("abcde".equalsIgnoreCase(code)) {
// 3、检查 用户名是否可用
if (userService.existUsername(username)) {
System.out.println("用户名[" + username + "]已存在!");
// 把回显信息,保存到Request域中
req.setAttribute("msg", "用户名已存在!!");
req.setAttribute("username", username);
req.setAttribute("email", email);
// 跳回注册页面
req.getRequestDispatcher("loginRegist.jsp").forward(req, resp);
} else {
// 可用
// 调用Service保存到数据库
userService.registUser(new User(null, username, password, email));
//
// 跳到注册成功页面 regist_success.jsp
req.getRequestDispatcher("regist_success.jsp").forward(req, resp);
}
} else {
// 把回显信息,保存到Request域中
req.setAttribute("msg", "验证码错误!!");
req.setAttribute("username", username);
req.setAttribute("email", email);
System.out.println("验证码[" + code + "]错误");
req.getRequestDispatcher("loginRegist.jsp").forward(req, resp);
}
}
}
2.6 baseServlet
package web.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public abstract class baseServlet extends HttpServlet {
private static final long serialVersionUID = 6509980383138397669L;
@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 {
// 解决post请求中文乱码问题
// 一定要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
String action = req.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method =
this.getClass()
.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// System.out.println(method);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}package web.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;
public abstract class baseServlet extends HttpServlet {
private static final long serialVersionUID = 6509980383138397669L;
@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 {
// 解决post请求中文乱码问题
// 一定要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
String action = req.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method =
this.getClass()
.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// System.out.println(method);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Beanutils 下载地址
comment logging 下载地址
解决方法:去除web.xml的配置
package web.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
private static final long serialVersionUID = -5449163807777119134L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 给页面写一句话
// 设置编码
response.setContentType("text/html;charset=utf-8");
// 输出
response.getWriter().write("登陆失败,用户名或密码错误");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
2.6 successServlet
package web.servlet;
import domain.User;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/successServlet")
public class SuccessServlet extends HttpServlet {
private static final long serialVersionUID = -3673955596722541985L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取request域中共享的user对象
User user = (User) request.getAttribute("user");
// 防止空指针异常
if (user != null) {
// 给页面写一句话
// 设置编码
response.setContentType("text/html;charset=utf-8");
// 输出
response.getWriter().write("登陆成功 " + user.getUsername() + "欢迎您");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
3. bug :错误500
3.1 问题描述:
@Override
public void run() {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
}
3.2 解决分析:
提示:可能是目录结构问题,排查完结构问题后,删除lib目录重新添加,并配置如下
3.3 结果
然后又遇到:war exploded: Error during artifact deployment.卡到这不动,各种解决方法,最后删掉web.xml文件里乱七八糟的,写成如下,
3.4 解决方法


