JavaWeb(十一)——登录注册小案例
文章目錄
- 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
- 在Util 工具層 下引入一個(gè)JDBC工具類,名為DBUtils, DBUtils中封裝了對(duì)JDBC的操作
- 在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
- 在test 測(cè)試層創(chuàng)建Test類
在此,先測(cè)試連接數(shù)據(jù)庫(kù)是否成功
至此,項(xiàng)目包結(jié)構(gòu)如下
運(yùn)行結(jié)果如下,顯示連接成功
5. 編寫接口、實(shí)現(xiàn)登錄和注冊(cè)功能
- 在dao 接口層 編寫用戶的業(yè)務(wù)邏輯接口UserDao
有登錄、注冊(cè)以及根據(jù)用戶編號(hào)查詢用戶的方法
編寫接口的實(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è)效果
6. 編寫service層
跟dao層類似
- 編寫接口UsersService
- 編寫接口的實(shí)現(xiàn)類 UsersServiceImpl
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)題。
- 上一篇: SpringMVC(三)——JSON
- 下一篇: JavaSE(十九)——equals()