tomcat的work目錄: tomcat服務器存放jsp運行時的臨時文件php
Jsp的執行過程html
tomcat掃描到jsp文件,在%tomcat%/work把jsp文件翻譯成java源文件java
tomcat服務器把java源文件編譯成class字節碼文件 web
tomcat服務器構造_01_hello_jsp類對象sql
爲何Jsp就是servletapache
extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent瀏覽器
HttpJspBase類 就是集成servlet緩存
Jsp的生命週期tomcat
1)翻譯: jsp->java文件服務器
2)編譯: java文件->class文件(servlet程序)
3)構造方法(第1次訪問)
4)init方法(第1次訪問):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
語法: <%!-- jsp註釋 --%>
html的註釋會被翻譯和執行。而jsp的註釋不能被翻譯和執行。
指令:
include指令
做用: 在當前頁面用於包含其餘頁面
語法: <%@include file="common/header.jsp"%>
原理是把被包含的頁面(header.jsp)的內容翻譯到包含頁面(index.jsp)中,合併成翻譯成一 個java源文件,再編譯運行!!,這種包含叫靜態包含(源碼包含)
若是使用靜態包含,被包含頁面中不須要出現全局的html標籤了(如html、head、 body)
page指令
做用: 告訴tomcat服務器如何翻譯jsp文件
import="java.util.*" --告訴服務器java文件使用什麼包導入包,多個包之間用逗號分割
pageEncoding="utf-8" --告訴服務器使用什麼編碼翻譯jsp文件
contentType="text/html; charset=utf-8" 服務器發送瀏覽器的數據類型和內容編碼
errorPage="error.jsp"
isErrorPage="false"
buffer="8kb"
session="true"
isELIgnored="false"
taglib指令
配置全局的錯誤處理頁面
<!-- 全局錯誤處理頁面配置 --> <error-page> <error-code>500</error-code> <location>/common/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/common/404.html</location> </error-page>
9大內置對象
內置對象名 類型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
Out對象:out對象類型,JspWriter類,至關於帶緩存的PrintWriter
當知足如下條件之一,緩衝區內容寫出:
1)緩衝區滿了
2)刷新緩存區
3)關閉緩存區
4)執行完畢jsp頁面
pageContext對象
pageContext對象的類型是PageContext,叫jsp的上下文對象 能夠獲取其餘八個內置對象
使用場景: 在自定義標籤的時候,PageContext對象頻繁使用到
自己是一個域對象
保存數據:
默認狀況下,保存到page域 pageContext.setAttribute("name");
能夠向四個域對象保存數據 pageContext.setAttribute("name",域範圍常量)
讀取數據
pageContext.getAttribute("name")
pageContext.getAttribute("name",域範圍常量)
PageContext.PAGE_SCOPE ...
自動在四個域中搜索數據
pageContext.findAttribute("name");
順序: page域 -> request域 -> session域- > context域(application域)
Jsp中的四個域對象
pageContext page域 只能在當前jsp頁面中使用(當前頁面)
request request域 只能在同一個請求中使用(轉發)
session session域 只能在同一個會話(session對象)中使用(私有的)
application context域 只能在同一個web應用中使用。(全局的)
使用EL表達式替換掉jsp表達式
EL做用:向瀏覽器輸出域對象中的變量值或表達式計算的結果
語法: ${變量或表達式}
輸出基本數據類型變量
${name} 從四個域獲取 域範圍: pageScoep / requestScope / sessionScope / applicationScope
${pageScope.name} 指定域獲取
jsp標籤
標籤的做用:替換jsp腳本
流程判斷(if for循環) 跳轉頁面(轉發,重定向)
Jsp標籤分類
內置標籤(動做標籤): 不須要在jsp頁面導入標籤
jstl標籤: 須要在jsp頁面中導入標籤
自定義標籤 : 開發者自行定義,須要在jsp頁面導入標籤
動做標籤
轉發標籤: <jsp:forward />
參數標籤: <jsp:pararm/>
包含標籤: <jsp:include/>
原理: 包含與被包含的頁面先各自翻譯成java源文件,而後再運行時合併在一塊兒。
(先翻譯再合併),動態包含
靜態包含和動態包含的區別
1) 語法不一樣
靜態包含語法: <%@inclue file="被包含的頁面"%>
動態包含語法: <jsp:include page="被包含的頁面">
2)參數傳遞不一樣
靜態包含不能向被包含頁面傳遞參數
動態包含能夠向被包含頁面傳遞參數
3)原理不一樣
靜態包含: 先合併再翻譯
動態包含: 先翻譯再合併
JSTL標籤: java標準標籤庫
核心標籤庫 (c標籤庫) 重點
國際化標籤(fmt標籤庫)
EL函數庫(fn函數庫)
xml標籤庫(x標籤庫)
sql標籤庫(sql標籤庫)
使用步驟:
導入jstl支持的jar包(標籤背後隱藏的java代碼)
使用taglib指令導入標籤庫 <%@taglib uri="tld文件的uri名稱" prefix="簡寫" %>
核心標籤庫的重點標籤:
保存數據:<c:set></c:set>
獲取數據:<c:out value=""></c:out>
單條件判斷:<c:if test=""></c:if>
多條件判斷:
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循環數據
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向
<c:redirect></c:redirect>
<%--set標籤 :保存數據(保存到域中)默認保存到page域 --%> <c:set var="name" value="rose" scope="request"></c:set> <%--out標籤: 獲取數據(從域中) default: 當value值爲null時,使用默認值 escapeXml: 是否對value值進行轉義,false,不轉義,true,轉義(默認) --%> <c:out value="${msg}" default="<h3>標題3</h3>" escapeXml="true"></c:out> <hr/> <%--if標籤 :單條件判斷--%> <c:if test="${!empty msg}"> 條件成立 </c:if> <hr/> <%--choose標籤+when標籤+otherwirse標籤: 多條件判斷 --%> <c:set var="score" value="56"></c:set> <c:choose> <c:when test="${score>=90 && score<=100}"> 優秀 </c:when> <c:when test="${score>=80 && score<90}"> 良好 </c:when> <c:when test="${score>=70 && score<80}"> 通常 </c:when> <c:when test="${score>=60 && score<70}"> 及格 </c:when> <c:otherwise> 不及格 </c:otherwise> </c:choose> <%-- forEach標籤:循環 --%> <% //List List<Student> list = new ArrayList<Student>(); list.add(new Student("rose",18)); list.add(new Student("jack",28)); list.add(new Student("lucy",38)); //放入域中 pageContext.setAttribute("list",list); //Map Map<String,Student> map = new HashMap<String,Student>(); map.put("100",new Student("mark",20)); map.put("101",new Student("maxwell",30)); map.put("102",new Student("narci",40)); //放入域中 pageContext.setAttribute("map",map); %> <hr/> <%-- begin="" : 從哪一個元素開始遍歷,從0開始.默認從0開始 end="": 到哪一個元素結束。默認到最後一個元素 step="" : 步長 (每次加幾) ,默認1 items="": 須要遍歷的數據(集合) var="": 每一個元素的名稱 varStatus="": 當前正在遍歷元素的狀態對象。(count屬性:當前位置,從1開始) --%> <c:forEach items="${list}" var="student" varStatus="varSta"> 序號:${varSta.count} - 姓名:${student.name } - 年齡:${student.age}<br/> </c:forEach> <hr/> <c:forEach items="${map}" var="entry"> ${entry.key } - 姓名: ${entry.value.name } - 年齡:${entry.value.age }<br/> </c:forEach> <hr/> <%-- forToken標籤: 循環特殊字符串 --%> <% String str = "java-php-net-平面"; pageContext.setAttribute("str",str); %> <c:forTokens items="${str}" delims="-" var="s"> ${s }<br/> </c:forTokens> <%--redrict:重定向 --%> <c:redirect url="http://www.baidu.com"></c:redirect>
JavaBean
這個Java類必須具備一個無參的構造函數 屬性必須私有化。
私有化的屬性必須經過public類型的方法暴露給其它程序,而且方法的命名也必須遵照必定的命名規範。