文章目录

  • 1. 在MySQL中创建一个用户表
  • 2. 在IDEA中创建此项目
  • 3. 对项目进行分层
  • 4. 测试数据库是否连接成功
  • 5. 编写接口、实现登录和注册功能
  • 6. 编写service层
  • 7. 编写servlet层
  • 8. 编写filter过滤器
  • 9. 编写JSP页面
  • 10. 系统测试

1. 在MySQL中创建一个用户表

2. 在IDEA中创建此项目

打开idea–>File–>New->Moudle–>JavaEnterprise–>勾选Web Application–>项目命名为logindemo

3. 对项目进行分层

在src目录下创建如下包,用于分层。
domain:实体类;servlet:控制层;dao:接口层;service:服务层;util:工具层;test:测试层
同时在WEB-INF目录下创建一个lib目录,先复制mysql-connector-java-5.1.6.jar包,并添加为Module jar包,用于连接数据库。

4. 测试数据库是否连接成功

  • 在domain 实体层下创建实体类 Users
    注意:实体类的名字尽量与数据库中的表名一致,此项目中都名为Users
package com.zz.domain;
import java.io.Serializable;//实体层:用户表
//Serializable接口是启用其序列化功能的接口
public class Users implements Serializable {private int id;private String name;private String gender;private String password;private String email;private String birthday;public Users() {}public Users(int id, String name, String gender, String password, String email, String birthday) {this.id = id;this.name = name;this.gender = gender;this.password = password;this.email = email;this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}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 String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Users{" +"id=" + id +", name='" + name + '\'' +", gender='" + gender + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +", birthday='" + birthday + '\'' +'}';}
}
  • 在Util 工具层 下引入一个JDBC工具类,名为DBUtils, DBUtils中封装了对JDBC的操作
package com.zz.util;import java.io.InputStream;
import java.sql.*;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;//DBUtils封装了对JDBC的操作
public class DBUtils {//访问数据库的小帮手public static PreparedStatement pstm;// 数据库连接池封装对象public static DataSource dataSource;// 操作属性文件对象public static Properties properties = new Properties();//完成类中静态属性初始化,并且多次访问时,只有一次访问才会执行此静态块,而且只执行一次static {//让is输入流对象只想src目录下的jdbc.propertiesInputStream is = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");try {//加载属性文件到properties对象中properties.load(is);//数据库连接加载配置文件,完成访问数据库的所有配置dataSource = BasicDataSourceFactory.createDataSource(properties);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//保证线程安全的数据库访问,一个线程只绑定一个链接对象,多次访问时同一个连接对象private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();//打开数据库连接public static Connection getConnection() {Connection conn = tl.get();// 从当前线程上获得链接try {if (conn == null || conn.isClosed() ) {//从连接池中获取连接对象conn = dataSource.getConnection();// 把连接绑定到当前线程上tl.set(conn);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;}//关闭所有数据库访问对象public static void closeAll(Connection con, PreparedStatement pstm,ResultSet rs) {try {if (rs != null)rs.close();if (pstm != null)pstm.close();if (con != null && !con.isClosed())con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//关闭所有数据库访问对象public static void closeAll() {try {if (pstm != null)pstm.close();if (DBUtils.getConnection() != null && !DBUtils.getConnection().isClosed())DBUtils.getConnection().close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 所有的增删改的方法public static int myExecuteUpdate(String sql, List list) throws Exception {//添加第二个参数的意义是为了获得新增记录的主键。pstm = getConnection().prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);if (list != null) {for (int i = 0; i < list.size(); i++) {pstm.setObject(i + 1, list.get(i));}}return pstm.executeUpdate();}// 所有的查询的方法public static ResultSet myExecuteQuery(String sql, List list) {try {//第二个参数的意思,执行更新语句后可以获得主键pstm = getConnection().prepareStatement(sql);if (list != null) {for (int i = 0; i < list.size(); i++) {pstm.setObject(i + 1, list.get(i));}}return pstm.executeQuery();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public static void startTransaction() {Connection conn = getConnection();try {conn.setAutoCommit(false);} catch (SQLException e) {e.printStackTrace();}}public static void commit() {Connection conn = getConnection();try {conn.commit();} catch (SQLException e) {e.printStackTrace();}}public static void rollback() {Connection conn = getConnection();try {conn.rollback();} catch (SQLException e) {e.printStackTrace();}}public static void release() {Connection conn = getConnection();try {conn.close();tl.remove();// 与线程池有关,解除关系} catch (SQLException e) {e.printStackTrace();}}public static void endTransaction() {Connection conn = getConnection();try {conn.setAutoCommit(true);} catch (SQLException e) {e.printStackTrace();}}
}
  • 在lib 目录下按照之前的方法导入commons-dbcp2-2.7.0.jar、commons-logging-1.2.jar、commons-pool2-2.7.0.jar三个jar包,同样以模块jar包使用,至此lib目录下,有如下四个jar包
  • 在src目录下创建文件 jdbc.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/xbky?useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
initialSize=20
  • 在test 测试层创建Test类
    在此,先测试连接数据库是否成功
package com.zz.test;import com.zz.util.DBUtils;import java.sql.Connection;public class Test {public static void main(String[] args) {Connection conn;try {conn = DBUtils.getConnection();if(conn!=null){System.out.println("sql连接成功!");}else{System.out.println("sql连接失败!");}}catch (Exception ex){ex.printStackTrace();}}
}

至此,项目包结构如下

运行结果如下,显示连接成功

5. 编写接口、实现登录和注册功能

  • 在dao 接口层 编写用户的业务逻辑接口UserDao
    有登录、注册以及根据用户编号查询用户的方法
package com.zz.dao;import com.zz.domain.Users;//用户的业务逻辑接口
public interface UsersDao {//用户登录public Users login(String name, String password);//用户注册public Users reg(Users users);//根据用户编号查询用户public Users queryUserByid(int id);
}

编写接口的实现类UsersDaoImpl

package com.zz.dao.impl;import com.zz.dao.UsersDao;
import com.zz.domain.Users;
import com.zz.util.DBUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;//接口UsersDao的实现类,实现接口的所有方法
public class UsersDaoImpl implements UsersDao {//用户登录@Overridepublic Users login(String name, String password) {Connection conn;  // 连接对象ResultSet rs;  //数据集List args = new ArrayList(); //参数集合String sql = "select * from users where name=? and password=?";  //?占位符Users loginUser = null;  //用户对象try {conn = DBUtils.getConnection();args.add(name);args.add(password);rs = DBUtils.myExecuteQuery(sql, args);  //传进去返回一个数据集if (rs.next()) { //如果有下条记录就说明就登录成功了。用户资料返回loginUser = new Users();loginUser.setId(rs.getInt("id"));loginUser.setName(rs.getString("name"));loginUser.setPassword(rs.getString("password"));loginUser.setGender(rs.getString("gender"));loginUser.setEmail(rs.getString("email"));loginUser.setBirthday(rs.getString("birthday"));}return loginUser;} catch (Exception ex) {ex.printStackTrace();return null;}}@Overridepublic Users reg(Users users) {Connection conn; //连接对象List args = new ArrayList();String sql = "insert into users (name,password,gender,email,birthday) values (?,?,?,?,?)";Users regUser = null;int result;try {conn = DBUtils.getConnection();DBUtils.startTransaction();//开启事务args.add(users.getName());args.add(users.getPassword());args.add(users.getGender());args.add(users.getEmail());args.add(users.getBirthday());result = DBUtils.myExecuteUpdate(sql, args);if (result > 0) { //说明注册成功了。用户资料返回//获得新生成的用户的编号。//问题的焦点是你如何获得新添加用户的主键呢?ResultSet temp = DBUtils.pstm.getGeneratedKeys();temp.next();int id = temp.getInt(1);regUser = queryUserByid(id);}DBUtils.commit(); //提交事务DBUtils.endTransaction();return regUser;} catch (Exception ex) {ex.printStackTrace();DBUtils.rollback(); //回滚DBUtils.endTransaction(); //关闭事务return null;}}@Overridepublic Users queryUserByid(int id) {Connection conn; //连接对象ResultSet rs; //数据集List args = new ArrayList();String sql = "select * from users where id=?";Users user = null;try{conn = DBUtils.getConnection();args.add(id);rs = DBUtils.myExecuteQuery(sql,args);if(rs.next()){ //说明就登录成功了。用户资料返回user = new Users();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setPassword(rs.getString("password"));user.setGender(rs.getString("gender"));user.setEmail(rs.getString("email"));user.setBirthday(rs.getString("birthday"));}return user;}catch(Exception ex){ex.printStackTrace();return null;}}
}
  • 在测试层 编写测试类Test
    测试用户的登录效果,和注册效果
