劉意老師整理
JSP
概念:
- Java Server Pages: java服務器端頁面
- 可以理解爲:一個特殊的頁面,其中既可以指定定義html標籤,又可以定義java代碼
- 用於簡化書寫!!!
原理
- JSP本質上就是一個Servlet
JSP的腳本:JSP定義Java代碼的方式
- <% 代碼 %>:定義的java代碼,在service方法中。service方法中可以定義什麼,該腳本中就可以定義什麼。
- <%! 代碼 %>:定義的java代碼,在jsp轉換後的java類的成員位置。
- <%= 代碼 %>:定義的java代碼,會輸出到頁面上。輸出語句中可以定義什麼,該腳本中就可以定義什麼。
JSP的內置對象:
在jsp頁面中不需要獲取和創建,可以直接使用的對象
jsp一共有9個內置對象。
- request
- response
- out:字符輸出流對象。可以將數據輸出到頁面上。和response.getWriter()類似
- response.getWriter()和out.write()的區別:
- 在tomcat服務器真正給客戶端做出響應之前,會先找response緩衝區數據,再找out緩衝區數據。
- response.getWriter()數據輸出永遠在out.write()之前
指令
作用:用於配置JSP頁面,導入資源文件
格式:
<%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>
分類:
page :配置JSP頁面的
contentType:等同於response.setContentType()
- 設置響應體的mime類型以及字符集
- 設置當前jsp頁面的編碼(只能是高級的IDE才能生效,如果使用低級工具,則需要設置pageEncoding屬性設置當前頁面的字符集)
import:導包
errorPage:當前頁面發生異常後,會自動跳轉到指定的錯誤頁面
isErrorPage:標識當前也是是否是錯誤頁面。
- true:是,可以使用內置對象exception
- false:否。默認值。不可以使用內置對象exception
include:頁面包含的。導入頁面的資源文件
<%@include file="top.jsp"%>
taglib : 導入資源
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- prefix:前綴,自定義的
註釋:
- html註釋:<!-- --> 只能註釋html代碼片段
- jsp註釋:<%-- --%> 可以註釋所有(推薦使用)
內置對象
在jsp頁面中不需要創建,直接使用的對象一共有9個:
變量名 | 真實類型 | 作用 |
---|---|---|
pageContext | PageContext | 當前頁面共享數據,還可以獲取其他八個內置對象 |
request | HttpServletRequest | 一次請求訪問的多個資源(轉發) |
session | HttpSession | 一次會話的多個請求間 |
application | ServletContext | 所有用戶間共享數據 |
response | HttpServletResponse | 響應對象 |
page | Object | 當前頁面(Servlet)的對象 this |
out | JspWriter | 輸出對象,數據輸出到頁面上 |
config | ServletConfig | Servlet的配置對象 |
exception | Throwable | 異常對象 |
MVC:開發模式
jsp演變歷史
- 早期只有servlet,只能使用response輸出標籤數據,非常麻煩
- 後來又jsp,簡化了Servlet的開發,如果過度使用jsp,在jsp中即寫大量的java代碼,有寫html表,造成難於維護,難於分工協作
- 再後來,java的web開發,借鑑mvc開發模式,使得程序的設計更加合理性
MVC:
M:Model,模型。JavaBean
- 完成具體的業務操作,如:查詢數據庫,封裝對象
V:View,視圖。JSP
- 展示數據
C:Controller,控制器。Servlet
- 獲取用戶的輸入
- 調用模型
- 將數據交給視圖進行展示
優缺點:
優點:
- 耦合性低,方便維護,可以利於分工協作
- 重用性高
缺點:
- 使得項目架構變得複雜,對開發人員要求高
EL表達式
概念:Expression Language 表達式語言
作用:替換和簡化jsp頁面中java代碼的編寫
語法:
${表達式}
注意:
- jsp默認支持el表達式的。如果要忽略el表達式
- 設置jsp中page指令中:isELIgnored="true" 忽略當前jsp頁面中所有的el表達式
- \${表達式} :忽略當前這個el表達式
使用
運算:
運算符:
算數運算符:
+
-
*
/(div)
%(mod)
比較運算符:
>
<
>=
<=
==
!=
邏輯運算符:
&&(and)
||(or)
!(not)
空運算符: empty
- 功能:用於判斷字符串、集合、數組對象是否爲null或者長度是否爲0
- ${empty list}:判斷字符串、集合、數組對象是否爲null或者長度爲0
- ${not empty str}:表示判斷字符串、集合、數組對象是否不爲null 並且 長度>0
獲取值
el表達式只能從域對象中獲取值
語法:
${域名稱.鍵名}
從指定域中獲取指定鍵的值
域名稱:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
舉例:在request域中存儲了name=張三
獲取:${requestScope.name}
${鍵名}:表示依次從最小的域中查找是否有該鍵對應的值,直到找到爲止。
獲取對象、List集合、Map集合的值
對象:
${域名稱.鍵名.屬性名}
本質上會去調用對象的getter方法
List集合:
${域名稱.鍵名[索引]}
Map集合:
${域名稱.鍵名.key名稱}
${域名稱.鍵名["key名稱"]}
隱式對象:
el表達式中有11個隱式對象
- pageContext:獲取jsp其他八個內置對象
- ${pageContext.request.contextPath}:動態獲取虛擬目錄
JSTL
概念:JavaServer Pages Tag Library JSP標準標籤庫
- 是由Apache組織提供的開源的免費的jsp標籤<標籤>
作用:用於簡化和替換jsp頁面上的java代碼
使用步驟:
- 導入jstl相關jar包
- 引入標籤庫:taglib指令: <%@ taglib %>
- 使用標籤
常用的JSTL標籤
if:相當於java代碼的if語句
語法:
<c:if test=""></c:if>
屬性:
- test 必須屬性,接受boolean表達式
- 如果表達式爲true,則顯示if標籤體內容,如果爲false,則不顯示標籤體內容
- 一般情況下,test屬性值會結合el表達式一起使用
注意:
- c:if標籤沒有else情況,想要else情況,則可以在定義一個c:if標籤
choose:相當於java代碼的switch語句
語法:
<c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
</c:choose>
- 使用choose標籤聲明 相當於switch聲明
- 使用when標籤做判斷 相當於case
- 使用otherwise標籤做其他情況的聲明 相當於default
foreach:相當於java代碼的for語句
第一種語法:
<c:forEach begin="" end="" var="" step="" varStatus=""></c:forEach>
相當於for循環
for(int i = 0; i < 10; i ++){
}
屬性:
- begin:開始值
- end:結束值
- var:臨時變量
- step:步長
- varStatus:循環狀態對象
index:容器中元素的索引,從0開始
count:循環次數,從1開始
第二種語法:
<c:forEach items="" var="" varStatus=""></c:forEach>
相當於增強for循環
List<User> list;
for(User user : list){
}
屬性:
- items:容器對象
- var:容器中元素的臨時變量
- varStatus:循環狀態對象
index:容器中元素的索引,從0開始
count:循環次數,從1開始
需求:在request域中有一個存有User對象的List集合。需要使用jstl+el將list集合數據展示到jsp頁面的表格table中
<%@ page import="java.util.ArrayList" %>
<%@ page import="cn.ly.domain.User" %>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: LY
Date: 2020/4/26
Time: 14:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<User> list = new ArrayList<>();
list.add(new User("張三",20,new Date()));
list.add(new User("李四",21,new Date()));
list.add(new User("王五",22,new Date()));
request.setAttribute("list",list);
%>
<table border="1" align="center" width="500">
<tr>
<td>編號</td>
<td>姓名</td>
<td>年齡</td>
<td>生日</td>
</tr>
<c:forEach items="${list}" var="user" varStatus="s">
<tr bgcolor="red">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.biriStr}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
三層架構:軟件設計架構
- 界面層(表示層):用戶看的得界面。用戶可以通過界面上的組件和服務器進行交互
- 業務邏輯層:處理業務邏輯的。
- 數據訪問層:操作數據存儲文件。