javaweb之jsp三大指令
JSP三大指令
一個jsp頁面中,可以有0~N個指令的定義!
- page --> 最複雜:<%@page language=“java” info=“xxx”…%>
- pageEncoding和contentType:
pageEncoding:它指定當前jsp頁面的編碼,只要不說謊,就不會有亂碼!在伺服器要把jsp編譯成.java時需要使用pageEncoding!
contentType:它表示新增一個響應頭:Content-Type!等同與response.setContentType(“text/html;charset=utf-8”);
如果兩個屬性只提供一個,那麼另一個的預設值為設定那一個。
如果兩個屬性都沒有設定,那麼預設為iso - import:導包!可以出現多次
- errorPage和isErrorPage
errorPage:當前頁面如果丟擲異常,那麼要轉發到哪一個頁面,由errorPage來指定
isErrorPage:它指定當前頁面是否為處理錯誤的頁面!當該屬性為true時,這個頁面會設定狀態碼為500!而且這個頁面可以使用9大內建物件中的exception!
<error-code>404</error-code> <location>/error/errorPage.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/errorPage.jsp</location> </error-page> <error-page> <exception-type>java.lang.RuntimeException</exception-type> <location>/index.jsp</location> </error-page>
- autoFlush和buffer
autoFlush:指定jsp的輸出流緩衝區滿時,是否自動重新整理!預設為true,如果為false,那麼在緩衝區滿時丟擲異常!
buffer:指定緩衝區大小,預設為8kb,通常不需要修改! - isELIgnored:是否忽略el表示式,預設值為false,不忽略,即支援!
- 基本沒有:
language:指定當前jsp編譯後的語言型別,預設值為java。
info:資訊!
isThreadSafe:當前的jsp是否支援併發訪問!
session:當前頁面是否支援session,如果為false,那麼當前頁面就沒有session這個內建物件!
extends:讓jsp生成的servlet去繼承該屬性指定的類!
- include --> 靜態包含
- 與RequestDispatcher的include()方法的功能相似!
- <%@include%> 它是在jsp編譯成java檔案時完成的!他們共同生成一個java(就是一個servlet)檔案,然後再生成一個class!
- RequestDispatcher的include()是一個方法,包含和被包含的是兩個servlet,即兩個.class!他們只是把響應的內容在執行時合併了!
- 作用:把頁面分解了,使用包含的方式組合在一起,這樣一個頁面中不變的部分,就是一個獨立jsp,而我們只需要處理變化的頁面。
- taglib --> 匯入標籤庫
- 兩個屬性:
prefix:指定標籤庫在本頁面中的字首!由我們自己來起名稱!
uri: 指定標籤庫的位置!
<%@taglib prefix=“s” uri="/struts-tags"%> 字首的用法<s:text>
=========================================
九個內建物件
- out --> jsp的輸出流,用來向客戶端響應
- page --> 當前jsp物件! 它的引用型別是Object,即真身中有如下程式碼:Object page = this;
- config --> 它對應真身中的ServletConfig物件!
- pageContext --> 一個頂9個!
- request --> HttpServletEequest
- response --> HttpServletResponse
- exception --> Throwable
- session --> HttpSession
- application --> ServletContext
- pageContext
- 一個頂9個!
- Servlet中有三大域,而JSP中有四大域,它就是最後一個域物件!
ServletContext:整個應用程式
session:整個會話(一個會話中只有一個使用者)
request:一個請求鏈!
pageContext:一個jsp頁面!這個域是在當前jsp頁面和當前jsp頁面中使用的標籤之間共享資料!
域物件
代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
全域查詢:pageContext.findAttribute(“xxx”);從小到大,依賴查詢!
獲取其他8個內建物件:
=========================================
JSP動作標籤
這些jsp的動作標籤,與html提供的標籤有本質的區別。
* 動作標籤是由tomcat(伺服器)來解釋執行!它與java程式碼一樣,都是在伺服器端執行的!
* html由瀏覽器來執行!
* jsp:forward:轉發!它與RequestDispatcher的forward方法是一樣的,一個是在Servlet中使用,一個是在jsp中使用!
* jsp:include:包含:它與RequestDispatcher的include方法是一樣的,一個是在Servlet中使用,一個是在jsp中使用!
> %@include和jsp:include有什麼不同!
* jsp:param:它用來作為forward和include的子標籤!用來給轉發或包含的頁面傳遞引數!
=========================================
JavaBean
javaBean的規範:
- 必須要有一個預設構造器
- 提供get/set方法,如果只有get方法,那麼這個屬性是隻讀屬性!
- 屬性:有get/set方法的成員,還可以沒有成員,只有get/set方法。屬性名稱由get/set方法來決定!而不是成員名稱!
- 方法名稱滿足一定的規範,那麼它就是屬性!boolean型別的屬性,它的讀方法可以是is開頭,也可以是get開頭!
內省:
內省類 --> Bean資訊 --> 屬性描述符 --> 屬性的get/set對應的Method! — > 可以反射了!
commons-beanutils,它是依賴內省完成!
- 導包:
commons-beanutils.jar
commons-logging.jar
BeanUtils.getProperty(Object bean, String propertyName)
BeanUtils.setProperty(Object bean, String propertyName, String propertyValue)
BeanUtils.populate(Map map, Object bean)
CommontUtils.toBean(Map map, Class class)
jsp中與javaBean相關的標籤!
- jsp:useBean --> 建立或查詢bean
- <jsp:useBean id=“user1” class=“cn.itcast.domain.User” scope=“session”/> 在session域中查詢名為user1的bean,如果不存在,建立之
- <jsp:useBean id=“user1” class=“cn.itcast.domain.User” scope=“session”/>
- jsp:setProperty
- <jsp:setProperty property=“username” name=“user1” value=“admin”/> 設定名為user1的這個javabean的username屬性值為admin
- jsp:getProperty
- <jsp:getProperty property=“username” name=“user1”/> 獲取名為user1的javabean的名為username屬性值
=========================================
EL表示式
- EL是JSP內建的表示式語言!
- jsp2.0開始,不讓再使用java指令碼,而是使用el表示式和動態標籤來替代java指令碼!
- EL替代的是<%= … %>,也就是說,EL只能做輸出!
- EL表示式來讀取四大域
- ${xxx},全域查詢名為xxx的屬性,如果不存在,輸出空字串,而不是null。
- {requestScope.xxx}、 {applicationScope.xxx},指定域獲取屬性!
-
javaBean導航
<%
Address address = new Address();
address.setCity(“北京”);
address.setStreet(“西三旗”);Employee emp = new Employee();
emp.setName(“李小四”);
emp.setSalary(123456);
emp.setAddress(address);request.setAttribute(“emp”, emp);
%>
使用el獲取request域的emp
${requestScope.emp.address.street }- EL可以輸出的東西都在11個內建物件中!11個內建物件,其中10個是Map!pageContext不是map,它就是PageContext型別,1個項9個。
-
我們已經學習了四個
-
param:對應引數,它是一個Map,其中key引數名,value是引數值,適用於單值的引數。
-
paramValues:對應引數,它是一個Map,其中key引數名,value是多個引數值,適用於多值的引數。
-
header:對應請求頭,它是一個Map,其中key表示頭名稱,value是單個頭值,適用於單值請求頭
-
headerValues:對應請求頭,它是一個Map,其中key表示頭名稱,value是多個頭值,適用於多值請求頭
-
initParam:獲取內的引數!
xxx
XXX
yyy
YYY
-
cookie:Map<String,Cookie>型別,其中key是cookie的name,value是cookie物件。 ${cookie.username.value}
-
pageContext:它是PageContext型別!${pageContext.request.contextPath}
=========================================
EL函式庫(由JSTL提供的)
- 匯入標籤庫:<%@ tablib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions”%>
String toUpperCase(String input):把引數轉換成大寫
String toLowerCase(String input):把引數轉換成小寫
int indexOf(String input, String substring):從大串,輸出小串的位置!
boolean contains(String input, String substring):檢視大串中是否包含小串
boolean containsIgnoreCase(String input, String substring):忽略大小寫的,是否包含
boolean startsWith(String input, String substring):是否以小串為字首
boolean endsWith(String input, String substring):是否以小串為字尾
String substring(String input, int beginIndex, int endIndex):擷取子串
String substringAfter(String input, String substring):獲取大串中,小串所在位置後面的字串
substringBefore(String input, String substring):獲取大串中,小串所在位置前面的字串
String escapeXml(String input):把input中“<”、">"、"&"、"’"、""",進行轉義
String trim(String input):去除前後空格
String replace(String input, String substringBefore, String substringAfter):替換
String[] split(String input, String delimiters):分割字串,得到字串陣列
int length(Object obj):可以獲取字串、陣列、各種集合的長度!
String join(String array[], String separator):聯合字串陣列!
=========================================
自定義函式庫
-
寫一個java類,類中可以定義0~N個方法,但必須是static,而且有返回值的!
-
在WEB-INF目錄下建立一個tld檔案
fun
cn.itcast.fn.MyFunction
java.lang.String fun()
-
在jsp頁面中匯入標籤庫
<%@ taglib prefix=“it” uri="/WEB-INF/tlds/itcast.tld" %> -
在jsp頁面中使用自定義的函式:${it:fun() }