在前一篇文章中,我們簡單的介紹了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中的功能耦合性太高。因此這些技術在使用時,還需要多思考。
參考閱讀:
又到了分隔線以下,本文到此就結束了,本文內容全部都是由博主自己進行整理並結合自身的理解進行總結,如果有什麼錯誤,還請批評指正。
Java web這一專欄會是一個系列博客,喜歡的話可以持續關注,如果本文對你有所幫助,還請還請點贊、評論加關注。
有任何疑問,可以評論區留言。