目錄
學習目標
- MVC模式
- jsp
- jstl和el表達式
- 會話跟蹤技術
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
- session是一門服務端會話緩存技術。
- session由服務端的web容器創建,保存在服務器端。
- session保存數據:鍵值對形式。
- session過期:默認30分鐘。
什麼是cookie
不超過4KB的小型文本文件,是某些網站爲了辨別用戶身份,進行Session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。
- cookie是一門客戶端緩存技術
- cookie數據由服務器生成,發送給瀏覽器保存
- cookie數據的格式:鍵值對
- cookie數據過期機制:內存Cookie瀏覽器關閉後就消失。硬盤Cookie保存在硬盤裏,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除
練習:登錄+js操作cookie
運行結果截圖
初始界面:
輸入錯誤的用戶名和密碼:
返回錯誤:
輸入正確的用戶名和密碼:
返回ok:
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>