package com.zz.test;import com.zz.dao.UsersDao;
import com.zz.dao.impl.UsersDaoImpl;
import com.zz.domain.Users;
import com.zz.util.DBUtils;import java.sql.Connection;public class Test {public static void main(String[] args) {/* Connection conn;try {conn = DBUtils.getConnection();if(conn!=null){System.out.println("sql连接成功!");}else{System.out.println("sql连接失败!");}}catch (Exception ex){ex.printStackTrace();}*///测试用户登录的效果。Users loginUser = null;UsersDao usersDao = new UsersDaoImpl();loginUser = usersDao.login("张某","123456");if(loginUser!=null){System.out.println("登录成功!");}else{System.out.println("登录失败!");}/*// 测试用户注册的效果Users regUser = new Users();regUser.setName("王某");regUser.setGender("男");regUser.setPassword("654321");regUser.setEmail("wang@qq.com");regUser.setBirthday("1998-11-10");UsersDao usersDao = new UsersDaoImpl();regUser = usersDao.req(regUser);System.out.println(regUser);*/}
}

6. 编写service层

跟dao层类似

  • 编写接口UsersService
package com.zz.service;import com.zz.domain.Users;public interface UsersService {//用户登录public Users login(String name, String password);//用户注册public Users reg(Users users);//根据用户编号查询用户public Users queryUserByid(int id);}
  • 编写接口的实现类 UsersServiceImpl
package com.zz.service.impl;import com.zz.dao.UsersDao;
import com.zz.dao.impl.UsersDaoImpl;
import com.zz.domain.Users;
import com.zz.service.UsersService;public class UsersServieImpl implements UsersService {private UsersDao usersDao = new UsersDaoImpl();@Overridepublic Users login(String username, String password) {return usersDao.login(username,password);}@Overridepublic Users reg(Users users) {return usersDao.reg(users);}@Overridepublic Users queryUserByid(int id) {return usersDao.queryUserByid(id);}
}

7. 编写servlet层

package com.zz.servlet;import com.zz.domain.Users;
import com.zz.service.UsersService;
import com.zz.service.impl.UsersServieImpl;
import com.zz.service.impl.UsersServieImpl;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;@WebServlet(name = "UsersServlet",value="UsersServlet")
public class UsersServlet extends HttpServlet {private String action ;private UsersService usersService = new UsersServieImpl();protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {if(request.getParameter("action")!=null){this.action = request.getParameter("action");switch(this.action){case "login":login(request,response);break;case "reg":reg(request,response);break;}}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}//执行登录动作private void login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{Users loginUser = null;loginUser = usersService.login(request.getParameter("name"),request.getParameter("password"));if(loginUser!=null){System.out.println("登录成功!");//把登录成功的用户保存到session中request.getSession().setAttribute("loginUser",loginUser);response.sendRedirect(request.getContextPath()+"/main.jsp");}else{System.out.println("登录失败!");response.sendRedirect(request.getContextPath()+"/login_failure.jsp");}}//执行注册private void reg(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{Users user = new Users();user.setName(request.getParameter("name"));user.setPassword(request.getParameter("password"));user.setGender(request.getParameter("gender"));user.setEmail(request.getParameter("email"));user.setBirthday(request.getParameter("birthday"));Users regUser = null;regUser = usersService.reg(user);if(regUser!=null){System.out.println("注册成功!");System.out.println(regUser);//页面跳转到登录页面。response.sendRedirect(request.getContextPath()+"/login.jsp");}else{System.out.println("注册失败!");}}
}

8. 编写filter过滤器

添加一个过滤器,防止中文乱码

package com.zz.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;//规定,乌龟的屁股规定。
@WebFilter(description = "EncodingFilter",value="/*",initParams ={@WebInitParam(name="encoding",value="utf-8")}) // 凡是过滤器一般都是 /* ,过滤所有的请求
public class EncodingFilter implements Filter {private String encoding;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.encoding = filterConfig.getInitParameter("encoding");}//过滤器过滤的是请求,什么样的请求呢?各种各样请求,只有是请求,就被过滤以下。能理解吗?//过滤器在过滤器请求的时候,一定会执行doFilter这个方法@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//请求使用utf-8servletRequest.setCharacterEncoding(this.encoding);//响应也使用utf-8servletResponse.setCharacterEncoding(this.encoding);//不会有中文乱码filterChain.doFilter(servletRequest,servletResponse); //千万不要忘了写,过滤器链条,继续向后过滤}@Overridepublic void destroy() {}
}

9. 编写JSP页面

登录页面 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用户登录</title><style>#regDiv {/*div水平居中*/margin: 0px auto;width: 400px;height: 70px;border: 1px solid #ccc;padding: 10px;}h1 {text-align: center;}input {width: 280px;}.label {width: 30%;}.controller {width: 70%;}table {border-collapse: collapse;border-spacing: 0px 0px;height: auto;}</style>
</head>
<body>
<h1>用户登录</h1><div id="regDiv"><form action="${pageContext.request.contextPath}/UsersServlet?action=login" method="post"><table><tr><td class="label">用户名:</td><td class="controller"><input type="text" name="name"></td></tr><tr><td class="label">密码:</td><td class="controller"><input type="password" name="password"></td></tr><tr><%--colspan=“2”是指将2列合并,合并之后要把合并的那个单元格删除掉,才能体现出效果text-align指这个div块内的文本居中--%><td colspan="2" style="text-align: center"><input type="submit" style="width:60px" value="登录"></td></tr></table></form>
</div></body>
</html>

注册页面 reg.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用户注册</title><style>#regDiv {/*div水平居中*/margin: 0px auto;width: 400px;height: 160px;border: 1px solid #ccc;padding: 10px;}h1 {text-align: center;}input {width: 280px;}.label {width: 30%;}.controller {width: 70%;}table {border-collapse: collapse;border-spacing: 0px 0px;height: auto;}</style>
</head>
<body>
<h1>用户注册</h1><div id="regDiv"><form action="${pageContext.request.contextPath}/UsersServlet?action=reg" method="post"><table><tr><td class="label">用户名:</td><td class="controller"><input type="text" name="name"></td></tr><tr><td class="label">密码:</td><td class="controller"><input type="password" name="password"></td></tr><tr><td class="label">确认密码:</td><td class="controller"><input type="password" name="confirmpass"></td></tr><tr><td class="label">性别:</td><td class="controller"><input type="radio" style="width:20px" name="gender" value="男" checked/>男<input type="radio" style="width:20px"  name="gender" value="女" />女</td></tr><tr><td class="label">电子邮箱:</td><td class="controller"><input type="text" name="email" value=""/></td></tr><tr><td class="label">出生日期:</td><td class="controller"><input type="date" name="birthday" value=""/></td></tr><tr><td colspan="2" style="text-align: center"><input type="submit" style="width:60px" value="注册"></td></tr></table></form>
</div></body>
</html>

主页面 main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title></title>
</head>
<body>
<h1>系统主页面</h1>
<hr>
<div id="main">欢迎您:${sessionScope.loginUser.name}<br>
</div>
</body>
</html>

登录失败页面 login_failure.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>登录失败</h1>
<hr>
<a href="login.jsp">返回</a>
</body>
</html>

10. 系统测试

测试用户注册:
进入用户注册页面,进行用户注册,注册成功后跳转到用户登录页面,刷新数据库中Users表可查看,添加了刚注册的用户


测试用户登录:
进入用户登录页面,进行用户登录,注册成功后跳转到系统主页面

JavaWeb(十一)——登录注册小案例相关推荐

  1. 登录注册小程序(JAVA基础案例教程第二章-课后作业)

    [案例介绍] 任务描述 编写程序实现简单的登录注册功能.程序包含以下4个功能: (1)登录功能,用户输入正确的账号密码进行成功: (2)注册功能,输入用户名和密码进行注册: (3)查看功能,查看所有的 ...

  2. Java基础案例2-6:登录注册小程序

    [案例2-6] 登录注册小程序 [案例介绍] 编写程序实现简单的登录注册功能.程序包含以下4个功能: (1)登录功能,用户输入正确的账号密码进行成功: (2)注册功能,输入用户名和密码进行注册: (3 ...

  3. JavaWeb项目(登录注册页面)全过程详细总结

    文章目录 JavaWeb项目(登录注册页面)全过程总结 一.环境准备与开发工具 二.创建 JavaWeb 项目2.1 新建Dynamic Web Project项目2.2 创建前端页面2.2.1 登录 ...

  4. java简单小程序_Java简易登录注册小程序

    这篇文章主要介绍了Java图形界面开发,简易登录注册小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的 ...

  5. Java图形界面开发—简易登录注册小程序

    登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的地方,详见其它博客. Java程序操作数据库SQLserver详解 功能介绍:简单的登录注册系统,使用了数据库 ...

  6. 2020-2-15一个web登录注册小程序与Spring初始+作业

    文章目录 建立一个Web登录注册小程序 1.先在Mysql数据库中新建一个数据库 2.在IDEA中新建一个工程 3.对项目进行简单分层 4.设计一个实体类 5.引入一个jdbc工具类 6.写一个测试类 ...

  7. UI设计灵感|App的登录注册页面案例参考

    良好的交互细节是每一个优秀 App 的共同品质,而多数 App 被用户抛弃就是因为登录注册页面的问题,只有从用户场景和视角来思考产品,便能设计出打动人心的 App. 集设网www.ijishe.com ...

  8. JavaWeb:shiro入门小案例

    学习原因:刚接触Javaweb的时候懂的很少(当然现在也不多),所以开发一个小项目都是自己从头写到尾,从登录界面一直到数据库,当时想以后开发要是都这么写那不是很枯燥?!-知道后来团队开发,接触的开发人 ...

  9. java实现登录注册案例_Java基于IO版实现用户登录注册的案例

    下面小编就为大家带来一篇基于IO版的用户登录注册实例(Java).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 今天学的是用户登录注册功能. 4个包: itcast.c ...

最新文章

  1. exec不同文件l怎么汇总_ABAQUS常见问题汇总 - 2.0版.doc
  2. linux中默认安装php,Linux系统中Apache PHP MySQL的默认安装路径
  3. 微信小程序:一把瑞士军刀
  4. 10个让人厌烦的编程语言
  5. 欢迎使用CSDN-markdown编辑器132133
  6. 怎么更改sql的实例版本_学会复杂一点的SQL语句:Oracle DDL和DML
  7. C语言预处理#line、#error
  8. 虚幻的东西_世间一切皆为虚幻
  9. 比char还小的变量
  10. ireport 用html页面上 图片怎么都出不来 全是红叉的处理办法
  11. [原创]Jenkins持续集成工具介绍
  12. linux下编译geos,linux下编译GDAL3.x(集成Proj和Geos等)
  13. The Code is successfully generatd...使用stm32cude生成工程时报错
  14. 如何编写Word文档 多级编号
  15. 学习使用 OpenCV 中的函数 cv2.kmeans() 对数据进行分类
  16. 论文阅读【A multi-task attention tree neural net for stance classification and rumor veracity detection】
  17. 特征提取网络之Darknet
  18. 为什么short_open_tag设置成On仍无效
  19. C语言:如何extern一个结构体,当一个结构体(或结构体数组)被两个c文件同时引用时如何定义
  20. dwcc2019写php,dreamweaver

热门文章

  1. md5碰撞Java_java现在MD5加密不安全了吗?
  2. 2017年11月04日普及组 Biotech
  3. linux 文件io实例代码,linux 文件IO(示例代码)
  4. git 查看修改明细_git 查看指定文件的修改历史记录
  5. c5a电池_手机锂电池基本性能科普和参数测试
  6. php 获取当前url hash,http - 我可以在服务器端应用程序(PHP,Ruby,Python等)上读取URL的哈希部分吗?...
  7. SQL学习(三)之子句和函数
  8. Redis list(列表)
  9. django 通过数据库表名获取app名
  10. Spark:如何替换sc.parallelize(List(item1,item2)).collect().foreach(row={})为并行?