接上節:http://4440271.blog.51cto.com/4430271/1661880
修改校驗邏輯,從數據庫中獲取用戶信息進行校驗:
結合jsp, jdbc, servlet;
首先,修改UserDao接口
添加方法聲明,用來根據用戶名和密碼獲取用戶信息。
代碼:
package com.jike.dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import com.jike.entity.User; //定義實現類的行爲 public interface UserDao { //定義對數據庫的操作 public void save(Connection conn, User user) throws SQLException; public void update(Connection conn, Long id, User user) throws SQLException; public void delete(Connection conn, User user) throws SQLException; // 登陸頁面 public ResultSet get(Connection conn, User user) throws SQLException; }
添加具體實現,添加方法:
代碼:
package com.jike.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.jike.dao.UserDao; import com.jike.entity.User; public class UserDaoImpl implements UserDao { /* * 保存用戶信息 */ @Override public void save(Connection conn, User user) throws SQLException { // TODO Auto-generated method stub //PreparedStatement是jdbc用於執行sql查詢語句的api之一,用來執行參數化的查詢 //?是佔位符 PreparedStatement ps = conn.prepareStatement ("insert into tbl_user(name, password, email) values (?,?,?)"); //參數設置 ps.setString(1, user.getName());//索引從1開始 ps.setString(2, user.getPassword()); ps.setString(3, user.getEmail()); ps.execute(); //將參數傳入的user對象中的相關信息保存到數據庫表中 } /* * 根據用戶id更新用戶信息 */ @Override public void update(Connection conn, Long id, User user) throws SQLException { // TODO Auto-generated method stub String updateSql = "update tbl_user set name=?, password=?, email=? where id=?"; PreparedStatement ps = conn.prepareStatement(updateSql); ps.setString(1, user.getName()); ps.setString(2, user.getPassword()); ps.setString(3, user.getEmail()); ps.setLong(4, id); ps.execute(); } /* * 刪除指定的用戶信息 */ @Override public void delete(Connection conn, User user) throws SQLException { // TODO Auto-generated method stub PreparedStatement ps = conn.prepareStatement("delete from tbl_user where id=?"); ps.setLong(1, user.getId()); ps.execute(); } @Override public ResultSet get(Connection conn, User user) throws SQLException { // TODO Auto-generated method stub PreparedStatement ps = conn.prepareStatement ("select * from tbl_user where name = ? and password = ?"); ps.setString(1, user.getName()); ps.setString(2, user.getPassword()); return ps.executeQuery(); } }
創建service類, 在service類中執行登陸校驗的邏輯。它調用Dao層的數據庫訪問邏輯判斷數據是否獲取成功,如果成功獲取,則返回布爾值true,否則返回false。
package com.jike.service; import java.sql.Connection; import com.jike.dao.UserDao; import com.jike.dao.impl.UserDaoImpl; import com.jike.entity.User; import com.jike.jdbc.util.ConnectionFactory; import com.mysql.jdbc.ResultSet; //校驗用戶信息 public class CheckUserService { private UserDao userDao = new UserDaoImpl(); public boolean check(User user){//執行登陸校驗邏輯 Connection conn = null; try { conn = ConnectionFactory.getInstance().makeConnection(); conn.setAutoCommit(false); ResultSet resultSet = (ResultSet)userDao.get(conn, user);//執行查詢 while(resultSet.next()){//如果查詢到,返回true return true; } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); try { conn.rollback(); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } }finally{ try { conn.close(); } catch (Exception e3) { // TODO: handle exception e3.printStackTrace(); } } return false; } }
控制層:
新建Servlet:
package com.jike.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.jike.entity.User; import com.jike.service.CheckUserService; //CheckServlet作爲控制器,根據CheckUserServlet的校驗結果,將用戶導航到不同的頁面 public class CheckServlet extends HttpServlet { /** * */ private static final long serialVersionUID = -2941368629779903572L; private CheckUserService cku = new CheckUserService(); public CheckServlet() { super(); } public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取用戶提交的信息 String uname = request.getParameter("uname"); String passwd = request.getParameter("upwd"); RequestDispatcher rd = null; String forward = null; // 非空判斷 if(uname == null || passwd == null){ request.setAttribute("msg", "用戶名或密碼爲空"); rd = request.getRequestDispatcher("/09/error.jsp"); rd.forward(request, response); }else{ //若合法,則登陸校驗 User user = new User(); user.setName(uname); user.setPassword(passwd); //進行校驗 boolean bool = cku.check(user); //根據校驗結果進入不同頁面 if(bool){ forward = "/09/success.jsp"; }else{ request.setAttribute("msg", "用戶名或密碼錯誤,請重新輸入!"); forward = "/09/error.jsp"; } rd = request.getRequestDispatcher(forward); rd.forward(request, response); } } public void init() throws ServletException { // Put your code here } }
在web.xml中添加配置信息
<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>CheckServlet</servlet-name> <servlet-class>com.jike.servlet.CheckServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CheckServlet</servlet-name> <url-pattern>/CheckServlet</url-pattern> </servlet-mapping>
表示層登陸頁面設置:
在WebRoot下創建09文件夾,創建login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <!-- 使用css美化當前頁面 --> <style type="text/css"> body{ color: #000; font-size: 14px; margin: 20px auto; } </style> <script type="text/javascript"> function check(form){ if(document.forms.loginForm.uname.value==""){ alert("請輸入用戶名"); document.forms.loginForm.uname.focus(); return false; } if(document.forms.loginForm.upwd.value==""){ alert("請輸入密碼"); document.forms.loginForm.upwd.focus(); return false; } } </script> <title>Insert title here</title> </head> <body> <form action="<%= request.getContextPath() %>/CheckServlet" name="loginForm"> <table border="1" cellspacing="0" cellpadding="5" bordercolor="silver" align="center"> <tr> <!-- 提示信息 --> <td colspan="2" align="center" bgcolor="#E8E8E8">用戶登陸</td> </tr> <tr> <td>用戶名:</td> <td><input type="text" name="uname" /></td> </tr> <tr> <td>密碼:</td> <td><input type="password" name="upwd" /></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" name="submit" onclick="return check(this);"/> <input type="reset" name="reset"/> </td> </tr> </table> </form> </body> </html>
添加success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> body{ color: #000; font-size: 14px; margin: 20px auto; } #message{ text-align: center; } </style> <title>Insert title here</title> </head> <body> <div id="massage"> 登陸成功<br/> 用戶名: <%= request.getParameter("uname") %><br/> 密碼:<%= request.getParameter("upwd") %><br/> <a href="<%=request.getContextPath()%>/09/login.jsp">返回登陸頁面</a> </div> </body> </html>
添加error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> body{ color: #000; font-size: 14px; margin: 20px auto; } #message{ text-align: center; } </style> <title>Insert title here</title> </head> <body> <div id="massage"> 登陸失敗<br/> 錯誤提示 <% Object obj = request.getAttribute("msg"); if(obj !=null){ out.println(obj.toString()); }else{ out.println("無"); } %> <br/> 用戶名: <%= request.getParameter("uname") %><br/> 密碼:<%= request.getParameter("upwd") %><br/> <a href="<%=request.getContextPath() %>/09/login.jsp">返回登陸頁面</a> </div> </body> </html>
測試程序: