文章目錄
1. JSP指令
1.1 page:爲頁面屬性指定值
使用:java<%@page language="java" info="xxx"...%>
- pageEncoding和contentType:設置編碼。
<%@ page pageEncoding=”utf-8”%>
pageEncoding:告知服務器當前jsp頁面的編碼;
contentType:它表示添加一個響應頭:Content-Type!等同與response.setContentType(“text/html;charset=utf-8”);
如果兩個屬性只提供一個,那麼另一個的默認值爲設置那一個。
如果兩個屬性都沒有設置,那麼默認爲iso - import:用於導包。
<%@page import=”java.net.*,java.util.*,java.sql.*”%>
- errorPage和isErrorPage:指定錯誤頁面。
<%@ page errorPage="b.jsp" %>
還可以在web.xml文件中指定錯誤頁面:
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
1.2 include
靜態包含!目的是把多個JSP合併成一個JSP文件!
include指令只有一個屬性:file,指定要包含的頁面,例如:
<%@include file=”b.jsp”%>
原理:
1.3 taglib
在JSP頁面中使用第三方的標籤庫時,需要使用taglib指令來“導包”。例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2. jsp九個內置對象
在JSP中無需創建就可以使用的9個對象,它們是:
config(ServletConfig)
:對應“真身”中的ServletConfig;request(HttpServletRequest)
:即HttpServletRequest類的對象;response(HttpServletResponse)
:即HttpServletResponse類的對象;session(HttpSession)
:即HttpSession類的對象;page(當前JSP的真身類型)
:當前JSP頁面的“this”,即當前對象;pageContext(PageContext)
:頁面上下文對象,它可獲取其它8個內置對象;application(ServletContext)
:即ServletContext類的對象;out(JspWriter)
:等同與response.getWriter(),用來向客戶端發送文本數據;exception(Throwable)
:只有在錯誤頁面中可以使用這個對象;
在JavaWeb中一共四個域對象。
Servlet能使用其中3個:request、session、application。
JSP都可以使用:pageContext
、request、session、application。
2.1 pageContext對象
一個jsp頁面!這個域是在當前jsp頁面和標籤之間共享數據!
功能:
> 域對象
> 代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
> 全域查找:pageContext.findAttribute(“xxx”);從小到大,依賴查找!
> 獲取其他8個內置對象:
3. JSP動作標籤
是JavaWeb內置的動作標籤,已經定義好,可以直接使用。
3.1 <jsp:include>
頁面包含
include指令是在編譯級別完成的包含,即把當前JSP和被包含的JSP合併成一個JSP,然後再編譯成一個Servlet。
include動作標籤是在運行級別完成的包含,即當前JSP和被包含的JSP都會各自生成Servlet,然後在執行當前JSP的Servlet時完成包含另一個JSP的Servlet。它與RequestDispatcher的include()方法是相同的!(和請求包含一樣,實質是一句方法調用)
3.2 <jsp:forward>
頁面轉發
forward標籤的作用是請求轉發!forward標籤的作用與RequestDispatcher#forward()方法相同。
3.3 <jsp:param>
可以在<jsp:include>
和<jsp:forward>
標籤中使用<jsp:param>
子標籤,用來傳遞參數的、
4.JavaBean
JavaBean是一種規範,也就是對類的要求:
- 必須要有一個默認構造器
- 提供get/set方法,如果只有get方法,那麼這個屬性是隻讀屬性!
- 屬性:有get/set方法的成員,還可以沒有成員,只有get/set方法。屬性名稱由get/set方法來決定!而不是成員名稱!
- 方法名稱滿足一定的規範,那麼它就是屬性!boolean類型的屬性,它的讀方法可以是is開頭,也可以是get開頭!、
5.EL表達式
5.1 EL表達式格式
EL(Expression Language)是一門表達式語言,可替代<%=…%>腳本
- 操作List和數組:
${list[0]}、${arr[0]}
; - 操作bean的屬性:
${person.name}、${person[‘name’]}
,對應person.getName()方法; - 操作Map的值:
${map.key}、${map[‘key’]}
,對應map.get(key)。
5.2 EL的11個內置對象
- pageScope:域內置對象。
${pageScope.name}等同與pageContext.getAttribute(“name”)
- requestScope:域內置對象。
- sessionScope:域內置對象。
- applicationScope:域內置對象。
- param:獲取請求參數,它是一個Map,其中key參數名,value是參數值,適用於單值的參數。
- paramValues:key參數名,value是多個參數值,適用於多值的參數。
- header:獲取請求頭,它是一個Map,其中key表示頭名稱,value是單個頭值,適用於單值請求頭
- headerValues:key表示頭名稱,value是多個頭值,適用於多值請求頭
- initParam:獲取web.xml中標籤
<context-param>
內的參數! - cookie:Map<String,Cookie>類型,其中key是cookie的name,value是cookie對象。 ${cookie.username.value}
- pageContext:它是PageContext類型!
${pageContext.request.contextPath}輸出項目名
5.3 EL函數庫
導入標籤庫:<%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
6.自定義函數庫
(1). 編寫類
類中只能有public static的方法,並且一定要有返回值
public class ItcastFuncations {
public static String test() {
return "傳智播客自定義EL函數庫測試";
}
}
(2). 部署文件
/WEB-INF/itcast.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name>
<uri>http://www.itcast.cn/jsp/functions</uri>
<function>
<name>test</name>
<function-class>cn.itcast.el.funcations.ItcastFuncations</function-class>
<function-signature>String test()</function-signature>
</function>
</taglib>
(3). 在JSP中使用自定義
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="itcast" uri="/WEB-INF/itcast.tld" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<h1>${itcast:test() }</h1>
</body>
</html>
7.JSTL標籤語言
JSTL是apache對EL表達式的擴展(也就是說JSTL依賴EL)!
7.1 core 標籤!
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out>
:輸出。EL表達式的增強,可設置默認值,可使用EL獲取指定域的屬性等。value:可以是字符串常量,也可以是EL表達式
default:當要輸出的內容爲null時,會輸出default指定的值
escapeXml:默認值爲true,表示轉義!<c:set>
:設置(創建域的屬性),可以指定域。var:變量名
value:變量值,可以是EL表達式
scope:域,默認爲page,可選值:page、request、session、application<remove>
:刪除域變量var:變量名
scope:如果不給出scope,表示刪除所有域中的該名稱的變量;如果指定了域,那麼只刪除該域的變量。
url
:value
:指定一個路徑!它會在路徑前面自動添加項目名。
<c:url value="/index.jsp"/>
,它會輸出: /項目名/index.jsp
子標籤:<c:param>
,用來給url後面添加參數,例如:
<c:url value="/index.jsp">
<c:param name=“username” value=“張三”/>
</c:url>
結果爲:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F
var
:指定變量名,一旦添加了這個屬性,那麼url標籤就不會再輸出到頁面,而是把生成url保存到域中。
scope
:它與var一起使用,用來保存url。默認爲page域。
-
if:對應java中的if語句
<c:if test=“布爾類型”>…</c:if>,當test爲真時,執行標籤體內容!
-
choose:它對應java中的if/else if/ … /else
例如:
<c:choose>
<c:when test="">…</c:when>
…
<c:otherwise> …</c:otherwise>
</c:choose> -
forEach:它用來循環遍歷數組、集合!
它還可以用來計數方式來循環!
計數方式:
<c:forEach var="i" begin="1" end="10">
${i}
</c:forEach>
屬性:
* var:循環變量
* begin:設置循環變量從幾開始。
* end:設置循環變量到幾結束。
* step:設置步長!等同與java中的i++,或i+=2。step默認爲1
增強for方式:
<c:forEach items="${strs }" var="str">
${str }<br/>
</c:forEach>
屬性:
* items:指定要循環誰,它可以是一個數組或一個集合
* var:把數組或集合中的每個元素賦值給var指定的變量。
循環狀態:可以使用varStatus來創建循環狀態變量!
循環狀態變量有如下屬性:
* count:循環元素的個數
* index:循環元素的下標
* first:是否爲第一個元素
* last:是否爲最後一個元素
* current:當前元素
<c:forEach items="${list }" var="ele" varStatus="vs">
${vs.index} ${vs.count } ${vs.first } ${vs.last } ${vs.current }<br/>
</c:forEach>
7.2 fmt庫
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
(1)時期格式庫:<fmt:formatDate value="" pattern="">
- value:指定一個Date類型的變量
- pattern:用來指定輸出的模板!例如:yyyy-MM-dd HH:mm:ss
(2)時期格式庫:<fmt:formatNumber value="" pattern="">
<fmt:formatNumber value="${num1}" pattern="0.00">
// 保留小數點後2位,它會四捨五入!如果不足2位,以0補位!
<fmt:formatNumber value="${num1}" pattern="#.##">
// 保留小數點後2位,它會四捨五入!如果不足2位,不補位!