JavaWeb筆記十二:jsp指令、JavaBean、EL表達式

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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章