儘管JSP的本質是Java Servlet,但是它的表層依然有自己的一套成文語法。學習JSP的語法,更有利於開發出簡介、易維護(隨時變化的需求)的代碼!
目錄
JSP基礎語法
核心與概覽:
- JSP聲明: <%! 變量或方法 %> 聲明JSP的成員變量或成員方法
- JSP表達式:<%=變量或表達式%> 向瀏覽器輸出變量或表達式計算的結果
- JSP註釋: <%!-- JSP註釋 --%> 用於註釋JSP代碼,不會翻譯到java文件中,也不會執行。
- JSP腳本: <% java代碼 %> 執行java代碼 原理:翻譯到_JSPService()方法中
JSP變量或方法的申明
語法:<%! 定義:變量或方法或類 %>
作用:聲明JSP的變量或方法
JSP申明
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>KYLE</title>
</head>
<body>
<%-- 申明變量 --%>
<%!
String name = "kyle";
int age = 22;
double sa = 100000;
%>
<%-- 申明方法 --%>
<%!
public String getName() {
return name;
}
public double addSa(double add) {
return sa + add;
}
%>
<%-- 申明類 --%>
<%!
class Person {
private String pname;
private int page;
Person(String name, int age) { //構造
this.pname = name;
this.page = age;
}
public String getInfo() {
return "name: " + pname + ", age: " + age;
}
}
%>
</body>
</html>
JSP表達式
語法:<%=變量或表達式%>
作用:向瀏覽器輸出某變量的值或表達式計算的結果
注意:
- 表達式的原理就是翻譯成out.print(“變量”); 通過該方法可以把JSP中的HTML標籤寫到瀏覽器;
- 表達式後面不需要帶分號結束,不能有分號(;)。
快速理解JSP表達式的用法
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.util.Date"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>KYLE</title>
</head>
<body>
<%!
String name = "kyle";
int age = 22;
double sa = 100000;
%>
姓名:<%=name %><br/>
年齡:<%=age %><br/>
薪水:<%=sa %><br/>
當前時間:<%=new Date() %>
</body>
</html>
JSP表達式的本質
左邊是MyJSP代碼;右邊是經過Tomcat翻譯、編譯存於”Tomcat安裝目錄/work/Catalina/localhost/項目名/org/apache/JSP/MyJSP_JSP.java” 的JavaServlet代碼
JSP模版元素
JSP頁面中的HTML代碼就是JSP模版元素。
左邊是MyJSP.JSP代碼;右邊是經過Tomcat翻譯、編譯存於”Tomcat安裝目錄/work/Catalina/localhost/項目名/org/apache/JSP/MyJSP_JSP.java” 的JavaServlet代碼
JSP腳本片斷
定義:就是在JSP中寫Java代碼!
語法:<%java代碼 %>
作用:執行java代碼
注意:原理是把腳本中java代碼原封不動拷貝到_JSPService方法中執行。
快速理解JSP腳本片段
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.util.Random"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>KYLE</title>
</head>
<body>
<!-- 腳本片段:可以寫Java代碼 -->
<%
Random rand = new Random();
int num = rand.nextInt(100);
if(num>50) {
%>
牛逼!大於50!
<%
} else {
%>
垃圾!小於50!
<%
}
%>
</body>
</html>
JSP三大指令
指令格式:<%@ 指令名字 鍵=“值” %>
功能:表名這是一個JSP文件。
page指令
語法格式:<%@ page 鍵=“值” %>
鍵有以下選項:
language:表明jsp頁面中可以寫什麼編程語言的代碼,目前只能寫java代碼;
contentType、charset:指明這個文件是什麼類型,說明服務器發送瀏覽器的數據類型和內容編碼
- 如果要從JSP輸出爲XML,請使用以下page指令:<%@ page contentType = "text/xml" %>
- 以下語句指示向瀏覽器生成的頁面呈現爲HTML:<%@ page contentType = "text/html" %>
- 以下指令將內容類型設置爲:Microsoft Word文檔:<%@ page contentType = "application/msword" %>
- 還可以指定響應的字符編碼。 例如,如果要指定返回瀏覽器的結果頁面使用:UTF-8,則可以使用以下page指令:<%@ page contentType = "text/html:charset=UTF-8" %>
pageEncoding:指定jsp內容編碼
extends:用於指定jsp翻譯成java文件後,繼承的父類是誰,一般不用改。
import:導包使用的,如果導入多個包,多個包之間用逗號分割
JSP引擎自動導入的包:
- java.lang.*
- javax.servlet.*
- javax.servlet.JSP.*
- javax.servlet.http.*
session
- 值可選的有true or false。
- 用於控制在這個jsp頁面裏面,能夠直接使用session對象。
- 具體的區別是,請看翻譯後的java文件。如果該值是true , 那麼在代碼裏面會有getSession()的調用,如果是false : 那麼就不會有該方法調用,也就是沒有session對象了。在頁面上自然也就不能使用session了。
errorPage:指的是錯誤的頁面, 值需要給錯誤的頁面路徑URL
isErrorPage:上面的errorPage 用於指定錯誤的時候跑到哪一個頁面去。那麼這個isErroPage , 就是聲明某一個頁面到底是不是錯誤的頁面。
buffer:指定out對象輸出緩衝區的大小
include指令
指令語法:<%@ include file=”靜態包含JSP文件的URL” %>
指令功能:
包含另外一個jsp的內容進來。
本質:
- 原理是把被包含的頁面(header.jsp)的內容翻譯到包含頁面(index.jsp)中,即把被包含的頁面代碼複製到包含頁面中, 合併成翻譯成一個Java源文件,再編譯運行!!這種包含叫靜態包含(源碼包含)
- 如果使用靜態包含,被包含頁面中不需要出現全局的html標籤了!!!(如html、head、body)
- 如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之爲靜態引入。
- 其中的file屬性用於指定被引入文件的相對路徑。file屬性的設置值必須使用相對路徑,如果以“/”開頭,表示相對於當前WEB應用程序的根目錄(注意不是站點根目錄),否則,表示相對於當前文件。
特性:
- 被引入的文件必須遵循JSP語法。
- 被引入的文件可以使用任意的擴展名,即使其擴展名是html,JSP引擎也會按照處理JSP頁面的方式處理它裏面的內容,爲了見明知意,JSP規範建議使用.JSPf(JSP fragments)作爲靜態引入文件的擴展名。
- 由於使用include指令將會涉及到2個JSP頁面,並會把2個JSP翻譯成一個servlet,所以這2個JSP頁面的指令不能衝突(除了pageEncoding和導包除外)。
實例:在mainbody.jsp中引入head.jsp和footer.jsp
mainbody.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>KYLE</title>
</head>
<body>
<%@include file="head.jsp" %>
<br/>
<div style="text-align:center">
我是mainbody.jsp
</div>
<br/>
<%@include file="footer.jsp" %>
</body>
</html>
head.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<div style="text-align:center">
我是head.jsp,引入成功!
</div>
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<div style="text-align:center">
我是footer.jsp,引入成功!
</div>
taglib指令
指令功能:
用來在當前jsp頁面中導入第三方的標籤庫
指令格式:
<%@ taglib prefix="標籤庫的別名" uri="標籤庫路徑"%>
解析:
- prefix:指定標籤前綴,這個東西可以隨意起名
- uri:指定第三方標籤庫的uri(唯一標識)
- 當然,需要先把第三方標籤庫所需jar包放到類路徑中。
有關該指令的詳細用法,要等待學習JSTL時再做講解!
JSP動作標籤
jsp:include標籤
功能:
- 包含指定的頁面, 這裏是動態包含。
- 也就是不把包含的頁面所有元素標籤全部拿過來輸出,而是把它的運行結果拿過來。
語法:<jsp:include page="other02.jsp"></jsp:include>
- 指令@include(靜態包含):
- 在編譯時期就包含進來,合併成一個Servlet,並編譯好
- 因爲預先包含入了,併合並編譯好了,所以速度較快
- 動態jsp:include(動態包含):
- 在頁面被訪問是才包含進來
- 因爲在訪問時才包含入,所以速度較慢
jsp:forward標籤
功能:前往一個頁面
語法:<jsp:forward page="other02.jsp"></jsp:forward>
等同於以下代碼:
request.getRequestDispatcher("other02.jsp").forward(request, response); //Servlet請求轉發
jsp:parm標籤
功能:在包含某個頁面的時候,或者在跳轉某個頁面的時候,加入這個參數。
語法:
<jsp:forward page="other02.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
重定向接收頁面代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<br>收到的參數是:<br>
<%= request.getParameter("address")%>
</body>
</html>