JavaWeb实现用户登录与注册功能(服务器)
作者:奈何桥下的一道光线√ 发布时间:2022-12-19 13:28:31
本文实例为大家分享了JavaWeb实现用户登录与注册功能的具体代码,供大家参考,具体内容如下
用到的知识
客户端:HTML CSS JS (JQuery)
服务器:JAVA基础 JSP Servlet JDBC Tomcat
数据库:MySQL
用到的Jar包 druid数据库连接池 dbutils JDBC数据库操作工具 MySQL jar包
总体结构:
客户端数据库部分网址
思路:
服务器部分采用JavaEE三层架构
(1)、表现层:通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
(2)、业务逻辑层:针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
(3)、数据访问层:该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。
先创建基本的文件夹架构,三层的文件夹依次为web ,servlet ,DAO。 此外还有其他相关文件夹工具类utils,JAVABean类pojo,测试类test 。依次实现从DAO层到Servce层再到Web层。
文件夹架构
资源文件 jdbc.properties
username=root
password=123456
url=jdbc:mysql://localhost:3306/book
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
一、DAO层
0.写好JAVABean User类
package com.book.pojo;
public class User {
private Integer id;
private String username;
private String password;
private String email;
public User() {
}
public User(Integer id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = 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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
1.先实现数据连接
JDBCUtils
package com.book.utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
private static DruidDataSource druidDataSource;
//数据库连接池初始化
static {
try {
InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");//类加载器默认是从classPath路径加载资源
Properties properties = new Properties();
properties.load(resourceAsStream);
//创建数据库连接池
druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
System.out.println("数据库连接池初始化异常");
}
}
//获取数据库连接池中的连接
public static Connection getConnection() {
Connection connection= null;
try {
connection = druidDataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
public static void close(Connection connection) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static void main(String[] args) {
JDBCUtils jdbcUtils=new JDBCUtils();
System.out.println(jdbcUtils.getConnection());
}
}
2.测试连接是否成功
3.编写BaseDAO 实现对数据库的基本通用操作
package com.book.DAO;
import com.book.utils.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 java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseDAO {
private QueryRunner queryRunner=new QueryRunner();
//数据库通用操作,使用dbutils来操作
//用来执行updata,delete,insert
public int updata(String sql,Object...objects){
Connection connection= JDBCUtils.getConnection();
try {
return queryRunner.update(connection,sql,objects);//返回影响的行数
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return -1;
}
//用来执行查询操作
public <T>T queryForOne(Class<T>clazz,String sql,Object...objects){
Connection connection=JDBCUtils.getConnection();
try {
return queryRunner.query(connection,sql,new BeanHandler<T>(clazz),objects);
} catch (Exception throwables) {
throwables.printStackTrace();
}
return null;
}
//查询多个结果
public <T>List<T> queryForList(Class<T>clazz,String sql,Object...objects){
Connection connection=JDBCUtils.getConnection();
List<T>list=new ArrayList<>();
try {
list=queryRunner.query(connection,sql,new BeanListHandler<T>(clazz),objects);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return list;
}
//查询单个数
public Object queryForSingleValue(String sql,Object...objects){
Connection connection= JDBCUtils.getConnection();
try {
return queryRunner.query(connection,sql,new ScalarHandler(),objects);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
4.编写UserDAO接口确定需要的操作
package com.book.DAO;
import com.book.pojo.User;
public interface UserDAO {
// 注册时判断是否该用户名已经被注册 根据用户名查询用户信息 如果返回null说明没有该用户
public User queryUserByUsername(String username);
//注册成功 保存用户信息
public int saveUser(User user);
//登录操作 根据用户名和密码查询用户 查不到返回null
public User queryUserByUsernameAndPassword(String username,String password);
}
5.UserDAOImpl实现UserDAO接口
package com.book.DAO;
import com.book.pojo.User;
//所犯错误:继承的子类会有父类的全部方法,不要在子类中声明父类对象,调用父类方法
public class UserDAOimpl extends BaseDAO implements UserDAO{
@Override
public User queryUserByUsername(String username) {
String sql="select * from users where username=?";
User user =queryForOne(User.class,sql,username);
return user;
}
//所犯错误:输入的邮箱不能重复
@Override
public int saveUser(User user) {
String sql="INSERT INTO `users`(`username`,`password`,`email`) VALUES(?,?,?)";
int n;
n = updata(sql,user.getUsername(),user.getPassword(),user.getEmail());
return n;
}
@Override
public User queryUserByUsernameAndPassword(String username, String password) {
String sql="select * from users where username=? and password=?";
User user=queryForOne(User.class,sql,username,password);
return user;
}
}
二、Servlet层
1.UserServce接口确定业务需要的方法,用来与Web层进行交互
package com.book.servlet;
import com.book.pojo.User;
//业务层一个业务一个方法
public interface UserServce {
//注册业务 注册成功将用户保存到数据库中
public void registUser(User user);
//登录业务
public User login(User user);
//检查用户名是否可用 返回true表示用户名已存在
public boolean existUsername(String username);
}
2.UserServceImpl类实现UserServce接口
package com.book.servlet;
import com.book.DAO.UserDAO;
import com.book.DAO.UserDAOimpl;
import com.book.pojo.User;
public class UserServceImpl implements UserServce {
private UserDAO userDAO=new UserDAOimpl();
@Override
public void registUser(User user) {
userDAO.saveUser(user);
}
@Override
public User login(User user) {
return userDAO.queryUserByUsernameAndPassword(user.getUsername(),user.getPassword());
}
@Override
public boolean existUsername(String username) {
//用户名不存在
if(userDAO.queryUserByUsername(username)==null){
return false;
}else {
return true;
}
}
}
三、Web层
1.注册操作
package com.book.web;
import com.book.pojo.User;
import com.book.servlet.UserServce;
import com.book.servlet.UserServceImpl;
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 {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserServce userServce=new UserServceImpl();
//获取请求参数
String username=req.getParameter("username");
String password=req.getParameter("password");
String email=req.getParameter("email");
String code=req.getParameter("code");
//判断验证码是否正确 忽略大小写
if("6n6np".equalsIgnoreCase(code)){
//判断是否存在用户名
if(!userServce.existUsername(username)){
//不存在则将注册信息写入数据库
User user=new User(null,username,password,email);
userServce.registUser(user);
//请求转发到注册成功页面
req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp);
}else{
System.out.println("用户名已存在");
//跳转到注册页面
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
}
}else {
System.out.println("验证码错误");
//跳转到注册页面
req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
}
}
}
2.登录操作
package com.book.web;
import com.book.pojo.User;
import com.book.servlet.UserServce;
import com.book.servlet.UserServceImpl;
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 UserServce userServce=new UserServceImpl();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数
String username=req.getParameter("username");
String password=req.getParameter("password");
User user=new User(null,username,password,null);
//判断用户的账号密码是否正确
if(userServce.login(user)!=null){
//登录成功跳转到登录成功页面
System.out.println("登录成功");
req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
}else{
//账号或密码不正确
System.out.println("账号或密码不正确");
req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
}
}
}
来源:https://blog.csdn.net/qq_52735683/article/details/119832074


猜你喜欢
- AudioSource 组件参考属性属性说明Clip音频资源Volume音量大小Mute是否静音Loop是否循环Play on load加载
- 这两天做了一个项目,发现标签不能更改任意一个标签的字体的颜色,需求如同置前标签,然后就对tagcloudeview稍做修改做了这么一个dem
- JavaFx初探一,UI控件的使用,具体内容如下方式一:使用纯代码直接new view控件,这样就不涉及到与fxml文件之间的交互了方式二:
- 选取单个元素直觉来说选取单个元素肯定会比选取多个要简单得多,不过这里也存在一些问题。我们先看下一般的做法的问题是什么,然后再看下如何用lam
- 最新idea2020安装部署超详细教程懂得懂的2020.32020.2.42020.2.32020.2.220.2.12019.32018.
- 1.Java 9以前堆栈遍历到目前为止,官方解决方案是获取当前线程并调用其getStackTrace()方法:StackTraceEleme
- 在Android中使用ImageView显示图片的时候发现图片显示不正,方向偏了或者倒过来了。 解决这个问题很自然想到的分两步走: 1、自动
- InputStreamReader和OutputStreamWriter源码分析1. InputStreamReader 源码(基于jdk1
- 引言CardView是Android 5.0系统之后引入的众多控件之一,实现之后的效果也是比较酷的,它经常被用在RecyclerView和L
- 本文实例演示了DevExpress实现GridControl单元格编辑验证的方法,比较实用的功能,具体方法如下:主要功能代码如下:/// &
- 这是调用相机 public static File getImageFromCamer(Context context, File
- 定时任务1import lombok.extern.slf4j.Slf4j;/** * @author Created by niugang
- TabHost控件默认使用LinearLayout包裹TabWidget和FrameLayout,布局文件如下:<TabHost xm
- 一、题目描述题目实现:不同的客户端之间需要进行通信,一个客户端与指定的另一客户端进行通信,实现一对一聊天功能。实现一个客户端与指定的另一客户
- 东西不多,但一般项目够用了。public class RegularUtil { //身份证 publi
- 属性CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调
- 本文实例讲述了C#图像边缘检测(Roberts)的方法。分享给大家供大家参考。具体如下://定义roberts算子函数private sta
- 延迟加载(lazy loading) 设计模式是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据(读取属性值)的时候,
- 在c#中怎样调用VC写的OCX控件,主要有两个关键环节两个关键环节:导入ocx控件,创建实例。1 注册ocx:regsvr32.exe al
- 引言Java * 机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理