jsp介紹
概述
JSP全名為Java Server Pages,Java服務頁面(提供Java服務的頁面)
jsp頁面可以寫html代碼嗽冒,也可以寫Java代碼梳侨。
其根本是一個簡化的Servlet設計。
后綴名為(*.jsp)
用JSP開發(fā)的Web應用是跨平臺的仿荆,既能在Linux下運行,也能在其他操作系統(tǒng)上運行坏平。
JSP與Servlet一樣拢操,是在服務器端執(zhí)行的。
通常返回給客戶端的就是一個HTML文本舶替,因此客戶端只要有瀏覽器就能瀏覽.
JSP技術(shù)使用Java編程語言編寫類XML的tags和scriptlets令境,來封裝產(chǎn)生動態(tài)網(wǎng)頁的處理邏輯。
網(wǎng)頁還能通過tags和scriptlets訪問存在于服務端的資源的應用邏輯顾瞪。
作用
jsp用于開發(fā)動態(tài)資源的技術(shù)舔庶。
servlet中向瀏覽器輸出html數(shù)據(jù)是非常不方便的返劲,所以就要使用jsp替代。
jsp就是servlet+html
原理
jsp就是一個servlet栖茉。
JSP會被最終編譯成一個Servlet
把項目運行到tomcat中后篮绿,訪問某個jsp。然后到tomcat的work/catalina/local/項目名稱/org/apache/jsp目錄下有對應的jsp生成的文件吕漂。
_01_showtime_jsp.class
_01_showtime_jsp.java
運行過程
1)瀏覽器發(fā)出請求訪問的jsp
2)tomcat服務器會把jsp文件翻譯成一個Java文件亲配。
3)tomcat服務器會把Java文件編譯成class文件。
4)tomcat服務器創(chuàng)建jsp類對象
5)調(diào)用jsp類的方法
注意:
1)翻譯和編譯操作在第一次訪問的時候執(zhí)行和修改jsp后執(zhí)行惶凝。
問題
1)jsp中的HTML代碼是如何輸出的吼虎?
在_jspService()中執(zhí)行
把jsp代碼中的所有內(nèi)容通過out.write()輸出到界面。
2)Java代碼如何執(zhí)行的苍鲜?
直接把jsp中的Java代碼拷貝到Java文件中思灰,也是在_jspService()中執(zhí)行
特點:
簡單易用
完全的面向?qū)ο? 具有平臺無關(guān)性且安全可靠
主要面向因特網(wǎng)
一個JSP頁面可以被分為以下幾部份:
靜態(tài)數(shù)據(jù),如HTML
JSP指令混滔,如include指令
JSP腳本元素和變量
JSP動作
用戶自定義標簽
jsp語法
jsp模板
作用:就是jsp頁面寫的HTML代碼
jsp表達式
作用:向瀏覽器輸出變量或表達式計算的結(jié)果
語法:<%=變量或者表達式%>
注意:
1)原理使用out.print();輸出內(nèi)容
2)不要以分號結(jié)尾
jsp腳本
作用:執(zhí)行Java代碼
語法:<%%>
注意:
原理是原封不動的拷貝到_jspService()方法中執(zhí)行
使用:
<%
for(Student stu:students){
%>
<tr>
<td><%=stu.getId()%></td>
<td><%=stu.getName()%></td>
<td><%=stu.getAge()%></td>
</tr>
<%}%>
不足
代碼結(jié)構(gòu)混亂
腳本與HTML混合洒疚,容易出錯
代碼不易于維護
jsp聲明
作用:聲明成員變量和成員方法.可以在腳本和表達式中使用。
語法:<%! %>
使用:
<%!
String name="shuaige";
public String getName(){return name;}
%>
注意:
1)不能定義和翻譯同名類或者同名方法
2)方法只能定義在聲明中坯屿,腳本不能定義方法的
3)聲明定義的是全局變量油湖,腳本定義的是局部變量。
jsp注釋
作用:注釋jsp頁面
語法:<%-- jsp注釋 --%>
注意:
1)jsp注釋與HTML注釋要區(qū)分開來领跛。 html注釋會被翻譯和被執(zhí)行乏德。而jsp注釋不會被翻譯。
2)jsp頁面盡量使用jsp注釋吠昭。
jsp指令
作用
1)指令的作用就是告訴web服務器如何翻譯這個jsp頁面的內(nèi)容喊括。
2)翻譯的過程起作用
語法
<%@ 指令名稱 屬性1 屬性2 ... %>
三大指令
page
作用:通知web服務器如何翻譯一些常用的屬性
include指令
作用:包含其它頁面
原理:被包含的jsp頁面不會被翻譯和被編譯
注意:
1)包含和被包含的頁面內(nèi)容先合并在一起,然后翻譯一個Java文件(先合并再翻譯)
2)這種包含叫做靜態(tài)包含
taglib
作用:用于導入標簽庫指令矢棚。
EL表達式
作用:向瀏覽器輸出域?qū)ο笾械淖兞炕蛘弑磉_式結(jié)果郑什。用于替代jsp表達式
可以用于獲取JavaBean的屬性
能夠讀取集合類型對象中的元素
運用運算符進行數(shù)據(jù)處理
屏蔽常見的異常
自動實現(xiàn)類型轉(zhuǎn)換
頁面結(jié)構(gòu)清晰
代碼可讀性高,易于維護
不足
EL表達式無法實現(xiàn)邏輯控制
語法:${變量名|表達式}
EL表達式獲取不同類型數(shù)據(jù)
取普通的字符串 ${username} 其實是替代 <%=pageContext.findAttribute("name")%>
取對象的屬性數(shù)據(jù)${student.name}
List集合或數(shù)組數(shù)據(jù)${list[0].name}/${arr[0]}
取Map集合數(shù)據(jù)${map['username']}
EL執(zhí)行表達式計算
數(shù)學運算 +,-,*,/,% ${a+b}
邏輯運算 &&,||,! ${true && false}
比較運算 >,<,>=,<=,== ${a>b}
三目運算 ?: ${a>b?"是":"不是"} <input type="radio" name="gender" value="男" ${gender=="男"?"checked='checked'":""}/>
為空判斷 ${name==null || name==""} 或者 ${empty name}
改變優(yōu)先級 () 例如${3*(4+5)}
EL的內(nèi)置對象(11個)
${pageContext} == <%=pageContext%>
${pageScope.name} == <%=pageContext.getAttribute("name",PAGE_SCOPE)%>
${requestScope.name} == <%=pageContext.getAttribute("name",REQUEST_SCOPE)%>
${sessionScope.name} == <%=pageContext.getAttribute("name",SESSION_SCOPE)%>
${applicationScope.name} == <%=pageContext.getAttribute("name",APPLICATION_SCOPE)%>
${param['name']} == <%=request.getParameter("name")%>
${paramValues['name']} == <%=request.getParameterValues("name")%>
${header['user-agent']} == <%=request.getHeader("user-agent")%>
${headerValues['user-agent']} == <%=request.getHeaders("user-agent")%>
${cookie} == <%=request.getCookies()%>
${initParam['aaa']} == <%=application.getInitParameter("aaa")%>
作用域訪問對象
pageScope
與頁面作用域(page)中的屬性相關(guān)聯(lián)的Map類幻妓,主要用于獲取頁面范圍內(nèi)的屬性值
requestScope
與請求作用域(request)中的屬性相關(guān)聯(lián)的Map類蹦误,主要用于獲取請求范圍內(nèi)的屬性值
sessionScope
與會話作用域(session)中的屬性相關(guān)聯(lián)的Map類劫拢,主要用于獲取會話范圍內(nèi)的屬性值
applicationScope
與應用程序作用域(application)中的屬性相關(guān)聯(lián)的Map類肉津,主要用于獲取應用程序范圍內(nèi)的屬性值
自定義標簽
1)作用:用于執(zhí)行Java代碼,替代jsp腳本
2)需求:向瀏覽器輸出當前客戶端的ip地址
jsp頁面腳本:Java代碼
String ip = request.getRemoteHost();
out.write(ip);
自定義標簽
1.創(chuàng)建一個類繼承SimpleTagSupport
2.實現(xiàn)doTag方法
3.在doTag方法中獲取到pageContext對象舱沧,就可以做任何事情了妹沙。
4.在WEB-INF目錄下創(chuàng)建一個xxx.tld文件,到tomcat的webapps/examples目錄下搜索*tld
5.說明
tlib-version 標簽庫的版本
jsp-version jsp的版本
short-name 引用時的簡單名稱:引用標簽庫的名稱熟吏,我這改為shuai距糖。在jsp頁面中的taglib的prefix中寫這個玄窝。
uri 引用這個標簽庫的路徑名稱,隨便寫悍引。在jsp頁面中的taglib的uri中寫這個恩脂。
tag 就是一個標簽
name 標簽的名字,這里我使用hello趣斤。在jsp頁面上使用俩块。
tag-class 標簽的全路徑
body-content 標簽內(nèi)容格式
scriptless: 不能寫java代碼 (推薦)
empty: 當前標簽為空標簽
tagdependent : 可以寫java代碼,但是不執(zhí)行(當前普通字符串執(zhí)行)
attribute 屬性名稱 <shuai:hello num="值">
name 在標簽類中有一個此名稱的屬性浓领,注意:要有g(shù)et/set方法
required 是否必填
rtexprvalue 是否支持el表達式
6.jsp頁面引用 <%@ taglib uri="http://it.shuai.com" prefix="shuai" %>
7.使用標簽 <shuai:hello></shuai:hello>
自定義標簽作用
1.控制是否輸出標簽體內(nèi)容
doTag中:
JspFragment body = this.getJspBody();
PageContext context = (PageContext)this.getJspContext();
JspWriter out = context.getOut();
body.invoke(out);//寫就可以顯示hello玉凯,如果不寫就不顯示。
//默認代碼
this.getJspBody().invoke(null);
jsp頁面中
<shuai:hello>
hello
</shuai:hello>
2.控制是否輸出標簽后面的內(nèi)容
輸出:doTag中什么都不做
不輸出:doTag中拋出一個異常联贩,那么jsp中這個標簽后的所有HTML內(nèi)容都不顯示
3.控制重復輸出標簽體內(nèi)容
4.修改標簽體內(nèi)容
//1)獲取原來的標簽體內(nèi)容
JspFragment jspBody = this.getJspBody();
//2)創(chuàng)建一個臨時容器用于存放標簽體內(nèi)容
StringWriter sw = new StringWriter();
//3)暫時把標簽體內(nèi)容寫到一個臨時容器中
jspBody.invoke(sw);
//4)從臨時容器中取出內(nèi)容
String content = sw.toString();
//5)修改內(nèi)容
content = content.toUpperCase();
//6)手動寫出給瀏覽器
this.getJspContext().getOut().write(content);
3)自定義標簽執(zhí)行過程
1.tomcat服務器檢查指令
<%@ taglib uri="http://it.shuai.com" prefix="shuai" %>
查詢是否存在uri值為http://it.shuai.com的tld文件
檢查prefix
2.tomcat服務器查找hello這個標簽漫仆。到這個tld文件中找這個標簽。
3.得到tag-class的內(nèi)容
4.構(gòu)造com.shuai.tags.OneTag對象
5.調(diào)用com.shuai.tags.OneTag對象的方法
4)SimpleTag接口:所有標簽處理類都必須實現(xiàn)此接口(這個是標準)
生命周期方法
setJspContext() 設置pageContext對象
setParent() 設置父的標簽對象泪幌,如果沒有父標簽盲厌,則不會調(diào)用。
setJspbody() 設置標簽體內(nèi)容祸泪,沒有標簽體內(nèi)容狸眼,則不調(diào)用此方法
doTag() 執(zhí)行標簽方法
5)自定義foreach遍歷標簽
6)自定義if寫法
7)自定義choose:when+otherwise寫法
8)打jar包
1.導出jar包,只留src下的tag標簽
2.jar包中只留標簽目錄和META-INF目錄即可浴滴。其它的刪掉(META-INF就相當于WEB-INF目錄)
3.把tld文件拷貝到jar包中的META-INF目錄下即可拓萌。
9)其它
獲得標簽體的內(nèi)容
<shuai:choose name="test">
shuaige
</shuai:choose>
//獲取標簽內(nèi)容并且輸出
JspFragment body = getJspBody();
StringWriter sw = new StringWriter();
body.invoke(sw);
System.out.println(sw.toString());
JspWriter out = this.getJspContext().getOut();
out.write(sw.toString());
輸出標簽內(nèi)容
<shuai:choose name="test">
shuaige
</shuai:choose>
JspFragment body = getJspBody();
body.invoke(null);
或者
JspFragment body = getJspBody();
JspWriter out = this.getJspContext().getOut();
body.invoke(out);
添加標簽屬性
<shuai:choose name="test">
shuaige
</shuai:choose>
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
<tag>
<name>choose</name>
<tag-class>com.shuai.tag.OneTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
獲取上下文
JspContext context = this.getJspContext();
jsp指令 - page
通過屬性定義了JSP的特性,實現(xiàn)與JSP容器的通信
語法:
<%@ page 屬性="值"%>
詳細介紹:
language="java"
語言是Java語言
contentType="text/html; charset=UTF-8"
指定當前JSP頁面的MIME類型和字符編碼
翻譯成response.setContentType(""); 通知瀏覽器的內(nèi)容和編碼
注意:contentType的默認值和pageEncoding的值保存一致升略。
pageEncoding="UTF-8"
指定當前頁面的編碼格式,服務器用什么編碼翻譯成Java文件
buffer="8kb"
指定out對象使用緩沖區(qū)的大小微王,默認8kb
有了緩存區(qū)之后,內(nèi)容滿足以下條件才會寫到瀏覽器:
1)緩存區(qū)滿了品嚣。
2)jsp執(zhí)行完畢
3)手動刷新緩存區(qū)
4)設置緩存區(qū)為0(也就是沒有緩存區(qū))
注意:只有out才有緩存區(qū)炕倘,response.getWriter().write()沒有緩存
autoFlush="true"
控制out對象的 緩存區(qū)
errorPage="error.jsp"
指定當JSP頁面發(fā)生異常時需要轉(zhuǎn)向的錯誤處理頁面
isErrorPage="true"
指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面
當前jsp頁面就是錯誤頁面,
只有設置了此屬性翰撑,才能使用exception罩旋。否則無法使用。
錯誤頁面顯示錯誤信息<%=exception.getMessage()%>
extends="javax.servlet.http.HttpServlet"
指定當前jsp頁面的servlet從哪一個類繼承
import="java.util.ArrayList"
導入要使用的Java類眶诈。
在jsp導入包涨醋。
默認導入java.lang.* 。
多個包用逗號,隔開
info="onejsp"
定義JSP頁面的描述信息
isThreadSafe="true"
指定對JSP頁面的訪問是否為線程安全逝撬,默認是true
session="true"
指定JSP頁面是否使用session浴骂,默認是true
是否打開httpSession功能。
isELIgnored="false"
指定是否執(zhí)行EL表達式,默認是false
是否忽略EL表達式宪潮,false不忽略(默認)溯警,true忽略
具體使用:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page buffer="8kb" autoFlush="true"%>
<%@ page errorPage="error.jsp" isErrorPage="true"%>
<%@ page extends="javax.servlet.http.HttpServlet"%>
<%@ page import="java.util.ArrayList"%>
<%@ page info="onejsp"%>
<%@ page isThreadSafe="true"%>
<%@ page session="true"%>
<%@ page isELIgnored="false"%>
jsp指令 - include
語法:
<%@ include file="界面" %>
詳細介紹:
file="common.jsp" 指定包含其他文件,相對路徑或者絕對路徑
具體使用:
<%@ include file="common.jsp" %>
注意:
file="/common.jsp" 路徑是WebContent下
file="common.jsp" 路徑是WebContent下
jsp指令 - taglib
概述
引入標簽庫的定義
指令引入一個自定義標簽集合的定義趣苏,包括庫路徑、自定義標簽
語法:
<%@ taglib 屬性="值" %>
詳細介紹:
uri="http://java.sun.com/jsp/jstl/core" 標簽庫的描述URI
prefix="c" 指定一個前綴prefix
tagdir="/WEB-INF/tags" 其中的tags是個目錄梯轻,里面有若干tag文件
具體使用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="sys" tagdir="/WEB-INF/tags" %>
注意:
一般我們只是使用 uri + prefix
tagdir 是自定義標簽庫
jsp中內(nèi)置的Java對象
jsp頁面在執(zhí)行過程中食磕,為開發(fā)者提前創(chuàng)建好了一些開發(fā)中常用的對象。
config
ServletConfig類的實例喳挑。
這個對象允許開發(fā)者訪問Servlet或者JSP引擎的初始化參數(shù)芬为,比如文件路徑等。
out
JSPWriter用來寫入響應流的數(shù)據(jù)蟀悦,JspWriter類的實例媚朦,用于把結(jié)果輸出至網(wǎng)頁上
包含了大部分java.io.PrintWriter類中的方法
page
servlet自身,類似于Java類中的this關(guān)鍵字
pageContext
一個PageContext實例包括和整個頁面相聯(lián)系的數(shù)據(jù)日戈,一個給定的HTML頁面可以在多個JSP之間傳遞询张。
PageContext類的實例,提供對JSP頁面所有對象以及命名空間的訪問浙炼。
主要用來訪問頁面信息份氧,同時過濾掉大部分實現(xiàn)細節(jié)。
存儲了request對象和response對象的引用弯屈。
application對象蜗帜,config對象,session對象资厉,out對象可以通過訪問這個對象的屬性來導出厅缺。
包含了傳給JSP頁面的指令信息,包括緩存信息宴偿,ErrorPage URL,頁面scope等湘捎。
定義了一些字段,包括PAGE_SCOPE窄刘,REQUEST_SCOPE窥妇,SESSION_SCOPE, APPLICATION_SCOPE娩践。
它也提供了40余種方法活翩,有一半繼承自javax.servlet.jsp.JspContext 類。
其中一個重要的方法就是removeArribute()翻伺,它可接受一個或兩個參數(shù)材泄。
作用:
1)可以獲取其它8個內(nèi)置對象
自定義標簽時經(jīng)常用到這個。
2)是一個域?qū)ο?作用范圍是當前的jsp范圍
可以把數(shù)據(jù)保存在jsp頁面范圍內(nèi)
可以把數(shù)據(jù)保存在其它三個域?qū)ο?setAttribute(key,value,域常量);getAttribute(key,域常量);
域常量:PAGE_SCOPE,REQUEST_SCOPTE,SESSION_SCOPE,APPLICATION_SCOPTE
3)可以從4個域自動搜索數(shù)據(jù)findAttribute(key);
搜索屬性:從小到大:page-->request-->session-->application 找不到就是空
request
HTTP request對象穆趴,HttpServletRequest類的實例脸爱。
是javax.servlet.http.HttpServletRequest 類的實例遇汞。
每當客戶端請求一個JSP頁面時未妹,JSP引擎就會制造一個新的request對象來代表這個請求簿废。
提供了一系列方法來獲取HTTP頭信息,cookies络它,HTTP方法等等族檬。
response
HTTP response對象,HttpServletResponse類的實例化戳。
是javax.servlet.http.HttpServletResponse類的實例单料。
當服務器創(chuàng)建request對象時會同時創(chuàng)建用于響應這個客戶端的response對象。
定義了處理HTTP頭模塊的接口点楼。通過這個對象扫尖,開發(fā)者們可以添加新的cookies,時間戳掠廓,HTTP狀態(tài)碼等等换怖。
session
HttpSession類的實例,用于保持客戶端與服務器連接的對象
用來跟蹤在各個客戶端請求間的會話蟀瞧。
application
ServletContext類的實例沉颂,與應用上下文有關(guān)。
這個對象在JSP頁面的整個生命周期中都代表著這個JSP頁面悦污。
這個對象在JSP頁面初始化時被創(chuàng)建铸屉,隨著jspDestroy()方法的調(diào)用而被移除。
通過向application中添加屬性切端,則所有組成您web應用的JSP文件都能訪問到這些屬性彻坛。
exception
Throwable 異常對象
內(nèi)置對象 - out對象
說明:
混合寫Java代碼
語法:
<% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
具體使用:
<%
out.println("輸出到界面<br/>");
out.print("aaa<br/>");
out.print("bbb<br/>");
out.print("ccc<br/>");
%>
注意:
1.輸出亂碼問題:
1.1頁面必須要引入
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
1.2jsp的文件編碼要是UTF-8
2.println與print方法
均不能使頁面換行,必須添加<br/>
內(nèi)置對象 - request對象
說明:
混合寫Java代碼
語法:
<% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
具體使用:
<%
//獲取用戶提交的數(shù)據(jù)
//返回指定參數(shù)名稱數(shù)值,返回類型為String類型踏枣,若無對應名稱的參數(shù)小压,返回NULL
String name = request.getParameter("name");
//返回具有相同參數(shù)名稱的數(shù)值集合,返回類型為String類型的數(shù)組
String[] names = request.getParameterValues("name");
//設置請求時的編碼
request.setCharacterEncoding("UTF-8");
//通過屬性存儲/獲取值
//使用屬性存取數(shù)據(jù)時椰于,要確保數(shù)據(jù)在保存時必須是Object類型怠益,而在取出時還要轉(zhuǎn)換成原先自己的類型
//通過屬性存儲值
request.setAttribute("desc", "zhangsan");
//通過屬性獲取值
String desc = (String)request.getAttribute("desc");
//轉(zhuǎn)發(fā)
request.getRequestDispatcher("info.jsp").forward(request, response);
%>
內(nèi)置對象 - response對象
說明:
混合寫Java代碼
語法:
<% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
對請求作出響應并返回結(jié)果
具體使用:
<%
//設置響應時的編碼
response.setCharacterEncoding("UTF-8");
//重定向
response.sendRedirect("info.jsp");
%>
注意:
重定向是對請求的重新定位,所以重定向后瘾婿,原請求中的數(shù)據(jù)將會丟失
內(nèi)置對象 - session對象
說明:
混合寫Java代碼
語法:
<% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
用于存儲與用戶相關(guān)的會話信息
setAttribute(String key,Object obj) 以key/value形式保存數(shù)據(jù)
getAttribute(String key) 通過key獲取數(shù)據(jù)
getId() 獲取sessionid
invalidate() 設置session對象失效
setMaxInactiveInterval(int interval) 設置session對象有效期
removeAttribute(String key) 移除session中的屬性
具體使用:
<%
//存儲/獲取數(shù)據(jù)
//存儲數(shù)據(jù)
session.setAttribute("name", "zhangsan");
//獲取數(shù)據(jù)
String name = (String)session.getAttribute("name");
%>
cookie
說明:
由服務器端生成蜻牢,發(fā)送到客戶端保存的一段文本信息
語法:
<% 在此區(qū)域?qū)慗ava代碼 %>
詳細介紹:
使用Cookie記錄上網(wǎng)瀏覽的信息
在頁面請求時,可以帶著cookie到后臺偏陪。
可以在響應頁面時抢呆,返回設置cookie九妈。
Cookie的常用方法
setMaxAge(int expiry) 設置Cookie的有效期榜田,以秒為單位
setValue(String value) 創(chuàng)建Cookie后益涧,為Cookie賦值
getName() 獲得Cookie的名稱
getValue() 獲得Cookie的值
getMaxAge() 獲取Cookie的有效期尚粘,以秒為單位
具體使用:
<%
//創(chuàng)建Cookie
Cookie cookie = new Cookie("name","zhangsan");
//寫入Cookie
response.addCookie(cookie);
//讀取 Cookie
Cookie[] cookies = request.getCookies();
for(int i = 0;i<cookies.length;i++){
//獲取指定的cookie
Cookie cookie1 = cookies[i];
//獲取cookie的值
String value = cookie1.getValue();
}
%>
jsp內(nèi)置標簽
特點
是jsp語法內(nèi)設計的一些標簽锭吨,使用這些內(nèi)置標簽不需要導入tld或者jar包
jsp標簽優(yōu)點
封裝頁面顯示功能
頁面代碼簡介
提高可讀性,易于維護
標簽
jsp:useBean
會默認創(chuàng)建對象
id 對象名
class 引用類的地址,要全路徑
scope 作用域
beanName
type
jsp:setProperty
設置對象屬性的值
name 對象名
property 對象的屬性名
value 屬性值
jsp:getProperty
獲取對象屬性的值
name 對象名
property 對象的屬性名
jsp:include
動態(tài)頁面包含
使用頁面包含技術(shù)實現(xiàn)最大限度的頁面復用
分類
靜態(tài)頁面包含
先將頁面包含雳锋,后執(zhí)行頁面代碼颂砸,即將一個頁面的代碼復制到另一個頁面中
被包含的頁面內(nèi)容發(fā)生變化時,包含頁面將會被重新編譯
動態(tài)頁面包含
先執(zhí)行頁面代碼谣沸,后將頁面包含刷钢,即將一個頁面的運行結(jié)果包含到另一個頁面中
被包含頁面內(nèi)容發(fā)生變化時,包含頁面不會重新編譯
靜態(tài)包含
<%@include file="URL "%>
jsp:forward
轉(zhuǎn)發(fā)
代碼
<%-- 服務器路徑 --%>
<jsp:forward page="info.jsp">
<%-- 轉(zhuǎn)發(fā)時帶路徑 --%>
<jsp:param value="zhangsan" name="name"/>
</jsp:forward>
jsp:param
參數(shù)標簽
jsp:include
被包含的頁面將會被翻譯
代碼
<%-- 服務器路徑 乳附, 會把兩個頁面合并在一起 --%>
<jsp:include page="header.jsp"></jsp:include>
<%@ include %> 包含頁面内地,被包含的標簽不會被翻譯
<%@ include %>指令包含是先合并再翻譯,叫靜態(tài)包含赋除。
jsp:include標簽包含是先翻譯后合并阱缓,叫動態(tài)包含。
<%@ include %>指令包含可以使用被包含頁面的變量(數(shù)據(jù))举农。
jsp:include標簽包含不可以使用被包含頁面的變量(數(shù)據(jù))茬祷,建議使用靜態(tài)包含。
jstl標簽庫
說明
java standard tag library
JSP標準標簽庫
實現(xiàn)JSP頁面中的邏輯控制
特點:
需要導入標簽庫
分類:
1.核心標簽庫:core c
2.國際化/格式標簽庫 format fmt
3.EL函數(shù)庫 fn并蝗,在jsp頁面上簡化String的操作
4.SQL標簽庫 sql - 不用
5.XML標簽庫 xml x - 不用
核心標簽庫:core c
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
c:set
保存數(shù)據(jù)到域?qū)ο笾? <c:set var="變量名" value="變量值" scope="域"></c:set>
<c:set value= "變量值" target="對象名稱" property="對象的屬性名稱" />
<c:set var="name" value="shuaige" scope="request" property="user"></c:set>
c:out
從域?qū)ο笾腥〕鰯?shù)據(jù)
<c:out value="${el表達式 }" default="默認值" escapeXml="默認值是html標簽時是否轉(zhuǎn)義"></c:out>
<c:out value="name" default="shuaige1" escapeXml="true"></c:out>
c:if
單條件判斷
<c:if test="條件" scope="判斷結(jié)果存放的作用域">條件為true時顯示</c:if>
<c:if test="${1==1}">
<p>如果條件成立顯示內(nèi)容</p>
</c:if>
c:choose/c:when/c:otherwise
多條件判斷
<c:choose>
<c:when test="條件">條件為true時顯示</c:when>
<c:when test="條件">條件為true時顯示</c:when>
<c:otherwise>上邊的條件都不成立時顯示</c:otherwise>
</c:choose>
<%
request.setAttribute("score", 90);
%>
<c:choose>
<c:when test="${score >=90 }">條件成立大于90</c:when>
<c:when test="${score >=80 }">條件成立大于80</c:when>
<c:otherwise>以上條件不成立小于80</c:otherwise>
</c:choose>
c:forEach
遍歷集合或數(shù)組
<c:forEach items="需要遍歷的數(shù)據(jù)" var="遍歷時祭犯,每個對象的名稱" begin="從哪個元素開始,從0開始" end="到哪個元素結(jié)束" step="步長滚停,就是條件增加多少" varStatus="把當前元素的狀態(tài)信息封裝到次元素vs中沃粗,第幾個元素count ${vs.count }"></c:forEach>
<c:forEach items="${list }" var="student" begin="0" end="10" step="1" varStatus="vs">
${vs.count } - ${student.name }
</c:forEach>
c:forTokens
遍歷字符串
<c:forTokens items="要處理的字符串" delims="split的符號" var="分隔后每個元素的名稱"></c:forTokens>
<c:forTokens items="${strs }" delims="-" var="str" begin="0" end="10" step="1" varStatus="vs">
${vs.count } - ${str }
</c:forTokens>
c:url
簡化URI的編寫
<c:url value="url路徑,服務器路徑"></c:url>
c:redirect
重定向
<c:redirect url="重定向路徑"></c:redirect>
c:param
參數(shù)標簽
<c:param name="參數(shù)名稱" value="參數(shù)的值"></c:param>
c:import
導入標簽
<c:import url="導入資源的路徑"></c:import>
c:remove
c:catch
EL函數(shù)庫 fn
用來處理字符串
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
toUpperCase
小寫轉(zhuǎn)大寫
${fn:toUpperCase(str) }
<%
request.setAttribute("name", "zhangsan");
%>
${fn:toUpperCase(name) }
toLowerCase
大寫轉(zhuǎn)小寫
${fn:toLowerCase(str) }
<%
request.setAttribute("name", "SHUAIGE");
%>
${fn:toLowerCase(name) }
length
字符串長度
${fn:length(str)}
<%
request.setAttribute("name","shuaige");
%>
${fn:length(name) }
contains
包含某個字符串
<%
request.setAttribute("name", "shuaige");
%>
${fn:contains(name,'ge') }
${fn:contains(name,"ge") }
containsIgnoreCase
是否包含(忽略大小寫)
<%
request.setAttribute("name", "shuaige");
%>
${fn:containsIgnoreCase(name,'Ge') }
${fn:containsIgnoreCase(name,"Ge") }
endsWith
以什么結(jié)尾
<%
request.setAttribute("name", "shuaige.txt");
%>
${fn:endsWith(name,'.txt') }
escapeXml
html標簽是否生效
<%
request.setAttribute("name","<p>shuaige</p>");
%>
${name }<br/>
${fn:escapeXml(name) }
indexOf
查找某個字符第一次發(fā)現(xiàn)的下標
<%
request.setAttribute("name", "shuaige.txt");
%>
${fn:indexOf(name,'.') }
join
把數(shù)組以某個分隔符拼接成字符串
<%
String[] str = {"aaa","bbb","ccc"};
request.setAttribute("str",str);
%>
${fn:join(str,'-') }
replace
替換
<%
request.setAttribute("name","shuai;ge");
%>
${fn:replace(name,";","") }
split
以某個分割符分割
<%
request.setAttribute("name","shuai;ge");
%>
<c:forEach items="${fn:split(name,';')}" var="str">
<p>${str }</p>
</c:forEach>
startsWith
以某個字符開始
<%
request.setAttribute("name","shuaige");
%>
${fn:startsWith(name,"shuai")}
${fn:startsWith(name,'shuai')}
substring
截取
<%
request.setAttribute("name","shuaige");
%>
${fn:substring(name,0,5) }
substringAfter
截取
<%
request.setAttribute("name","shuaige");
%>
${fn:substringAfter(name,"shuai") }
substringBefore
截取
<%
request.setAttribute("name","shuaige");
%>
${fn:substringBefore(name,"ge") }
trim
去掉前后空格
<%
request.setAttribute("name", " shuaige ");
%>
${fn:trim(name) }
fmt標簽
格式化
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
fmt:formatDate
實現(xiàn)格式化的日期和時間顯示
<fmt:formatDate value="date" pattern="顯示格式"/>
<fmt:formatDate value= " date" pattern="yyyy-MM-dd HH:mm:ss"/>
fmt:bundle
fmt:formatNumber
fmt:message
fmt:param
fmt:parseDate
fmt:parseNumber
fmt:requestEncoding
fmt:setBundle
fmt:setLocale
fmt:setTimeZone
fmt:timeZone
通過設置頁面的基路徑避免使用相對路徑
在頁面上取得項目路徑:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+
request.getServerName()+":"+
request.getServerPort()+path+"/";
%>
在<head>中添加:
<base href="<%=basePath%>">
國際化
src目錄下
message_en_US.properties
message_zh_CN.properties
message_en_GB.properties
測試讀取
ResourceBundle bundle = ResourceBundle.getBundle("message", Locale.CHINA);
String username = bundle.getString("username");
String password = bundle.getString("password");
項目讀取
ResourceBundle bundle = ResourceBundle.getBundle("message", Locale.getDefault());
String username = bundle.getString("username");
String password = bundle.getString("password");
jsp頁面使用
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<fmt:setBundle basename="message"/><%--綁定資源包 --%>
<fmt:message key="username"/><%--讀取資源包中的key --%>
日期數(shù)字格式化