登錄共功能實現:
實現要求,用戶輸入賬號和密碼點擊登錄
1.輸入正確的賬號密碼跳轉到主頁面並顯示出登錄的賬號名稱。
2.輸入錯誤的賬號和密碼跳轉到登錄頁面去,並提示賬號和密碼錯誤。
login.jsp頁面代碼
<body> <%=request.getAttribute("errorMessage") == null ? "" : request.getAttribute("errorMessage")%> <form action="/MyFirstWebProjects/LoginServlet" method="post"> <table> <tr> <td>username</td> <td><input type="text" name="user" /></td> </tr> <tr> <td>password</td> <td><input type="password" name="pass" /></td> </tr> <tr> <td></td> <td><input type="submit" value="登錄" /></td> </tr> </table> </form> </body>
home.jsp頁面代碼
<body> 用戶名:<%=request.getAttribute("username") %> </body>
loginServlet.java代碼
@WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲取頁面form里面的參數 String user = request.getParameter("user"); String pass = request.getParameter("pass"); if(checkUserAndPass(user,pass)) { // 頁面傳參數 request.setAttribute("username", user); // 頁面跳轉 request.getRequestDispatcher("/html/home.jsp").forward(request,response); }else { // 頁面傳參數 request.setAttribute("errorMessage", "賬號或密碼錯誤"); // 頁面跳轉 request.getRequestDispatcher("/html/index.jsp").forward(request,response); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * 校驗賬號和密碼是否合法 * @param user * @param pass * @return */ private boolean checkUserAndPass(String user,String pass) { Connection conn = SqlConnection.getConnection(); try { PreparedStatement p = conn.prepareStatement("select count(*) from user where user=? and pass=?"); p.setString(1, user); p.setString(2, pass); ResultSet set = p.executeQuery(); set.next(); if(set.getInt(1) > 0) { return true; } } catch (SQLException e) { e.printStackTrace(); } return false; } }
知識點
get請求方式和post請求凡是的區別?
1.post請求主要是用來提交新的數據給服務器,get請求主要是用來獲取或者查詢某些數據。
2.POST用body傳輸數據,而GET用url傳輸,比POST更加容易暴露參數。但是從攻擊的角度,無論是GET還是POST都不夠安全,因為HTTP本身是明文協議。
3.post參數傳遞沒有限制,可以是二進制和ASCII。但是get只能是ASCII參數傳遞。
4.GET方式URL是受限制的,URL的最大長度位2048個字符,POST無限制
5.POST相對比GET安全,因為參數不會被保留在瀏覽器歷史或者服務器日志中
servlet中重定向和轉發理解
一句話,轉發是服務器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個動作的工作流程:
轉發過程:客戶瀏覽器發送http請求----》web服務器接受此請求--》調用內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
重定向過程:客戶瀏覽器發送http請求----》web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址----》服務器根據此請求尋找資源並發送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。
通俗理解
重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然后,你就從A退了出來,自己乘車去了B局。
轉發:你先去了A局,A局看了以后,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到后面辦公室聯系了B的人,讓他們辦好后,送了過來。
重定向和轉發語法
在servlet中重定向和轉發
response.sendRedirect("/html/home.jsp");
request.getRequestDispatcher("/html/home.jsp").forward(request,response);
在jsp頁面的重定向和轉發
<jsp:forward page="apage.jsp" />
<%response.sendRedirect("new.jsp");%>
重定向和轉發區別?
Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼里,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法。
對於Redirect方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request對象。
對於Forward方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給web容器由web容器響應該請求,兩個信息資源共享同一個request對象。
jsp獲取servlet的參數
servlet設置參數
request.setAttribute("username", user);
jsp獲取參數
<%=request.getAttribute("errorMessage") == null ? "" : request.getAttribute("errorMessage")%>