SP:Java Server Pages。JSP是一種網(wǎng)頁的編碼格式,不同于HTML的是JSP中是由 HTML中的標(biāo)簽指令 和 Java邏輯代碼 拼湊而成, 其中的Java代碼類似于JavaScript中的邏輯代碼, 但相對(duì)比來說JSP中的Java代碼更方便閱讀和書寫.
當(dāng)JSP頁面被運(yùn)行時(shí),WEB容器會(huì)把請(qǐng)求交給JSP引擎處理,會(huì)將JSP翻譯成一個(gè)_jspServlet,然后按照Servlet的調(diào)用方式來進(jìn)行調(diào)用,
瀏覽器向服務(wù)器發(fā)請(qǐng)求,不管訪問的是什么資源,其實(shí)都是在訪問Servlet,所以當(dāng)訪問一個(gè)jsp頁面時(shí),其實(shí)也是在訪問一個(gè)Servlet,服務(wù)器在執(zhí)行jsp的時(shí)候,首先把jsp翻譯成一個(gè)Servlet,所以我們?cè)L問jsp時(shí),其實(shí)不是在訪問jsp,而是在訪問jsp翻譯過后的那個(gè)Servlet,
Tomcat在Web中的作用:
Tomcat是Web中的容器,
當(dāng)客戶在Web服務(wù)器中輸入請(qǐng)求的時(shí)候, 如果請(qǐng)求的動(dòng)態(tài)頁面, 那么Web服務(wù)器會(huì)創(chuàng)建一個(gè)Servlet來處理, Servlet就是Java代碼, 只是在服務(wù)器端的Java代碼, Servlet通過配置文件來攔截客戶所發(fā)出的請(qǐng)求, 并進(jìn)行相應(yīng)的處理, 最后反饋到客戶端.
在這一系列的請(qǐng)求中,Web服務(wù)器是如何創(chuàng)建出Servlet來對(duì)請(qǐng)求進(jìn)行處理? 而Tomcat的作用就是幫助Web服務(wù)器來創(chuàng)建Servlet的
Tomcat是應(yīng)用(java)服務(wù)器,它只是一個(gè)Servlet容器,是Apache的擴(kuò)展,處理動(dòng)態(tài)頁面的部分
Tomcat各個(gè)文件夾的含義
當(dāng)我們通過瀏覽器訪問index.jsp時(shí),服務(wù)器首先將index.jsp翻譯成一個(gè)index_jsp.class,在Tomcat服務(wù)的work\Catalina\localhost\項(xiàng)目名\org\apache\jsp 目錄下可以看到index_jsp.class的源代碼文件index_jsp.java,
index_jsp這個(gè)類是繼承 org.apache.jasper.runtime.HttpJspBase這個(gè)類的,通過查看Tomcat服務(wù)器的源代碼,可以知道在apache-tomcat-6.0.20-src\java\org\apache\jasper\runtime目錄下存HttpJspBase這個(gè)類的源代碼文件
HttpJspBase 類是繼承 HttpServlet 的,所以 HttpJspBase 類是一個(gè) Servlet ,而 index_jsp 又是繼承 HttpJspBase類的,所以index_jsp類也是一個(gè)Servlet,所以當(dāng)瀏覽器訪問服務(wù)器上的index.jsp頁面時(shí),其實(shí)就是在訪問index_jsp這個(gè)Servlet,index_jsp這個(gè)Servlet使用_jspService這個(gè)方法處理請(qǐng)求。
1:jsp中的代碼是由 Java代碼 和 HTML 代碼組成的 但是兩種不同的代碼是如何實(shí)現(xiàn)他們的作用的?
在客戶端發(fā)出請(qǐng)求時(shí)(請(qǐng)求的是動(dòng)態(tài)代碼) 但是客戶端卻只能看到HTML代碼, Java代碼是客戶端看不到的
原因是: 請(qǐng)求的JSP頁面中,所有的代碼是通過了Web服務(wù)器(在Tomcat下)編譯后的Servlet代碼, 在jsp中編寫的java代碼和html代碼都會(huì)被翻譯到_jspService方法中去,在jsp中編寫的java代碼會(huì)原封不動(dòng)地翻譯成java代碼,如<%out.print("HelloJsp");%>直接翻譯成out.print("Hello Jsp");,而HTML代碼則會(huì)翻譯成使用out.write("<html標(biāo)簽>\r\n");的形式輸出到瀏覽器。在jsp頁面中編寫的html排版標(biāo)簽都是以out.write("<html標(biāo)簽>\r\n");的形式輸出到瀏覽器,瀏覽器拿到html代碼后才能夠解析執(zhí)行html代碼。
當(dāng)執(zhí)行_jspService方法處理請(qǐng)求時(shí),就會(huì)執(zhí)行在jsp編寫的java代碼了,所以Jsp頁面中的java代碼服務(wù)器是通過調(diào)用_jspService方法處理請(qǐng)求時(shí)執(zhí)行的。(_jspService中的Java代碼是實(shí)現(xiàn)動(dòng)態(tài)頁面的邏輯基礎(chǔ))
本程序
腳本程序可以包含任意量的Java語句、變量、方法或表達(dá)式,只要它們?cè)谀_本語言中是有效的。
腳本程序的語法格式:
<% 代碼片段 %>
或者,您也可以編寫與其等價(jià)的XML語句,就像下面這樣:
<jsp:scriptlet> 代碼片段</jsp:scriptlet>
任何文本、HTML標(biāo)簽、JSP元素必須寫在腳本程序的外面。
下面給出一個(gè)示例,同時(shí)也是本教程的第一個(gè)JSP示例:
<html><head><title>Hello World</title></head><body>Hello World!<br/><%out.println("Your IP address is " + request.getRemoteAddr());%></body></html>
注意:請(qǐng)確保Apache Tomcat已經(jīng)安裝在C:\apache-tomcat-7.0.2目錄下并且運(yùn)行環(huán)境已經(jīng)正確設(shè)置。
將以上代碼保存在hello.jsp中,然后將它放置在 C:\apache-tomcat-7.0.2\webapps\ROOT目錄下,打開瀏覽器并在地址欄中輸入http://localhost:8080/hello.jsp。運(yùn)行后得到以下結(jié)果:
中文編碼問題
如果我們要在頁面正常顯示中文,我們需要在 JSP 文件頭部添加以下代碼:<>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
接下來我們將以上程序修改為:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body>Hello World!<br/><%out.println("你的 IP 地址 " + request.getRemoteAddr());%></body></html>
這樣中文就可以正常顯示了。
JSP聲明
一個(gè)聲明語句可以聲明一個(gè)或多個(gè)變量、方法,供后面的Java代碼使用。在JSP文件中,您必須先聲明這些變量和方法然后才能使用它們。
JSP聲明的語法格式:
<%! declaration; [ declaration; ]+ ... %>
或者,您也可以編寫與其等價(jià)的XML語句,就像下面這樣:
<jsp:declaration> 代碼片段</jsp:declaration>
程序示例:
<%! int i = 0; %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %>
JSP表達(dá)式
一個(gè)JSP表達(dá)式中包含的腳本語言表達(dá)式,先被轉(zhuǎn)化成String,然后插入到表達(dá)式出現(xiàn)的地方。
由于表達(dá)式的值會(huì)被轉(zhuǎn)化成String,所以您可以在一個(gè)文本行中使用表達(dá)式而不用去管它是否是HTML標(biāo)簽。
表達(dá)式元素中可以包含任何符合Java語言規(guī)范的表達(dá)式,但是不能使用分號(hào)來結(jié)束表達(dá)式。
JSP表達(dá)式的語法格式:
<%= 表達(dá)式 %>
同樣,您也可以編寫與之等價(jià)的XML語句:
<jsp:expression> 表達(dá)式</jsp:expression>
程序示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><p> 今天的日期是: <%= (new java.util.Date()).toLocaleString()%></p></body> </html>
運(yùn)行后得到以下結(jié)果:
今天的日期是: 2016-6-25 13:40:07
JSP注釋
JSP注釋主要有兩個(gè)作用:為代碼作注釋以及將某段代碼注釋掉。
JSP注釋的語法格式:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><%-- 該部分注釋在網(wǎng)頁中不會(huì)被顯示--%> <p> 今天的日期是: <%= (new java.util.Date()).toLocaleString()%></p></body> </html>
運(yùn)行后得到以下結(jié)果:
今天的日期是: 2016-6-25 13:41:26
不同情況下使用注釋的語法規(guī)則:
語法 | 描述 |
---|---|
<%-- 注釋 --%> | JSP注釋,注釋內(nèi)容不會(huì)被發(fā)送至瀏覽器甚至不會(huì)被編譯 |
<!-- 注釋 --> | HTML注釋,通過瀏覽器查看網(wǎng)頁源代碼時(shí)可以看見注釋內(nèi)容 |
<\% | 代表靜態(tài) <%常量 |
%\> | 代表靜態(tài) %> 常量 |
\' | 在屬性中使用的單引號(hào) |
\" | 在屬性中使用的雙引號(hào) |
JSP指令
JSP指令用來設(shè)置與整個(gè)JSP頁面相關(guān)的屬性。
JSP指令語法格式:
<%@ directive attribute="value" %>
這里有三種指令標(biāo)簽:
指令 | 描述 |
---|---|
<%@ page ... %> | 定義頁面的依賴屬性,比如腳本語言、error頁面、緩存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入標(biāo)簽庫的定義,可以是自定義標(biāo)簽 |
JSP行為
JSP行為標(biāo)簽使用XML語法結(jié)構(gòu)來控制servlet引擎。它能夠動(dòng)態(tài)插入一個(gè)文件,重用JavaBean組件,引導(dǎo)用戶去另一個(gè)頁面,為Java插件產(chǎn)生相關(guān)的HTML等等。
行為標(biāo)簽只有一種語法格式,它嚴(yán)格遵守XML標(biāo)準(zhǔn):
<jsp:action_name attribute="value" />
行為標(biāo)簽基本上是一些預(yù)先就定義好的函數(shù),下表羅列出了一些可用的JSP行為標(biāo)簽::
語法 | 描述 |
---|---|
jsp:include | 用于在當(dāng)前頁面中包含靜態(tài)或動(dòng)態(tài)資源 |
jsp:useBean | 尋找和初始化一個(gè)JavaBean組件 |
jsp:setProperty | 設(shè)置 JavaBean組件的值 |
jsp:getProperty | 將 JavaBean組件的值插入到 output中 |
jsp:forward | 從一個(gè)JSP文件向另一個(gè)文件傳遞一個(gè)包含用戶請(qǐng)求的request對(duì)象 |
jsp:plugin | 用于在生成的HTML頁面中包含Applet和JavaBean對(duì)象 |
jsp:element | 動(dòng)態(tài)創(chuàng)建一個(gè)XML元素 |
jsp:attribute | 定義動(dòng)態(tài)創(chuàng)建的XML元素的屬性 |
jsp:body | 定義動(dòng)態(tài)創(chuàng)建的XML元素的主體 |
jsp:text | 用于封裝模板數(shù)據(jù) |
JSP隱含對(duì)象
JSP支持九個(gè)自動(dòng)定義的變量,江湖人稱隱含對(duì)象。這九個(gè)隱含對(duì)象的簡介見下表:
對(duì)象 | 描述 |
---|---|
request | HttpServletRequest類的實(shí)例 |
response | HttpServletResponse類的實(shí)例 |
out | PrintWriter類的實(shí)例,用于把結(jié)果輸出至網(wǎng)頁上 |
session | HttpSession類的實(shí)例 |
application | ServletContext類的實(shí)例,與應(yīng)用上下文有關(guān) |
config | ServletConfig類的實(shí)例 |
pageContext | PageContext類的實(shí)例,提供對(duì)JSP頁面所有對(duì)象以及命名空間的訪問 |
page | 類似于Java類中的this關(guān)鍵字 |
Exception | Exception類的對(duì)象,代表發(fā)生錯(cuò)誤的JSP頁面中對(duì)應(yīng)的異常對(duì)象 |
控制流語句
JSP提供對(duì)Java語言的全面支持。您可以在JSP程序中使用Java API甚至建立Java代碼塊,包括判斷語句和循環(huán)語句等等。
判斷語句
If…else塊,請(qǐng)看下面這個(gè)例子:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%! int day = 3; %> <!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><h3>IF...ELSE 實(shí)例</h3><% if (day == 1 | day == 7) { %> <p>今天是周末</p><% } else { %> <p>今天不是周末</p><% } %></body> </html>
運(yùn)行后得到以下結(jié)果:
IF...ELSE 實(shí)例今天不是周末
現(xiàn)在來看看switch…case塊,與if…else塊有很大的不同,它使用out.println(),并且整個(gè)都裝在腳本程序的標(biāo)簽中,就像下面這樣:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%! int day = 3; %> <!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><h3>SWITCH...CASE 實(shí)例</h3><% switch(day) {case 0: out.println("星期天"); break;case 1: out.println("星期一"); break;case 2: out.println("星期二"); break;case 3: out.println("星期三"); break;case 4: out.println("星期四"); break;case 5: out.println("星期五"); break;default: out.println("星期六");}%></body> </html>
瀏覽器訪問,運(yùn)行后得出以下結(jié)果:
SWITCH...CASE 實(shí)例星期三
循環(huán)語句
在JSP程序中可以使用Java的三個(gè)基本循環(huán)類型:for,while,和 do…while。
讓我們來看看for循環(huán)的例子,以下輸出的不同字體大小的"我愛學(xué)習(xí)":
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%! int fontSize; %> <!DOCTYPE html><html><head><meta charset="utf-8"><title>我愛學(xué)習(xí)(run.com)</title></head><body><h3>For 循環(huán)實(shí)例</h3><%for ( fontSize = 1; fontSize <= 3; fontSize++){ %> <font color="green" size="<%= fontSize %>"> 我愛學(xué)習(xí) </font><br /><%}%></body> </html>
將上例改用while循環(huán)來寫:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%! int fontSize; %> <!DOCTYPE html><html><head><meta charset="utf-8"><title>我愛學(xué)習(xí)(run.com)</title></head><body><h3>While 循環(huán)實(shí)例</h3><%while ( fontSize <= 3){ %> <font color="green" size="<%= fontSize %>"> 我愛學(xué)習(xí) </font><br /><%fontSize++;%><%}%></body> </html>JSP運(yùn)算符
JSP支持所有Java邏輯和算術(shù)運(yùn)算符。
下表羅列出了JSP常見運(yùn)算符,優(yōu)先級(jí)從高到底:
類別 | 操作符 | 結(jié)合性 |
---|---|---|
后綴 | () [] . (點(diǎn)運(yùn)算符) | 左到右 |
一元 | ++ - - ! ~ | 右到左 |
可乘性 | * / % | 左到右 |
可加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
關(guān)系 | > >= < <= | 左到右 |
相等/不等 | == != | 左到右 |
位與 | & | 左到右 |
位異或 | ^ | 左到右 |
位或 | | | 左到右 |
邏輯與 | && | 左到右 |
邏輯或 | || | 左到右 |
條件判斷 | ?: | 右到左 |
賦值 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
逗號(hào) | , | 左到右 |
JSP 字面量
JSP語言定義了以下幾個(gè)字面量:
布爾值(boolean):true 和 false;
整型(int):與 Java 中的一樣;
浮點(diǎn)型(float):與 Java 中的一樣;
字符串(string):以單引號(hào)或雙引號(hào)開始和結(jié)束;
Null:null。
SP是Servlet 技術(shù)的擴(kuò)展,所有的jsp文件都會(huì)被翻譯為一個(gè)繼承HttpServlet的類,也就是說jsp最終也是一個(gè)Servlet ,這個(gè)Servlet對(duì)外提供服務(wù)。
Servlet 和jsp最主要的不同點(diǎn)在于jsp側(cè)重于視圖,Servlet 主要用于控制邏輯。
Servlet 的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來,Servlet如果要實(shí)現(xiàn)HTML的功能,必須使用Writer輸出對(duì)應(yīng)的HTML,比較麻煩。而jsp的情況是Java和HTML可以組合成一個(gè)擴(kuò)展名為 .jsp 的文件,做界面展示比較方便而嵌入邏輯比較復(fù)雜。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。