JSP指令
JSP指令分類
JSP有三大指令:
* page指令
* include指令
* taglib指令
在JSP中沒有任何指令是必須的!!!
但基本上每個JSP都是使用page指令!
page指令
page指令是最爲常用的指令!
1. page指令的常用屬性:
* import:等同與import語句
--> <%@ page import="java.util.*" %>
--> <%@ page import="java.util.*, java.net.*" %>
--> 在一個JSP頁面中可以給出多個page指令,而且import是可以重複出現的
<%@ page import="java.util.*" %>
<%@ page import="java.next.*" %>
* pageEncoding:指定當前頁面的編碼
--> 如果pageEncoding沒有指定,那麼默認爲contentType的值;
--> 如果pageEncoding和contentType都沒有指定,那麼默認值爲iso-8859-1
* contentType:等同與調用response.setContentType("text/html;charset=xxx");
--> 如果沒有指定contentType屬性,那麼默認爲pageEncoding的值;
--> 如果contentType和pageEncoding都沒有指定,那麼默認值爲iso-8859-1
* errorPage:如果當前頁面出現異常,那麼跳轉到errorPage指定的jsp頁面。例如:<%@ page errorPage="a.jsp" %>
* isErrorPage:上面示例中指定a.jsp爲錯誤頁面,但在a.jsp中不能使用內置對象exception,保有a.jsp中使用<%@page isErrorPage="true"%>時,才能在a.jsp中使用錯誤頁面。
* autoFlush:當autoFlush爲true時,表示out流緩衝區滿時會自動刷新。默認爲true
* buffer:指定out流的緩衝區大小,默認爲8KB
* isELIgnored:當前JSP頁面是否忽略EL表達式,默認爲false,表示不忽略,即支持EL表達式
2. page指令不常用的屬性:
* language:當前JSP編譯後的語言!默認爲java,當前也只能選擇java
* info:當前JSP的說明信息
* isThreadSafe:當前JSP是否執行只能單線程訪問,默認爲false,表示支持併發訪問
* session:當前頁面是否可以使用session,默認爲false,表示支持session的使用。
* extends:指定JSP真身的父類!
3. web.xml中對jsp的配置
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern> <!--表示對所有jsp進行配置-->
<el-ignored>true</el-ignored> <!--忽略EL表達式-->
<page-encoding>UTF-8</page-encoding> <!--編碼爲utf-8-->
<scripting-invalid>true</scripting-invalid> <!--禁用java腳本-->
</jsp-property-group>
</jsp-config>
include指令
語法:<%@include file="頁面"%>
include指令的作用是包含指定的頁面!在jsp被編譯成java文件之前會把兩個jsp文件合併,然後再編譯成一個java文件。
注意:
<%@include file="<%=myfile%>" %>
這是不能通過編譯的,因爲myfile是一個變量,它的值只有在java編譯成class後執行時才能確定。而include指令需要在jsp編譯java時就要確定包含的是哪個頁面,所以...
taglib指令
taglib指令是用來在當前jsp頁面中導入第三方的標籤庫
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix:指定標籤前綴,這個東西可以隨意起名
uri:指定第三方標籤庫的uri(唯一標識)
當然,需要先把第三方標籤庫所需jar包放到類路徑中。
九大內置對象
無需在jsp中聲明即可使用的9個對象
* out(JspWriter):等同與response.getWriter(),用來向客戶端發送文本數據;
* config(ServletConfig):對應“真身”中的ServletConfig;
* page(當前JSP的真身類型):當前JSP頁面的“this”,即當前對象,引用爲Object類型;
* pageContext(PageContext):頁面上下文對象,它是最後一個沒講的域對象;
* exception(Throwable):只有在錯誤頁面中可以使用這個對象;
* request(HttpServletRequest):即HttpServletRequest類的對象;
* response(HttpServletResponse):即HttpServletResponse類的對象;
* application(ServletContext):即ServletContext類的對象;
* session(HttpSession):即HttpSession類的對象,不是每個JSP頁面中都可以使用,如果在某個JSP頁面中設置<%@page session=”false”%>,說明這個頁面不能使用session。
pageContext對象
pageContext對象是PageContext類型
* 域對象:只在當前jsp頁面中有效的域,通常用來讓jsp與當前jsp中標籤之間共享數據
* 獲取其他8個內置對象:可以獲取其他8個內置對象
* 代理其他域對象:可以用pageContext來操作其他3個域。
JSP動作標籤
JSP動作標籤是用來替代一部分java腳本,使非java開發人員也可以向jsp中添加動態信息
----------------------
<jsp:include>
例如:<jsp:include page="xxx"/>,用來包含指定的頁面。
例如在a.jsp中存在如下內容:<jsp:include page="b.jsp"/>
a.jsp和b.jsp分別編碼成Servlet,然後在執行Servlet時纔會執行包含過程。這也是include指令與include標籤的區別。
注意:<jsp:include page="<%=myfile%>">,這是可以的!因爲include指令是在執行時才完成的包含,在執行時已經可以確定myfile這個變量的值。
該標籤內部使用的是RequestDispatcher#include()方法完成的包含
----------------------
<jsp:forward>
例如:<jsp:forward page="xxx"/>,用來轉發到指定頁面
例如在a.jsp中存在如下內容:<jsp:fowrad page="b.jsp"/>
a.jsp中的內容不會顯示在瀏覽器上,而只是顯示b.jsp的內容。而且在<jsp:forwad>標籤下面的內容不會被執行。
----------------------
<jsp:param>
該標籤是<jsp:include>和<jsp:forward>的子標籤,用來向其他頁面傳遞參數。
<jsp:include page="/b.jsp">
<jsp:param value="zhangSan" name="username"/>
</jsp:include>
在b.jsp中可以使用request.getParameter("username")來獲取參數值。
JavaBean
滿足JavaBean規範的類就是javaBean
* 必須有public的無參的構造器
* 如果成員變量提供了getter/setter方法,那麼稱之爲javabean屬性。
JavaBean主要是用來通過反射操作的類!
因爲需要通過Class的newInstance()方法來創建類的實例,所以要求類必須提供public的無參構造器
因爲需要通過反射來操作屬性,所以需要提供getter/setter方法。
----------------------
內省
內省依賴反射,內省比反射簡化一點點,用來操作JavaBean
把Map中的數據封裝到指定類型的JavaBean中。
以有對象:Map、Class<User>
1. 通過Class對象獲取BeanInfo
BeanInfo info = Introspector.getBeanInfo(User.class);
2. 通過BeanInfo獲取所有屬性描述符對象
PropertyDescriptor[] pds = info.getPropertyDescriptors();
3. PropertyDescriptor:
* String name getName():獲取當前屬性名稱
* Method getReadMethod():獲取get方法反射對象
* Method getWriteMethod():獲取set方法反射對象
----------------------
commons-beanutils
beanutils比內省要簡單很多,而且還要強大很多,它底層依賴內省。
1. jar包
commons-beanutils.jar、commons-logging.jar
2. 通過反射設置Javabean
Class<User> clazz = User.class;
Object user = clazz.newInstance();
BeanUtils.setProperty(user, "username", "admin");
BeanUtils.setProperty(user, "password", "admin123");
3. 獲取屬性值
String username = BeanUtils.getProperty(user, "username");
4. 把Map數據封裝到JavaBean對象中
Map<String,String> map = new HashMap<String,String>();
map.put("username", "admin");
map.put("password", "admin123");
User user = new User();
BeanUtils.populate(user, map);
要求:map的key名稱必須與User類的屬性名稱相同。不要無法賦值!
-----------------
JSP中與JavaBean相關的標籤
* <jsp:useBean>
* <jsp:setProperty>
* <jsp:getProperty>
<jsp:useBean id="user1" class="cn.itcast.domain.User" />
查看page域中是否存在user1這個域屬性,如果存在,那麼直接獲取。
如果不存在,那麼創建之!
等同與:
User user1 = pageContext.getAttribute("user1");
if(user1 == null) {
user1 = new User();//創建user1對象
pageContext.setAttribute("user1", user1);//保存到page域
}
-----------------
上面是操作page域,可以通過scope屬性來指定操作的域
<jsp:useBean id="user1" class="cn.itcast.domain.User" scope="page"/>
<jsp:useBean id="user2" class="cn.itcast.domain.User" scope="request"/>
<jsp:useBean id="user3" class="cn.itcast.domain.User" scope="session"/>
<jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>
------------------
<jsp:setProperty>
設置屬性值
<jsp:setProperty property="username" name="user1" value="admin"/>
* name:指定名爲user1的JavaBean
* property:指定要設置的屬性名稱
* value:指定要設置的屬性值
等同與
User user1 = (User)pageContext.getAttribute("user1");
user1.setUsername("admin");
------------------
<jsp:getProperty>
獲取屬性值
<jsp:getProperty property="username" name="user1"/>
輸出user1這個javaBean的username屬性值
等同與
User user1 = (User)pageContext.getAttribute("user1");
out.print(user1.getUsername());
EL表達式
EL:Expression Language,它是可以在JSP頁面中直接使用的語言!
JSP頁面也可以忽略EL:<@page isELIgnored="true"%>
EL用來代替<%=...%>
--------------------
格式:${...},例如:${1 + 2},會在頁面上輸出3
--------------------
運算符:+ - * / % == != < > <= >= && ! || empty
${empty ""} --> 輸出true,判斷集合、數據、字符串長度是否爲0
${null},不會輸出!如果是null不輸出!
--------------------
EL內置對象
EL一共11個內置對象
EL操作四大域的內置對象:它們是Map類型
pageScope
requestScope
sessionScope
applicationScope
${pageScope.user}:輸出pageContext.getAttribute("user")
${requestScope.user}:輸出request.getAttribute("user");
${sessionScope.user}:輸出session.getAttribute("user");
${applicationScope.user}:輸出application.getAttribute("user");
${user}
依次在pageScope、requestScope、sessionScope、applicationScope中查找user
如果查找到,那麼立刻停止查找。
-----------
對JavaBean的操作
對List的操作
對Map的操作
-----------
操作JavaBean
<%
User user = new User();
user.setUsername("zhangSan");
user.setPassword("123");
pageContext.setAttribute("user", user);
%>
${pageScope.user.username}
${pageScope.user.password}
-----------
操作List
<%
User user = new User();
user.setUsername("zhangSan");
user.setPassword("123");
List list = new ArrayList();
list.add(user);
pageContext.setAttribute("list", list);
%>
${pageScope.list[0].username}
${pageScope.list[0].password}
-----------
操作Map
<%
User user = new User();
user.setUsername("zhangSan");
user.setPassword("123");
Map map = new HashMap();
map.put("u1", user);
pageContext.setAttribute("map", map);
%>
${pageScope.map['u1'].username}
${pageScope.map['u1'].password}
${pageScope.map.u1.username}
${pageScope.map.u1.password}
------------------
EL操作參數內置對象:Map類型
param:Map<String,String>
paramValues:Map<String,String[]>
${param.username}:request.getParameter("username")
${paramValues.hobby}:request.getParameterValues("hobby");
------------------
EL操作請求頭內置對象:Map類型
header:Map<String,String>
headerValues:Map<String,String[]>
${header.UserAgent}
${headerValues.UserAgener[0]}
------------------
應用初始化參數內置對象:Map類型
initParam:Map<String,String>
用來獲取web.xml文件中的<context-param>參數,例如:
web.xml
<context-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</context-param>
${initParam.p1}
------------------
與Cookie相關的內置對象:Map類型
cookie:Map<String,Cookie>,其中key是Cookie的名稱,而值是Cookie對象
${cookie.jsessionid.value}:獲取sessionid
------------------
pageContext內置對象:PageContext類型
${pageContext.request},等同pageContext.getRequest()
${pageContext.session},等同pageContext.getSession()
${pageContext.request.contextpath},獲取項目名
${pageContext.session.id},獲取sessionId
------------------
EL中最重要的就是操作四大域!
EL函數庫
EL函數庫,當前就是一些函數了。
使用EL函數庫需要在JSP頁面中導入標籤庫:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
…
String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }<br/><!--3-->
${fn:length(list) }<br/><!--1-->
${fn:toLowerCase("Hello") }<br/> <!-- hello -->
${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
${fn:contains("abc", "a")}<br/><!-- true -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
${fn:contains(arr, "a")}<br/><!-- true -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
${fn:join(arr, ";")}<br/><!-- a;b;c -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->
${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
${fn:trim(" a b c ")}<br/><!-- a b c -->
${fn:escapeXml("<html></html>")}<br/> <!-- <html></html> -->
自定義函數庫
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>