概述
1.什麼是JSP
JSP(全稱JavaServer Pages)是由Sun Microsystems公司主導創建的一種動態網頁技術標準。
JSP技術以Java語言作爲腳本語言,爲用戶的HTTP請求提供服務,並能與服務器上的其它Java程序共同處理複雜的業務需求。
JSP文件在運行時會被其編譯器轉換成更原始的Servlet代碼。
JSP就是在HTML頁面中嵌入了java代碼。
JSP本質上也是一個servlet
2.JSP的原理
服務器發現後綴爲.jsp,它會根據路徑找到helloworld.jsp文件,會將helloworld.jsp翻譯成helloworld_jsp.java文件,對這個java文件進行編譯,產生一個helloworld_jsp.class文件,將class文件加載運行。
將JSP翻譯成java文件,它是將JSP中的所有的HTML代碼通過流進行輸出,也就是說最終翻譯成class,被虛擬機加載,它本質是servlet,它就會往回響應,響應回去就是把JSP中的HTML代碼以流的方式寫回瀏覽器。所以在JSP中展示出了HTML代碼。
路徑:C:\Users\Administrator.IntelliJIdea2018.1\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp
3.JSP的內置方法
方法 | 概述 |
---|---|
_jspInit() { } | jsp Page被初始化的時候調用該方法,並且該方法僅在初始化時執行一次 |
_jspDestroy() { } | jsp Page由於某種原因被關閉的時候調用該方法 |
_jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) | 由jsp容器自動創建的處理jsp Page的方法 |
JSP的腳本內容
1.JSP的註釋(jsp註釋的內容不會出現在生成的servlet中)
<%--註釋內容--%>
注意:JSP的註釋,不會在客戶端顯示,HTML就會!
2.JSP的腳本片段(會生成_jspService方法中,寫java代碼片段需滿足java書寫規範,不要漏寫“;”)
<% %>
3.JSP表達式
<%= 變量或者表達式%>
作用:用來將程序的輸出,輸出到客戶端
4.JSP聲明(寫在類中,即寫在了_jspService方法外)
<%! %>
JSP指令
1.page指令
屬性:
pageEncoding屬性:設置jsp頁面的字符集
contentType:設置jsp的響應類型 (html或plain...)
import:導包
errorPage:當頁面執行代碼出現異常時,跳轉的頁面
session:表示當請求到本頁面時,是否爲其創建一個session對象(默認爲true)
案例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.text.*" %>
<%@ page errorPage="error.jsp" session="false" %>
<% int a = 1/0; %> 這裏一除0是會報錯的,結果會跳轉到error.jsp頁面
2.include指令
<%@include file=""%>
<%--@include會將兩個頁面合二爲一--%>
注意:兩個頁面中不要有相同的變量名,這樣的導入稱爲靜態導入
3.taglib指令
用於導入jsp標準標籤庫
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSP的九大內置對象
- pageContext- - - javax.servlet.jsp.PageContext 保存數據
- request - - - javax.servlet.http.HttpServletRequest 保存數據
- session - - - javax.servlet.http.HttpSession 保存數據
- application - - - javax.servlet.ServletContext 保存數據
- out - - - javax.servlet.jsp.JspWriter 用於瀏覽器輸出數據
- response - - - javax.servlet.http.HttpServletResponse 響應
- page - - - java.lang.Object 當前的servlet對象
- config - - - javax.servlet.ServletConfig 取得服務器的配置信息
- exception - - - java.lang.Throwable 顯示異常信息
四種保存數據對象的區別(作用域)
pageContext.setAttribute("name1","張三"); //保存的數據只在一個頁面中有效
request.setAttribute("name2","李四"); //保存的數據只在一次請求中有效,請求轉發會攜帶這個數據
session.setAttribute("name3","王麻子"); //保存的數據只在一次會話中有效,從打開瀏覽器到關閉瀏覽器
application.setAttribute("name4","天武"); //保存的數據只在服務器中有效,從打開服務器到關閉服務器
request:客戶端向服務器發送請求,產生的數據,用戶看完就沒用了,比如:新聞,用戶看完沒用的!
session:客戶端向服務器發送請求,產生的數據,用戶用完一會還有用,比如:購物車;
application:客戶端向服務器發送請求,產生的數據,一個用戶用完了,其他用戶還可能使用,比如:聊天數據;
JSP標籤
1.動態導入
<jsp:include page="/common/header.jsp"/>
注意:將兩個JSP編譯成兩個Java文件,實現調用,兩個JSP分開執行,變量不會衝突
2.請求轉發
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="age" value="12"></jsp:param> //參數傳遞
</jsp:forward>
1、若要進行參數傳遞,另一個jsp頁面獲取時需用request.getParameter(“key”)進行獲取
2、不傳參數時JSTL,兩個中間不能有空格,不然會報錯
JSTL標籤
- 核心標籤
- 格式化標籤
- SQL標籤
- XML 標籤
JSTL標籤庫的使用步驟
1.引入對應的 taglib
2.使用其中的方法
3.在Tomcat 也需要引入 jstl的包,否則會報錯:JSTL解析錯誤
實例:
1.c:if方法
<form action="coreif.jsp" method="get">
<%--
EL表達式獲取表單中的數據
${param.參數名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登錄">
</form>
<%--判斷如果提交的用戶名是管理員,則登錄成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理員歡迎您!"/>
</c:if>
<%--自閉合標籤--%>
<c:out value="${isAdmin}"/>
2.c:forEach
<%
ArrayList<String> people = new ArrayList<>();
people.add(0,"張三");
people.add(1,"李四");
people.add(2,"王五");
people.add(3,"趙六");
people.add(4,"田六");
request.setAttribute("list",people);
%>
<%--
var , 每一次遍歷出來的變量
items, 要遍歷的對象
begin, 哪裏開始
end, 到哪裏
step, 步長
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/> <br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
<c:out value="${people}"/> <br>
</c:forEach>
EL表達式
1.表達式
${ }
2.用途
- 獲取數據
- 執行運算
- 獲取web開發的常用對象