一、jsp概述
JSP是java server page的縮寫,其本質是一個簡化的servlet,是一種動態網頁技術標准。jsp頁面是在HTML頁面中嵌入java程序段。使用jsp開發的應用程序能夠跨平台。
二、jsp基本的語法
2.1 jsp表達式
jsp表達式用於向頁面輸出信息。語法格式例如以下:
<%= 表達式 %>
如:<%= 5+6 %>
<%與=之間不能有空格,=與后面的表達式之間能夠有空格。
2.2 jsp聲明標識
聲明標識用語在jsp頁面中定義全局的變量或者方法,通過聲明標識定義的變量和方法能夠被整個jsp頁面訪問。語法格式例如以下:
<%!聲明變量或者方法的代碼%>
如<%!String str = "test";%>
<%與!之間不能有空格,!與其后面的代碼之間能夠有空格。
2.3 jsp代碼段
代碼片段就是嵌在jsp頁面中的java代碼或腳本代碼。會在頁面請求的處理期間被運行,java代碼能夠實現定義變量、流程控制等功能。腳本代碼能夠通過使用jsp內置對象在jsp頁面輸出內容、處理請求和響應、訪問session等,代碼片段的語法格式例如以下:
<% java代碼或者腳本代碼 %>
2.4 jsp凝視
2.4.1 HTML凝視
HTML凝視格式:
<!-- html凝視-->
html凝視不會顯示在網頁中。在瀏覽器中查看源代碼的時候能夠看到凝視信息。
2.4.2 代碼片段凝視
由於代碼片段即為java代碼或者腳本代碼,代碼片段的凝視和java語法一樣。單行凝視寫在//之后,多行凝視寫在/* */ 之間,文檔提示凝視寫在/**
與 */
之間。
//單行凝視
/* 多行凝視第一行 多行凝視第二行 */
/** 文檔凝視 */
2.4.3 隱藏凝視
html凝視在查看網頁源代碼的時候能夠看到,所以嚴格來說這樣的凝視並不安全,jsp提供的隱藏凝視在瀏覽器和查看源代碼的時候都看不到。安全性更高。
隱藏凝視寫在<%–與%>之間:
<%--jsp注隱藏釋 --%>
2.4.4 動態凝視
在html凝視中嵌入jsp代碼片段能夠構成動態的html凝視文本。
演示樣例:
<!-- tody is <%=new Date()%>.動態凝視 -->
演示樣例代碼
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*,java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello world</title>
</head>
<body>
<h1>jsp基本的語法</h1>
<!-- html凝視-->
<!-- tody is <%=new Date()%>.動態凝視 -->
<%--jsp注隱藏釋 --%>
<%!String str = "test"; //jsp聲明%>
<% /** 文檔凝視 */ //單行凝視 /* 多行凝視1 多行凝視2 */ String hello = "hello world"; out.println(hello + "<br>"); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { out.println(i + "*" + j + "=" + j * i + " "); } out.println("</br>"); } out.println(str); %>
</body>
</html>
瀏覽器訪問:
三、jsp的3個編譯指令
jsp編譯指令是通知jsp引擎的消息,它不直接生成輸出,編譯指令有默認值。常見的編譯指令有3個:
- page指令:該指令是針對當前頁面的指令。
- include指令:用於指定包括還有一個頁面。
- taglib指令:用於定義和訪問自己定義標簽。
編譯指令的語法格式例如以下:
<%@ 編譯指令名 屬性名1="屬性值" 屬性名2="屬性值" ... %>
3.1 page指令
pag指令經常使用屬性
屬性 | 定義 |
---|---|
language =“語言” | 主要指定JSP 容器 要用什么語言來編譯JSP頁。JSP 1.2 規范中指出,眼下僅僅能夠使用Java 語言。只是未來不排除添加其他語言。如C、C++、Perl 等等。默認值為Java語言 |
extends = “基類名” | 主要定義此JSP 網頁產生的Servlet 是繼承哪個父類 |
import= “包名” | 定義此JSP 網頁能夠使用哪些Java類庫 |
session=”true或false” | 決定此JSP 網頁能否夠使用session 對象。 默認值為true |
buffer=”none或size in kb” | 決定輸出流(output stream) 是否有緩沖區。默認值為8KB 的緩沖區 |
autoFlush=”true 或false” | 決定輸出流的緩沖區是否要自己主動清除,緩沖區滿了會產生異常(Exception)。默認值為true |
isThreadSafe=”true 或 false” | 告訴JSP 容器,此JSP 網頁能否同一時候處理多個請求。默認值為true。假設此值設為false。 轉義生成的Servlet會實現SingleThreadModel接口。 |
info =”text” | 表示此JSP 網頁的相關信息 |
errorPage=”error_url” | 表示假設發生異常錯誤時。網頁會被又一次指向指定的URL |
isErrorPage=”true或false” | 表示此JSP Page 是否為專門處理錯誤和異常的網頁 |
contentType = “ctinfo” | 表示MIME 類型和JSP 網頁的編碼方式,其作用相當於HttpServletResponse接口的setContentType()方法 |
3.2 include指令
include指令能夠將一個外部文件嵌入到當前jsp文件里,同一時候解析這個頁面中的jsp語句。include命令既能夠包括jsp頁面也能夠包括靜態文本。編譯指令語法例如以下:
<%@ include file="要導入的jsp頁面或文本文件" %>
如:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include</title>
</head>
<body>
<%@ include file="header.jsp"%>
<%@ include file="text.txt"%>
<%@ include file="footer.jsp"%>
</body>
</html>
使用include指令注意事項:
1.file名不能為依變量。以下的樣例是錯誤的:
<%! String url="header.jsp" %>
<%@ include="<%=url %>"
2.file名后面不能傳入參數。以下的樣例是錯誤的:
<%@ include file="header.jsp?username=abc" %>
3.file的路徑是相對於此jsp的路徑。
3.3 taglib指令
taglib指令用於引入一些特定的標簽庫,語法格式:
<%@ taglib prefix="tagPrefix" uri="tagLibraryURI" %>
如使用struts標簽庫:
<%@ taglib prefix="s" taglib="/struts-tags" %>
prefix=”tagPrefix “用於定制標記的前綴,jsp, jspx, java, javax, servlet, sun, 和sunw已被sun公司保留。uri=”tagLibraryURI”統一資源標記庫,制定一個特定的標記庫,能夠是相對路徑,也能夠是絕對路徑。
四、jsp的7個動作指令
4.1forward指令
forward指令用於將頁面轉發到另外的頁面,能夠是html頁面、jsp頁面、容器中的servlet.
語法例如以下:
<jsp:forward page="目標頁面地址"></jsp:forward>
假設轉發的時候須要傳遞參數能夠使用<jsp:param></jsp:param>
指令進行設置。
比方,訪問index.jsp頁面時自己主動轉發至login.jsp,須要把username和password傳遞過去:
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<jsp:forward page="login.jsp">
<jsp:param value="yaopan" name="username" />
<jsp:param value="123456" name="password" />
</jsp:forward>
<%--mac上按住comment鍵(windows下按住ctrl鍵),再點擊login.jsp forword以下的代碼不會被運行 --%>
站點主頁
在login.jsp中能夠使用getParameter方法獲取傳入的參數值:
<%
String name=request.getParameter("username");
String pwd=request.getParameter("password");
out.println(name);
out.println("<br>");
out.println(pwd);
%>
運行forword指令時用戶請求的地址沒有發生變化。頁面內容被forward目標替代。
4.2 include指令
include指令用於包括某個頁面。但不會導入被include頁面的編譯指令。能夠通過param指令傳遞參數:
新建一個index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<jsp:include page="head.html"></jsp:include>
<jsp:include page="body.jsp">
<jsp:param value="#1d99f6" name="bgcolor"/>
</jsp:include>
</html>
body.jsp
<body bgcolor="<%=request.getParameter("bgcolor")%>">
</body>
4.3useBean、setProperty、getProperty指令
這三個指令與javaBean相關,useBean用於在jsp頁面中初始化一個Java實例;setProperty為javaBean實例的屬性賦值;getProperty屬性用於輸出javaBean實例的屬性。
假設jsp頁面中須要反復使用某段代碼,能夠把這段代碼定義成java方法,然后多個jsp頁面調用該方法達到頁面復用的效果。
useBean的語法格式例如以下:
<jsp:useBean id="beanID" class="java包名.類名" scope="page|request|session|application"></jsp:useBean>
如:在ucas.ac.cn.jspstudy包下創建一個Student類,有name、age、stuId三個屬性和對應的setter和getter方法。在jsp頁面中創建javaBean實例:
<%--創建Student對象,對象名為stu1 --%>
<jsp:useBean id="stu1" class="ucas.ac.cn.jspstudy.Student" scope="page"></jsp:useBean>
setProperty方法用於為javaBean實例的屬性賦值:
<%--給stu1的name屬性賦值 --%>
<jsp:setProperty property="name" name="stu1" value="張三"/>
<%--給stu1的age屬性賦值 --%>
<jsp:setProperty property="age" name="stu1" value="20"/>
getProperty用於輸出javaBean實例的屬性值:
<%--輸出stu1的name值 --%>
<jsp:getProperty property="name" name="stu1"/>
<%--輸出stu1的age值 --%>
<jsp:getProperty property="age" name="stu1"/>
4.4plugin指令
plugin主要用於下載server端的javaBean或applet到client運行。如今非常少使用。
4.5param指令
param指令用於設置參數值,該指令本身不能單獨使用,單獨的param指令沒有意義,配合以下三個指令使用:
- jsp:include
- jsp:forward
- jsp:plugin
五、jsp腳本中的9個內置對象
5.1 application對象
jsp、servlet之間不能相互調用。為了解決jsp和servlet之間數據交換的問題,webserver提供了四個對象,各自是application、session、request、page。
放入application對象中的數據對整個Web應用有效,一旦jsp、servlet將數據放入application對象之中,該數據能夠被該應用下其他jsp、servlet訪問。
5.2 config對象
config對象代表當前jsp配置信息,但jsp頁面通常無需配置,該對象在jsp頁面中較少使用。在servlet中使用較多。
5.3 exception對象
exception對象是Throwable的實例。代表jsp腳本中產生的錯誤和異常,是jsp頁面異常機制的一部分。把page指令的isErrowPage屬性設置為true時能夠訪問exception內置對象。
5.4 out對象
out對象是javax.servlet.jsp.JspWriter的實例,代表jsp的輸出流,永於輸出內容形成html頁面。
out對象一些方法:
- out.println():輸出完畢后會換行,換行效果在頁面中不顯示僅僅在源代碼中顯示
- out.print():輸出后不換行
- out.getBufferSize() :輸出緩沖區大小
- out.getRemaining() :輸出剩余緩沖區大小
- out.clear():清空緩沖區,不將數據發送至client
- out.clearBuffer():將數據發送至client,再清空緩沖區
- out.flush():輸出緩沖區內容
- out.close():關閉輸出流
5.5page對象
代表該頁面本身。通常沒有太大用處。
5.6 pageContext對象
代表頁面上下文,主要用於jsp之間的共享數據,使用pageContext對象能夠訪問page、request、session、application范圍的變量。
5.7 request對象
request對象是jsp中的重要對象,每一個對象封裝着一次用戶請求。而且所有對請求參數都被封裝在request對象中,request對象是獲取用戶請求參數的重要途徑。request對象的一些方法:
- request.getMethod():獲取請求的方法名。如get,post.
- request.getRequestURI():獲取請求資源名.如請求訪問:/jspstudy/08/request.jsp
- request.getProtocol():獲取請求使用的協議.如:HTTP/1.1
- request.getServerName():獲取請求使用的server,如:localhost.
- request.getServerPort():獲取請求使用的serverport。如:8080
- request.getRemoteAddr():獲取client的ip地址.
- request.getRemoteHost():獲取client主機.
- request.getParameter():獲取傳遞過來的參數值.
- request.getParameterValues():請求參數有多個值時。該方法返回多個值組成的數組.
- request.setAttribute():
測試代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>request方法</title>
</head>
<body>
<form action="" method="post">
username:<input type="text" name="username"><br/>
<input type="submit">
請求方法名:<%=request.getMethod() %><br/>
請求的資源:<%=request.getRequestURI() %><br/>
請求使用的協議:<%=request.getProtocol() %><br/>
請求使用的server:<%=request.getServerName() %><br/>
請求使用的serverport:<%=request.getServerPort() %><br/>
client的IP地址:<%=request.getRemoteAddr() %><br/>
client主機:<%=request.getRemoteHost() %><br/>
表單提交過來的值:<%=request.getParameter("username") %><br/>
</form>
</body>
</html>
輸出:
請求方法名:POST
請求的資源:/jspstudy/08/request.jsp
請求使用的協議:HTTP/1.1
請求使用的server:localhost
請求使用的serverport:8080
client的IP地址:0:0:0:0:0:0:0:1
client主機:0:0:0:0:0:0:0:1
表單提交過來的值:test
5.8 response對象
response對象用於server對client的響應,大部分時候使用out對象向頁面輸出。可是out對象時JspWriter對象的實例,JapWriter時Writer的字類。Writer是字符流,因此out對象無法輸出非字符內容。jsp頁面須要輸出圖片、pdf文檔、excel等非字符對象時須要使用response作為響應輸出.response還能夠用於重定向。向client添加cookie.
5.9 session對象
session對象代表一次用戶會話。一次用戶會話的含義是:從client連接server開始。到client與server斷開為止,這個過程就是一次會話。
session通經常使用於跟蹤用戶的會話信息,如推斷用戶是否登錄。購物車中跟蹤用戶購買的商品。
session范圍的屬性能夠在多個頁面點跳轉之間共享。一旦關閉瀏覽器,session結束。session范圍內的屬性就會所有丟失。