測試開發系列之——mvc、jsp、jstl、el和會話跟蹤技術

學習目標

  1. MVC模式
  2. jsp
  3. jstl和el表達式
  4. 會話跟蹤技術

mvc模式

這種模式用於應用程序的解耦、分層開發

  • Model:一般用來處理數據,包括讀取和設置數據,一般指的是操作數據庫。
  • View:一般用來展示數據,也就是放數據,比如通過HTML來展示。
  • Controller:因爲一個模塊裏面可能由多個視圖——模型,控制器就起到了連接模型和視圖的功能。

軟件開發3層架構

什麼是jsp

  • 全稱java server page,主要爲了彌補servlet輸出頁面太過麻煩的缺點。
    servlet注重的是流程控制和事務處理
    jsp注重的是頁面展示
  • JSP將Java代碼和特定變動內容嵌入到靜態的頁面中,實現以靜態頁面爲模板,動態生成其中的部分內容

JSP運行基本過程

同步請求動態資源過程

JSP標準標籤庫(JSTL)

  • 需要standard.jar和jstl.jar(菜鳥)
  • 核心標籤庫是最常用的JSTL標籤。
  • 引用<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
  • <c:forEach> 基礎迭代標籤,接受多種集合類型
  • <c:if> 與我們在一般程序中用的if一樣

JSP EL隱含對象

JSP EL支持下表列出的隱含對象:

隱含對象 描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域

會話跟蹤技術session

  1. session是一門服務端會話緩存技術。
  2. session由服務端的web容器創建,保存在服務器端。
  3. session保存數據:鍵值對形式。
  4. session過期:默認30分鐘。

什麼是cookie

不超過4KB的小型文本文件,是某些網站爲了辨別用戶身份,進行Session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。

  1. cookie是一門客戶端緩存技術
  2. cookie數據由服務器生成,發送給瀏覽器保存
  3. cookie數據的格式:鍵值對
  4. cookie數據過期機制:內存Cookie瀏覽器關閉後就消失。硬盤Cookie保存在硬盤裏,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除

練習:登錄+js操作cookie

運行結果截圖

初始界面:
初始界面
輸入錯誤的用戶名和密碼:
輸入錯誤的用戶名和密碼
返回錯誤:
返回錯誤
輸入正確的用戶名和密碼:
輸入正確的用戶名和密碼
返回ok:
返回ok
Cookie已保存:
Cookie已保存
返回後用戶名仍緩存:
返回後用戶名仍緩存

工程截圖

工程截圖

User.java

package com.one.pojo;

import lombok.Data;

@Data
public class User {
  private int userId;
  private String userName;
  private String userPwd;
  public User(int userId, String userName, String userPwd){
    super();
    this.userId = userId;
    this.setUserName(userName);
    this.setUserPwd(userPwd);
  }
  public User(String userName, String userPwd){
    super();
    this.setUserName(userName);
    this.setUserPwd(userPwd);
  }
  public String getUserName() {
    return userName;
  }
  public void setUserName(String userName) {
    this.userName = userName;
  }
  public String getUserPwd() {
    return userPwd;
  }
  public void setUserPwd(String userPwd) {
    this.userPwd = userPwd;
  }
}

UserServlet.java代碼

package com.one.servlet;

import com.one.pojo.User;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet implementation class UserServlet
 */
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  List<User> list=null;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserServlet() {
      list = new ArrayList<>();
    list.add(new User(1,"zs","666"));
    list.add(new User(2,"lisi","888"));
    }

  /**
   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String action = request.getParameter("action");
    if("login".equals(action)){
      login(request, response);
    }else if("findAll".equals(action)){
      findAll(request, response);
    }
  }

  private void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //將list放入request值域中
    request.setAttribute("list", list);
    request.getRequestDispatcher("index.jsp").forward(request, response);
  }
  
  private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 接受請求並響應
    // 1.獲取請求參數並封裝爲對象
    String username = request.getParameter("username");
    String userpwd = request.getParameter("userpwd");
    // 2.數據驗證 非空 正則表達式
    // 3.登錄業務處理,得到登陸業務結果
    boolean b = false;
    for(User user : list){
      if(user.getUserName().equals(username)&&user.getUserPwd().equals(userpwd)){
        b = true;     
      }
    }
    // 4.根據結果進行跳轉
    if(b){
      //服務器內部轉發,同一請求,地址欄不會變化,登陸成功後,將用戶信息放入session值域
      request.getSession().setAttribute("user", new User(username, userpwd));
      //登錄成功,記住密碼,存放到cookie
      Cookie c = new Cookie("username",username);
      c.setMaxAge(1*24*60*60);//存放1天,以秒爲單位
      response.addCookie(c);
      //response.getWriter().append("{data:'ok',status:1}");
      /**
      PrintWriter out = response.getWriter();
      String str = "{\"data\":\"ok\",\"status\":\"1\"}";
      out.println(str);
      out.flush();
      **/
      PrintWriter pw = response.getWriter();
      String jsonStr = "{status:1, message:\"ok\"}";
      pw.print(jsonStr);
      
      //從一個控制成跳到另一個控制層方法
      //服務器內部轉發,同一請求,地址欄不會變化
      //request.getRequestDispatcher("userServlet?action=findAll").forward(request, response);
    }else{
      //重定向,二次請求,地址欄發生變化
      //response.getWriter().append("{data:'error',status:0}");
      PrintWriter out = response.getWriter();
      String str = "{\"data\":\"error\",\"status\":\"0\"}";
      out.println(str);
      out.flush();      
      //response.sendRedirect("login.jsp?msg=error");
    }
  }

  /**
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
  }
}

index.jsp代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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">
<title>Insert title here</title>
</head>
<body>
  <!-- 歡迎你,<%=request.getParameter("username") %> -->
  歡迎你,${sessionScope.user.userName}----${param.username}
  循環${requestScope.list}集合,取出每一個user 作業jsp ---jstl+el
  <c:forEach items="${requestScope.list}" var="user">
    ${user.userName}---${user.userPwd}
  </c:forEach>
</body>
</html>

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">
<title>Insert title here</title>
</head>
<body>
  ${param.msg}
  <form action="userServlet" method="get">
    <input name="username" value = "${cookie.username.value}"/><br/>
    <input name="action" value="login" type="hidden"/><br/>
    <input name="userpwd" type="password" value = "${cookie.userpwd.value}"/><br/>
    <input type="submit" value="登陸"/>
  </form>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章