校园论坛(Java)—— 登录注册和用户信息模块
1、写在前面
- Windows版本:Windows10
- JDK版本:Java8
- MySQL版本:MySQL5.7
- Tomcat版本:Tomcat9.0
- IDE:IntelliJ IDEA Ultimate2020.2.3
2、系统结构设计
2.1 各个页面之间的调用关系
> 登录管理模块
login.jsp
:登录界面check_login()函数
:用于判断用户名和密码是否正确home.jsp
:登录成功进入主页界面
注册模块
register.jsp
:该界面用于新用户注册RegisterRepeatUserIdAck.jsp
:提示当前注册的ID已经被注册过number.jsp
:注册时验证码的生成功能login.jsp
:新用户注册完成后跳转到登录界面
用户信息模块
individualinfo.jsp
:显示个人信息的页面updateinfo.jsp
:修改个人信息界面check_login()函数
:修改功能会进行验证用户名和密码是否匹配
2.2. 登录注册模块各层的设计
- Entity层
实体层声明普通帖子的`user_id、user_name、user_password、user_sex、user_face、user_phone、user_email、user_from、isAdmin`等变量以及对应的set、get方法
/*** TODO 用户实体类*/publicclassUserEntity { // private String user_id;privateintuser_id; privateStringuser_name; privateStringuser_password; privateStringuser_sex; privateStringuser_face; privateStringuser_phone; privateStringuser_email; privateStringuser_from; privateintisAdmin; // 关联回复信息,一对多的关联privateList<ReplyEntity>replyList=newArrayList<ReplyEntity>(); // 和帖子进行关联,一对多privateList<ForumEntity>forumList=newArrayList<ForumEntity>(); publicintgetUser_id() { returnuser_id; } publicvoidsetUser_id(intuser_id) { this.user_id=user_id; } publicStringgetUser_name() { returnuser_name; } publicvoidsetUser_name(Stringuser_name) { this.user_name=user_name; } publicStringgetUser_password() { returnuser_password; } publicvoidsetUser_password(Stringuser_password) { this.user_password=user_password; } publicStringgetUser_sex() { returnuser_sex; } publicvoidsetUser_sex(Stringuser_sex) { this.user_sex=user_sex; } publicStringgetUser_face() { returnuser_face; } publicvoidsetUser_face(Stringuser_face) { this.user_face=user_face; } publicStringgetUser_phone() { returnuser_phone; } publicvoidsetUser_phone(Stringuser_phone) { this.user_phone=user_phone; } publicStringgetUser_email() { returnuser_email; } publicvoidsetUser_email(Stringuser_email) { this.user_email=user_email; } publicStringgetUser_from() { returnuser_from; } publicvoidsetUser_from(Stringuser_from) { this.user_from=user_from; } publicintgetIsAdmin() { returnisAdmin; } publicvoidsetIsAdmin(intisAdmin) { this.isAdmin=isAdmin; } publicList<ReplyEntity>getReplyList() { returnreplyList; } publicvoidsetReplyList(List<ReplyEntity>replyList) { this.replyList=replyList; } publicList<ForumEntity>getForumList() { returnforumList; } publicvoidsetForumList(List<ForumEntity>forumList) { this.forumList=forumList; } }
- Dao层
Dao层分别实现一个
interface
接口类以及一个接口方法
实现类
接口类:
publicinterfaceUserDaoInf { // TODO 登录时作用户的验证查询publicUserEntityfindUser(StringuserId, Stringpasswd); // TODO 根据id查询用户publicUserEntityfindUserById(intid); // TODO 添加用户publicintaddUser(UserEntityuser); // TODO 删除用户publicvoiddeleteUser(intuid); // TODO 修改用户publicvoidupdateUser(UserEntityuser); // TODO 查询所有用户信息publicList<UserEntity>findUserlist(); } ```>接口实现方法```publicclassUserDaoImplimplementsUserDaoInf{ publicUserEntityfindUser(StringuserId, Stringpasswd) { Connectionconn=null; PreparedStatementps=null; ResultSetrs=null; Stringsql="select * from user_info where user_id=? and user_password=?"; UserEntityuser=null; try{ conn=DBUtil.getConnection(); ps=conn.prepareStatement(sql); ps.setString(1, userId); ps.setString(2, passwd); rs=ps.executeQuery(); if(rs.next()){ user=newUserEntity(); user.setUser_id(rs.getInt(1)); user.setUser_name(rs.getString(2)); user.setUser_password(rs.getString(3)); user.setUser_sex(rs.getString(4)); user.setUser_face(rs.getString(5)); user.setUser_phone(rs.getString(6)); user.setUser_email(rs.getString(7)); user.setUser_from(rs.getString(8)); user.setIsAdmin(rs.getInt(9)); } } catch (Exceptione) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } returnuser; } publicintaddUser(UserEntityuser) { Connectionconn=null; PreparedStatementps=null; StringisRepeatUserId=""; inti=0; StringrepeatIDSql="SELECT \"true\" FROM user_info where user_id = "+user.getUser_id(); try { conn=DBUtil.getConnection(); ps=conn.prepareStatement(repeatIDSql); ResultSetresultSet=ps.executeQuery(); if (resultSet.next()) { isRepeatUserId=resultSet.getString(1); } System.out.println("查询完成!"); if ("true".equals(isRepeatUserId)) { System.out.println(isRepeatUserId); return0; } else { Stringsql="insert into user_info(user_id,user_name,user_password,user_sex,user_face,user_phone,user_email,user_from) values(?,?,?,?,?,?,?,?)"; System.out.println(user.getUser_id()); try { conn=DBUtil.getConnection(); ps=conn.prepareStatement(sql); ps.setInt(1, user.getUser_id()); ps.setString(2, user.getUser_name()); ps.setString(3, user.getUser_password()); ps.setString(4, user.getUser_sex()); ps.setString(5, user.getUser_face()); ps.setString(6, user.getUser_phone()); ps.setString(7, user.getUser_email()); ps.setString(8, user.getUser_from()); i=ps.executeUpdate(); System.out.println("插入数据库成功"); } catch (Exceptione){ e.printStackTrace(); } finally { DBUtil.close(null, ps, conn); } } } catch (Exceptione){ e.printStackTrace(); } finally { DBUtil.close(null, ps, conn); } returni; } publicvoiddeleteUser(intuid){ Connectionconn=null; PreparedStatementps=null; ResultSetrs=null; // TODO SQL:Stringsql="delete from user_info where user_id = ?"; try { conn=DBUtil.getConnection(); ps=conn.prepareStatement(sql); ps.setInt(1, uid); ps.executeUpdate(); System.out.println("删除用户成功!"); } catch (Exceptione) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } } publicvoidupdateUser(UserEntityuser){ Connectionconn=null; PreparedStatementps=null; ResultSetrs=null; Stringsql="update user_info set user_name=?,user_password=?,user_sex=?,user_face=?,user_phone=?,user_email=?,user_from=? where user_id=?"; try { conn=DBUtil.getConnection(); ps=conn.prepareStatement(sql); ps.setString(1, user.getUser_name()); ps.setString(2, user.getUser_password()); ps.setString(3, user.getUser_sex()); ps.setString(4, user.getUser_face()); ps.setString(5, user.getUser_phone()); ps.setString(6, user.getUser_email()); ps.setString(7, user.getUser_from()); ps.setInt(8, user.getUser_id()); ps.executeUpdate(); } catch (Exceptione) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } } publicUserEntityfindUserById(intid) { Connectionconn=null; PreparedStatementps=null; ResultSetrs=null; Stringsql="select * from user_info where user_id=?"; UserEntityuser=null; try{ conn=DBUtil.getConnection(); ps=conn.prepareStatement(sql); ps.setInt(1, id); rs=ps.executeQuery(); if (rs.next()) { user=newUserEntity(); user.setUser_id(rs.getInt(1)); user.setUser_name(rs.getString(2)); user.setUser_password(rs.getString(3)); user.setUser_sex(rs.getString(4)); user.setUser_face(rs.getString(5)); user.setUser_phone(rs.getString(6)); user.setUser_email(rs.getString(7)); user.setUser_from(rs.getString(8)); } } catch (Exceptione) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } returnuser; } publicList<UserEntity>findUserlist(){ Connectionconn=null; PreparedStatementps=null; ResultSetrs=null; List<UserEntity>userlist=newArrayList<UserEntity>(); Stringsql="select * from user_info"; try { conn=DBUtil.getConnection(); ps=conn.prepareStatement(sql); rs=ps.executeQuery(); while(rs.next()){ UserEntityuser=newUserEntity(); user.setUser_id(rs.getInt(1)); user.setUser_name(rs.getString(2)); user.setUser_password(rs.getString(3)); user.setUser_sex(rs.getString(4)); user.setUser_face(rs.getString(5)); user.setUser_phone(rs.getString(6)); user.setUser_email(rs.getString(7)); user.setUser_from(rs.getString(8)); user.setIsAdmin(rs.getInt(9)); userlist.add(user); } } catch (Exceptione) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } returnuserlist; } }
- service层
实现servlet层调用的方法,对数据库进行增删改查操作。
- Servlet层
在该层,通过jsp页面传递的参数,调用相应的方法进行操作。
- filter层
拦截过滤层,对注册用户时,验证码的过滤操作
publicclassEncodingFilterimplementsFilter { privateStringencode; publicvoiddestroy() { } publicvoiddoFilter(ServletRequestrequest, ServletResponseresponse, FilterChainchain) throwsIOException, ServletException { if (encode!=null) { request.setCharacterEncoding(encode); response.setCharacterEncoding(encode); } chain.doFilter(request, response); } publicvoidinit(FilterConfigconfig) throwsServletException { encode=config.getInitParameter("encode"); } }
3、登录注册模块设计
3.1 用户注册功能
进入登录页面后,对于第一次登录的用户来说,首先需要注册,单击「新用户注册」按钮即可进入注册界面,注册完成后返回登录界面。然后,在对应的地方分别输入用户名和密码,点击「登录」按钮,系统即将用户名和密码发送到网络服务器上,与保存在服务器数据库中的信息进行核对。若核对正确,则进入帖子浏览的界面,若不正确,会有提示账号或者密码出错,随即重新返回登录界面。
注册界面如下所示:
register.jsp
页面实现注册界面,同时判断用户ID是否已被注册过了,若被注册过,则 RegisterRepeatUserIdAck.jsp
会提示已注册。注册的最后一步需要通过 验证码
验证。信息填写完整并通过验证码验证后,由「注册」按钮实现用户增加的逻辑操作。
用户ID判空功能
学号判重
学号检验
联系电话检验
邮箱格式检验
验证码检验
3.2 用户登录功能
登录界面的制作
先考虑登录主界面的制作,再通过JavaScript标记语言判断输入的用户名和密码是否为空;
登录界面如下所示:
登录功能的实现
通过 login.jsp
界面传递参数 user_id
和 user_password
给 LoginServlet.java
,然后查询数据库,判断用户名和密码是否正确,对于密码在传输的过程中会使用`MD5`进行 加密
(hex_md5(user_password))。若判断正确则为用户建立一个 Session
,并进入了Fosu校园论坛主界面。
4、用户个人信息
4.1 查看个人信息
在系统右上角选择
个人信息
一栏,即可查看个人信息。
4.2 修改个人信息
选择「修改资料」按钮即可修改用户个人信息,包括用户名、密码、性别、联系电话、电子邮箱、地址、头像的更改。
如下图所示: