JSP基本語法、指令、動作元素詳解

在前一篇文章中,我們簡單的介紹了JSP的概念和運行原理,今天就一起學習下JSP的用法。對於JSP中的HTML、CSS、JavaScript等前端知識,我們在前面就已經講過了,這裏就不在贅述了,我們主要講解JSP相比於HTML文件多出來的功能。

1.JSP腳本元素(Java)

​在JSP文件中可以插入Java代碼,這些代碼的編寫需要遵循一定的語法規範。JSP腳本元素主要有如下三種類型:

  • JSP Scriptlets:Java 代碼塊,形如<% java代碼(變量、方法、表達式等 ) %>,需要注意的是,這裏聲明的變量是局部變量;
  • JSP聲明語句:形如<%! 定義的變量或方法等 %>,這裏聲明的變量和方法都是全局的,即對整個JSP頁面有效;並且單個聲明中的Java語句可以是不完整的,但是多個聲明組合後的結果必須是完整的Java語句;
  • JSP表達式:形如<%= expression %>,用於將程序數據輸出到客戶端。

​下面我們通過一個例子來簡單的講解下三種腳本元素的使用,代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Java 腳本元素示例</title>
</head>
<%-- JSP註釋,定義兩個成員變量 --%>
<%! int a=1,b=2; %>
<!-- HTML註釋,定義一個成員方法 -->
<%! 
	public String sayHello(String name){
		return "Hello," + name;
	}
%>
<body>
	<% 
		out.println("a變量的值:" + a + "<br />");
		out.println("b變量的值:" + b + "<br />");
  		//調用sayHello方法
		out.println(sayHello("lizishu"));
	%>
	<h1>a+b=<%= a+b %></h1>
</body>
</html>

​頁面運行結果如下圖所示,我們可以看到,返回給瀏覽器的頁面結果,在JSP聲明語句中定義的變量和方法,在整個JSP頁面中都可使用。對於JSP中的註釋有兩種,分別爲<!-- Html註釋 -->、<%-- JSP註釋 --%>,我們通過下圖也可以看到,對於JSP註釋,不會輸出客戶端。

資源分配圖

2.JSP指令

​爲了設置JSP頁面中的一些信息,Sun公司提供了JSP指令。JSP指令目前來講有三種,分別爲page、include、taglib。

2.1 page指令

​page指令就如字面的含義,主要用於描述和頁面相關的信息。page指令一般位於JSP頁面的開頭部分,一個JSP頁面可以有多個page指令,但是在所有page指令中,除了import屬性,每一種屬性卻只能出現一次,否則會編譯失敗。

​page指令的具體語法格式如下:

<%@ page 屬性名1="屬性值1" 屬性名2="屬性值2" ... %>

​其中的屬性如下表所示:

資源分配圖

​下面我們通過一個例子來看下page指令的用法,這裏的UserService可以參考前面的文章

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*,com.zzxy.web.service.UserService" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 指令示例</title>
</head>
<body>
	<% 
  		//獲取UserService的示例
		UserService service = UserService.getInstance();
  		//調用service中的傳方法
		out.println(service.testSelectUserById(1) + "<br />");
	%>
</body>
</html>

2.2 include指令

​當我們開發一個網站時,許多頁面之間是有許多相同之處的,比如菜單欄、底部的footer(實在找不到中文對應的名詞),這部分代碼其實每個頁面上都是相同的,如果我們在每頁面上都來上這麼一段代碼,那麼我們的項目不僅會出現許多重複的代碼,當你想修改菜單時,也會變得非常複雜,每個頁面都要進行修改。

​那咋整?沒關係,我們有include指令。include指令可以將指定的文件和當前的JSP文件融合在一起,並且一起轉換成一個Servlet。不過需要注意的是,兩個文件都需要符合JSP的語法規則,例如兩個文件不能定義相同的全局變量。這裏需要注意的是,include指令的這種包含方式屬於靜態的,也就上面講的,在轉換成servlet時就將頁面包含進來了。

​include指令的具體語法格式如下:

<%@ include file="指定文件所在位置" %>

​include執行相比於page指令,簡單的多,其只有一個file屬性,用與執行包含到JSP頁面中的文件位置。

​下面我們通過一個例子來看下include指令的用法,這裏我們創建menu.jsp、include.jsp頁面,其代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>菜單頁面</title>
</head>
<body>
  	<!-- 這個菜單頁面見笑了😝 -->
	<h1>這是菜單頁面中的標題1</h1>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>include 指令示例</title>
</head>
<body>
	<%@page include file="./menu.jsp" %>
  <h
</body>
</html>

​我們在Chrome中運行include.jsp,其結果如下:

資源分配圖

2.3 taglib指令

​taglib指令用於指定JSP頁面所使用的標籤庫,通過該指令可以在JSP頁面中使用標籤庫中的標籤。

​taglib指令的具體語法格式如下:

<%@ taglib uri="標籤庫URI" prefix="標籤前綴" %>

​其中的uri屬性指定標籤庫位置的uri,可以是相對路徑或者是絕對路徑;prefix屬性指定使用此標籤庫的前綴。

​下面我們通過一個例子來看下taglib指令的用法,我們使用jstl核心標籤庫,頁面代碼如下:

<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:out value="你好,歡迎使用taglib指令" />
</body>
</html>

​這裏要使用jstl標籤庫,需要在項目中添加兩個jar包,下載地址

3.JSP動作元素

​JSP動作元素是用來控制JSP的行爲,執行一些常用的JSP頁面動作。

3.1 <jsp:include>

<jsp:include>用於在頁面運行時引入一個靜態或動態的頁面,也稱爲動態包含。此處和include指令的區別,就是當容器把JSP頁面轉換成Java文件時,並不會把JSP頁面中動作指令include指定的文件與原JSP頁面合併成一個新頁面,而是在JSP運行時纔會將這個文件的輸出結果包含進來。其語法格式如下:

<jsp:include page="relativeURL" flush="true|false" %>

​其中的page屬性指定被包含資源的相對路徑;flush屬性用與指定是否將當前頁面的輸出內容刷新到客戶端,默認值爲false。

<jsp:include>的使用沒什麼好講的,可以參考include指令的使用,但是兩者之間還是存在着區別的,主要如下:

  • <jsp:include>引入的資源和當前JSP頁面是兩個彼此獨立的執行實體;而include指令只能引入遵循JSP格式的文件,兩個文件合併到一起同樣需要遵守JSP語法。舉個例子,<jsp:include>如果引入的是JSP頁面,兩個頁面可以定義相同的全局變量、方法。
  • <jsp:include>引入的資源在運行時纔會包含,而且包含的僅是運行結果(如JSP頁面的輸出結果);include指令元素是在編譯時期就引入所包含的文件,包含的是源碼;
  • <jsp:include>標籤原理類似於請求包含,包含的頁面無法改變響應狀態碼和設置響應頭;include指令沒有這方便的限制。

<jsp:include>與include指令能實現相同的功能,具體如何使用,還要開發人員自行選擇。

3.2 <jsp:forward>

<jsp:forward>動作元素將當前請求轉發到其他的web資源(HTML頁面、JSP頁面、Servlet等),功能類似如請求轉發。其語法格式如下:

<jsp:forward page="relativeURL" %>

​下面我們通過一個例子來看下<jsp:forward>的使用,頁面代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forward 動作元素示例</title>
</head>
<body>
	<jsp:forward page="menu.jsp">
  	<h1>這是當前頁面的H1</h1>
</body>
</html>

​其中的menu.jsp是在include指令的例子中創建的。頁面運行結果如下:

資源分配圖

4.小結

​本文簡單的講解了JSP中的基本語法、指令和動作元素,其實動作元素現在不是很推薦使用,在MVC架構中,JSP更多的是承擔一個視圖層的功能,重定向等邏輯控制,page指令import Java代碼都讓JSP中的功能耦合性太高。因此這些技術在使用時,還需要多思考。

參考閱讀:

  1. JSP概述與運行原理
  2. 請求重定向、請求轉發、請求包含的特點與區別詳解
  3. 聊一聊耳熟能詳的MVC設計模式與三層架構

​又到了分隔線以下,本文到此就結束了,本文內容全部都是由博主自己進行整理並結合自身的理解進行總結,如果有什麼錯誤,還請批評指正。

​Java web這一專欄會是一個系列博客,喜歡的話可以持續關注,如果本文對你有所幫助,還請還請點贊、評論加關注。

​有任何疑問,可以評論區留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章