時間:2023-10-06 18:00:01 | 來源:網站運營
時間:2023-10-06 18:00:01 來源:網站運營
Java Web實驗報告:MVC模式及其應用:注:本實驗代碼要根據(jù)實際做適當修改才能運行package demo.JavaBeans;public class User { String username = null; String password = null; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
第二步:設計DAO對象 (統(tǒng)一放在deom.DAO包下)package demo.DAO;import java.sql.*;import javax.sql.DataSource;import javax.naming.*;public interface DAO { // 查找并返回數(shù)據(jù)源對象 public static DataSource getDataSource(){ DataSource dataSource = null; try { Context context = new InitialContext(); dataSource = (DataSource)context.lookup("java:comp/env/jdbc/DBLoginDS"); //上面的參數(shù)參照context.xml 配置屬性 name="jdbc/DBLoginDS" }catch(NamingException ne){ System.out.println("異常:"+ne); } return dataSource; } // 返回連接對象方法 public default Connection getConnection() throws DAOException { DataSource dataSource = getDataSource(); Connection conn = null; try{ conn = dataSource.getConnection(); }catch(SQLException sqle){ System.out.println("異常:"+sqle); } return conn; } }
設計DAOException類是一個異常類,當DAO類中的方法發(fā)生運行時異常時拋出異常。package demo.DAO;public class DAOException extends Exception{ private static final long serialVersionUID = 19192L; private String message; public DAOException() {} public DAOException(String message){ this.message = message; } public String getMessage(){ return message; } public void setMessage(String message) { this.message = message; } public String toString(){ return message; }}
UserDAO類實現(xiàn)了DAO接口提供了對User對象的持久化的各種方法package demo.DAO;import demo.JavaBeans.User;import java.util.*;import java.sql.*;import demo.JavaBeans.User;import java.util.logging.Level;import java.util.logging.Logger;public class UserDAO implements DAO { //addUser(User user)添加用戶 public boolean addUser(User user) throws DAOException { Connection conn = getConnection(); String sql = "INSERT INTO tb_user(username,password) VALUES(?,?)"; try { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getPassword()); pstmt.executeUpdate(); } catch (SQLException sqle) { System.out.println(sqle); return false; } try { conn.close(); } catch (SQLException ex) { Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex); } return true; } /* find(User user) 在數(shù)據(jù)庫中查詢是否存在user的記錄, 存在返回true,否則返回false */ public boolean find(User user) throws DAOException { String sql = "SELECT * FROM tb_user WHERE username =? and password=?"; //User user = new User(); try ( Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getPassword()); try (ResultSet rst = pstmt.executeQuery()) { if (rst.next()) { //user.setUsername(rst.getString("username")); //user.setPassword(rst.getString("password")); conn.close(); return true; } } } catch (SQLException se) { System.out.println(se); return false; } return false; }}
第三步:視圖類設計 login.jsp+register.jsp實現(xiàn)登陸和注冊界面,并且分別實現(xiàn)了異常處理視圖。<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html> <head> <title>登錄</title> <script> <%-- 這里是JavaScript --%><%-- html加載完畢后,立刻執(zhí)行--%>window.onload = function () { document.getElementById("img").onclick = function () { <%-- document.getElementById()會通過元素的id來獲取整個元素, 也就是說先獲取. "img" 元素, 然后.onclick(),點擊觸發(fā)一個事件,這個事件會執(zhí)行funciton()函數(shù)。 目的就是點擊id為img的這個頁面元素,就會觸發(fā)funciton函數(shù)。--%> this.src = "CheckcodeServlet?time" + new Date().getTime(); <%-- 疑問點 --> <%-- 增加時間戳來更換驗證碼圖片 --%> };}; </script> <script type="text/javascript"> function Check() { for(var i=0;i<document.form1.elements.length-1;i++) { if(document.form1.elements[i].value=="") { alert("不允許空!"); document.form1.elements[i].focus(); return false; } } return true; } </script><style> div{ color: red; }</style> </head> <body> <form action="LoginServlet" method="post" name="form1" onSubmit="return Check()"> <!--疑問點:return--> <table> <tr> <td>用戶名</td> <td><input type="text" name="username" size="25"></td> </tr> <tr> <td>密碼</td> <td><input type="text" name="password" size="25"></td> </tr> <tr> <td>驗證碼</td> <td><input type="text" name="checkcode" size="15"> <img id="img" src="CheckcodeServlet" alt="" size="10" align="center"> <!id為img的頁面元素,驗證碼圖像; (JavaScript:document.getElementById("img").onclick )> </td> </tr> <tr> <td><input type="submit" value="登錄"></td> <td>無賬號請<a href="regist.jsp">注冊</a></td> <!單擊打開注冊界面(JavaScript:function reg())> </tr> </table> </form> <%-- 用戶名或密碼錯誤 --%> <div>${requestScope.login_error}</div> <%-- 驗證碼錯誤 --%> <div>${requestScope.checkcode_error}</div> </body></html>
register.jsp實現(xiàn)注冊界面。<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><script type="text/javascript"> <%--檢查是否表單內容均已填寫 --%> function Check() { for(var i=0;i<document.form1.elements.length-1;i++) { if(document.form1.elements[i].value=="") { alert("不允許空!"); document.form1.elements[i].focus(); return false; } } return true; } </script><style> div{ color: red; }</style><html><head> <title>注冊</title></head><body><form action="RegistServlet" method="post" name="form1" onSubmit="return Check()"> <table> <tr> <td>用戶名</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密   碼</td> <td><input type="text" name="password"></td> </tr> </table> <p><input type="submit" value="確定注冊"> 有賬號請直接<a href="login.jsp">登錄</a></form><%-- 注冊成功 --%><div>${requestScope.regist_success}</div><%-- 用戶名被占有,注冊失敗 --%><div>${requestScope.regist_error}</div></body></html>
success.jsp實現(xiàn)登陸成功界面<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html><head> <title>Title</title></head><body><%-- <h1>歡迎您${requestScope.user}</h1> --%> <h1>歡迎您<%=request.getSession().getAttribute("user")%></h1></body></html>
STEP 4:控制器設計package demo.Servlet;import demo.DAO.DAOException;import demo.DAO.UserDAO;import demo.JavaBeans.User;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 javax.servlet.http.HttpSession;import java.io.IOException;import java.util.logging.Level;import java.util.logging.Logger;import javax.servlet.RequestDispatcher;@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置字符編碼 request.setCharacterEncoding("utf-8"); //讀客戶端參數(shù) String username = request.getParameter("username");//讀用戶名 String password = request.getParameter("password");//讀口令 String checkcode = request.getParameter("checkcode");//獲取生成的驗證碼 // System.out.println(username+":"+password+":"+checkcode); HttpSession session = request.getSession(); String checkcode_session = (String) session.getAttribute("checkcode_session"); //防止驗證碼存儲 刪除Session中存儲的驗證碼 //checkcode-session來自CheckcodeServlet中的會話設置 session.removeAttribute("checkcode_session"); //判斷驗證碼是否正確,equalsIgnoreCase忽略大小寫的比較 if (checkcode_session != null && checkcode_session.equalsIgnoreCase(checkcode)) { //驗證碼正確 User user = new User(); user.setUsername(username); user.setPassword(password); boolean flag = false; UserDAO userdao = new UserDAO(); try { flag = userdao.find(user); } catch (DAOException ex) { System.out.println(ex); } if (flag) { //用戶名和口令正確,登錄成功 //儲用戶信息到會話:session session.setAttribute("user", username); //請求轉發(fā)到success.jsp(不能重定向) RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/success.jsp"); rd.forward(request, response); } else { //用戶名或口令錯誤,登錄失敗 //提示信息存儲到請求對象:request request.setAttribute("login_error", "用戶名或口令錯誤"); //請求轉發(fā)到登錄頁面login.jsp request.getRequestDispatcher("/login.jsp").forward(request, response); } } else { //驗證碼錯誤,提示信息到存儲請求對象:request request.setAttribute("checkcode_error", "驗證碼錯誤"); //請求轉發(fā)到登錄頁面 request.getRequestDispatcher("/login.jsp").forward(request, response); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // this.doPost(request, response); }}
RegisterServlet使用了DAO對象和持久化對象,實現(xiàn)了注冊界面的后臺處理功能。package demo.Servlet;import demo.DAO.*;import demo.JavaBeans.User;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("/RegistServlet")public class RegistServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //讀取用戶輸入的用戶名和口令 String username = request.getParameter("username"); String password = request.getParameter("password"); //實例化user對象 User user = new User(); user.setUsername(username); user.setPassword(password); boolean flag=false; try { flag = new UserDAO().addUser(user);//把user寫入數(shù)據(jù)庫(usernmae,password) } catch (DAOException ex) { System.out.println(ex); } if(flag) { request.setAttribute("regist_success","注冊成功"); //請求轉發(fā)regist.jsp request.getRequestDispatcher("/regist.jsp").forward(request,response); }else{ request.setAttribute("regist_error","用戶名被占用,注冊失敗"); //請求轉發(fā)regist.jsp request.getRequestDispatcher("/regist.jsp").forward(request,response); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); }}
運行結果:關鍵詞:模式,實驗,報告