日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

JavaWeb(十一)——登录注册小案例

發(fā)布時(shí)間:2025/3/13 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb(十一)——登录注册小案例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1. 在MySQL中創(chuàng)建一個(gè)用戶表
  • 2. 在IDEA中創(chuàng)建此項(xiàng)目
  • 3. 對(duì)項(xiàng)目進(jìn)行分層
  • 4. 測(cè)試數(shù)據(jù)庫(kù)是否連接成功
  • 5. 編寫接口、實(shí)現(xiàn)登錄和注冊(cè)功能
  • 6. 編寫service層
  • 7. 編寫servlet層
  • 8. 編寫filter過(guò)濾器
  • 9. 編寫JSP頁(yè)面
  • 10. 系統(tǒng)測(cè)試

1. 在MySQL中創(chuàng)建一個(gè)用戶表

2. 在IDEA中創(chuàng)建此項(xiàng)目

打開idea–>File–>New->Moudle–>JavaEnterprise–>勾選Web Application–>項(xiàng)目命名為logindemo

3. 對(duì)項(xiàng)目進(jìn)行分層

在src目錄下創(chuàng)建如下包,用于分層。
domain:實(shí)體類;servlet:控制層;dao:接口層;service:服務(wù)層;util:工具層;test:測(cè)試層
同時(shí)在WEB-INF目錄下創(chuàng)建一個(gè)lib目錄,先復(fù)制mysql-connector-java-5.1.6.jar包,并添加為Module jar包,用于連接數(shù)據(jù)庫(kù)。

4. 測(cè)試數(shù)據(jù)庫(kù)是否連接成功

  • 在domain 實(shí)體層下創(chuàng)建實(shí)體類 Users
    注意:實(shí)體類的名字盡量與數(shù)據(jù)庫(kù)中的表名一致,此項(xiàng)目中都名為Users
package com.zz.domain; import java.io.Serializable;//實(shí)體層:用戶表 //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 工具層 下引入一個(gè)JDBC工具類,名為DBUtils, DBUtils中封裝了對(duì)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封裝了對(duì)JDBC的操作 public class DBUtils {//訪問(wèn)數(shù)據(jù)庫(kù)的小幫手public static PreparedStatement pstm;// 數(shù)據(jù)庫(kù)連接池封裝對(duì)象public static DataSource dataSource;// 操作屬性文件對(duì)象public static Properties properties = new Properties();//完成類中靜態(tài)屬性初始化,并且多次訪問(wèn)時(shí),只有一次訪問(wèn)才會(huì)執(zhí)行此靜態(tài)塊,而且只執(zhí)行一次static {//讓is輸入流對(duì)象只想src目錄下的jdbc.propertiesInputStream is = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");try {//加載屬性文件到properties對(duì)象中properties.load(is);//數(shù)據(jù)庫(kù)連接加載配置文件,完成訪問(wèn)數(shù)據(jù)庫(kù)的所有配置dataSource = BasicDataSourceFactory.createDataSource(properties);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//保證線程安全的數(shù)據(jù)庫(kù)訪問(wèn),一個(gè)線程只綁定一個(gè)鏈接對(duì)象,多次訪問(wèn)時(shí)同一個(gè)連接對(duì)象private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();//打開數(shù)據(jù)庫(kù)連接public static Connection getConnection() {Connection conn = tl.get();// 從當(dāng)前線程上獲得鏈接try {if (conn == null || conn.isClosed() ) {//從連接池中獲取連接對(duì)象conn = dataSource.getConnection();// 把連接綁定到當(dāng)前線程上tl.set(conn);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;}//關(guān)閉所有數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象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();}}//關(guān)閉所有數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象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 {//添加第二個(gè)參數(shù)的意義是為了獲得新增記錄的主鍵。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 {//第二個(gè)參數(shù)的意思,執(zhí)行更新語(yǔ)句后可以獲得主鍵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();// 與線程池有關(guān),解除關(guān)系} catch (SQLException e) {e.printStackTrace();}}public static void endTransaction() {Connection conn = getConnection();try {conn.setAutoCommit(true);} catch (SQLException e) {e.printStackTrace();}} }
  • 在lib 目錄下按照之前的方法導(dǎo)入commons-dbcp2-2.7.0.jar、commons-logging-1.2.jar、commons-pool2-2.7.0.jar三個(gè)jar包,同樣以模塊jar包使用,至此lib目錄下,有如下四個(gè)jar包
  • 在src目錄下創(chuàng)建文件 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 測(cè)試層創(chuàng)建Test類
    在此,先測(cè)試連接數(shù)據(jù)庫(kù)是否成功
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();}} }

至此,項(xiàng)目包結(jié)構(gòu)如下

運(yùn)行結(jié)果如下,顯示連接成功

5. 編寫接口、實(shí)現(xiàn)登錄和注冊(cè)功能

  • 在dao 接口層 編寫用戶的業(yè)務(wù)邏輯接口UserDao
    有登錄、注冊(cè)以及根據(jù)用戶編號(hào)查詢用戶的方法
package com.zz.dao;import com.zz.domain.Users;//用戶的業(yè)務(wù)邏輯接口 public interface UsersDao {//用戶登錄public Users login(String name, String password);//用戶注冊(cè)public Users reg(Users users);//根據(jù)用戶編號(hào)查詢用戶public Users queryUserByid(int id); }

編寫接口的實(shí)現(xiàn)類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的實(shí)現(xiàn)類,實(shí)現(xiàn)接口的所有方法 public class UsersDaoImpl implements UsersDao {//用戶登錄@Overridepublic Users login(String name, String password) {Connection conn; // 連接對(duì)象ResultSet rs; //數(shù)據(jù)集List args = new ArrayList(); //參數(shù)集合String sql = "select * from users where name=? and password=?"; //?占位符Users loginUser = null; //用戶對(duì)象try {conn = DBUtils.getConnection();args.add(name);args.add(password);rs = DBUtils.myExecuteQuery(sql, args); //傳進(jìn)去返回一個(gè)數(shù)據(jù)集if (rs.next()) { //如果有下條記錄就說(shuō)明就登錄成功了。用戶資料返回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; //連接對(duì)象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();//開啟事務(wù)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) { //說(shuō)明注冊(cè)成功了。用戶資料返回//獲得新生成的用戶的編號(hào)。//問(wèn)題的焦點(diǎn)是你如何獲得新添加用戶的主鍵呢?ResultSet temp = DBUtils.pstm.getGeneratedKeys();temp.next();int id = temp.getInt(1);regUser = queryUserByid(id);}DBUtils.commit(); //提交事務(wù)DBUtils.endTransaction();return regUser;} catch (Exception ex) {ex.printStackTrace();DBUtils.rollback(); //回滾DBUtils.endTransaction(); //關(guān)閉事務(wù)return null;}}@Overridepublic Users queryUserByid(int id) {Connection conn; //連接對(duì)象ResultSet rs; //數(shù)據(jù)集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()){ //說(shuō)明就登錄成功了。用戶資料返回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;}} }
  • 在測(cè)試層 編寫測(cè)試類Test
    測(cè)試用戶的登錄效果,和注冊(cè)效果
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();}*///測(cè)試用戶登錄的效果。Users loginUser = null;UsersDao usersDao = new UsersDaoImpl();loginUser = usersDao.login("張某","123456");if(loginUser!=null){System.out.println("登錄成功!");}else{System.out.println("登錄失敗!");}/*// 測(cè)試用戶注冊(cè)的效果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);//用戶注冊(cè)public Users reg(Users users);//根據(jù)用戶編號(hào)查詢用戶public Users queryUserByid(int id);}
  • 編寫接口的實(shí)現(xiàn)類 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);}//執(zhí)行登錄動(dòng)作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");}}//執(zhí)行注冊(cè)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("注冊(cè)成功!");System.out.println(regUser);//頁(yè)面跳轉(zhuǎn)到登錄頁(yè)面。response.sendRedirect(request.getContextPath()+"/login.jsp");}else{System.out.println("注冊(cè)失敗!");}} }

8. 編寫filter過(guò)濾器

添加一個(gè)過(guò)濾器,防止中文亂碼

package com.zz.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import java.io.IOException;//規(guī)定,烏龜?shù)钠ü梢?guī)定。 @WebFilter(description = "EncodingFilter",value="/*",initParams ={@WebInitParam(name="encoding",value="utf-8")}) // 凡是過(guò)濾器一般都是 /* ,過(guò)濾所有的請(qǐng)求 public class EncodingFilter implements Filter {private String encoding;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.encoding = filterConfig.getInitParameter("encoding");}//過(guò)濾器過(guò)濾的是請(qǐng)求,什么樣的請(qǐng)求呢?各種各樣請(qǐng)求,只有是請(qǐng)求,就被過(guò)濾以下。能理解嗎?//過(guò)濾器在過(guò)濾器請(qǐng)求的時(shí)候,一定會(huì)執(zhí)行doFilter這個(gè)方法@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//請(qǐng)求使用utf-8servletRequest.setCharacterEncoding(this.encoding);//響應(yīng)也使用utf-8servletResponse.setCharacterEncoding(this.encoding);//不會(huì)有中文亂碼filterChain.doFilter(servletRequest,servletResponse); //千萬(wàn)不要忘了寫,過(guò)濾器鏈條,繼續(xù)向后過(guò)濾}@Overridepublic void destroy() {} }

9. 編寫JSP頁(yè)面

登錄頁(yè)面 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列合并,合并之后要把合并的那個(gè)單元格刪除掉,才能體現(xiàn)出效果text-align指這個(gè)div塊內(nèi)的文本居中--%><td colspan="2" style="text-align: center"><input type="submit" style="width:60px" value="登錄"></td></tr></table></form> </div></body> </html>

注冊(cè)頁(yè)面 reg.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>用戶注冊(cè)</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>用戶注冊(cè)</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">確認(rèn)密碼:</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="注冊(cè)"></td></tr></table></form> </div></body> </html>

主頁(yè)面 main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title></title> </head> <body> <h1>系統(tǒng)主頁(yè)面</h1> <hr> <div id="main">歡迎您:${sessionScope.loginUser.name}<br> </div> </body> </html>

登錄失敗頁(yè)面 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. 系統(tǒng)測(cè)試

測(cè)試用戶注冊(cè):
進(jìn)入用戶注冊(cè)頁(yè)面,進(jìn)行用戶注冊(cè),注冊(cè)成功后跳轉(zhuǎn)到用戶登錄頁(yè)面,刷新數(shù)據(jù)庫(kù)中Users表可查看,添加了剛注冊(cè)的用戶


測(cè)試用戶登錄:
進(jìn)入用戶登錄頁(yè)面,進(jìn)行用戶登錄,注冊(cè)成功后跳轉(zhuǎn)到系統(tǒng)主頁(yè)面

總結(jié)

以上是生活随笔為你收集整理的JavaWeb(十一)——登录注册小案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。