1. 程式人生 > >EL函式、自定義EL函式、自定義標籤

EL函式、自定義EL函式、自定義標籤

EL函式

1、EL函式的作用:操作字串

2、在JSP頁面中要引入EL函式庫

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

3、語法

${ fn:方法名(引數) }

4、例項

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 引入EL函式庫 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
	<!-- 引入jstl標籤庫 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 操作域物件中的字串 -->
	<c:set var="username" value="abcdefg" scope="page"></c:set>
	<h4>EL函式操作page域的內容</h4>
	${ fn:indexOf(pageScope.username,"de") }
	${ fn:startsWith(pageScope.username,"a") }
	${ fn:toUpperCase(username) }
	${ fn:substringAfter(username,"de") }
	${ fn:substringBefore(username,"de") }
</body>
</html>

自定義EL函式

步驟:

(1)編寫一個java類,提供一個靜態方法,方法必須有返回值

package com.myel;

/**
 * 自定義EL函式
 * @author 58351
 *
 */
public class ELDemo {
	/**
	 * say hello 方法
	 * @param str
	 * @return
	 */
	public static String sayHello(String str){
		return "hello"+str;
	}
}

(2)在WEB-INF目錄下,編寫.tld結尾的檔案(xml檔案),進行配置

- 不要在lib或者classes目錄下建立

<?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>myfn</short-name>
	<uri>http://www.sutu.com/myfn</uri>  
 	<!-- 配置自定義EL函式 -->
	<function>
	<!-- 配置方法的名稱 -->
		<name>sayHello</name>
	<!-- 配置方法所在的類 -->
		<function-class>com.myel.ELDemo</function-class>
	<!-- 配置方法的簽名(描述類中的方法) -->
		<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
	</function>


</taglib>  

(3)在JSP頁面上引入自己編寫的EL函式庫

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 引入自己的EL函式 -->
<%@ taglib prefix="myfn" uri="http://www.sutu.com/myfn" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h4>使用自己編寫的EL函式</h4>
	${ myfn:sayHello("張三") }
</body>
</html>

自定義標籤

1、自定義標籤主要用於移除JSP頁面中的java程式碼,提高程式碼的複用性

2、開發步驟:

(1)編寫一個類,繼承SimpleTagSupport類,重寫3個方法

(2)在tld檔案中,編寫配置檔案

(3)在 JSP頁面中引入自定義的標籤庫

自定義標籤(沒有標籤主體)

自定義標籤的java類

package com.myjstl;

import java.io.IOException;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 自定義標籤沒有標籤主體
 * @author 58351
 *
 */
public class JSTLDemo1 extends SimpleTagSupport {
	
	private PageContext pc;
	private JspFragment body;
	
	/**
	 * 標籤執行了就會呼叫該方法
	 */
	public void doTag() throws JspException, IOException {
		//向頁面輸出hello
		pc.getOut().write("hello");
	}
	/**
	 * 獲取標籤主體,預設呼叫該方法,把JspFragment(標籤主體物件)傳入進來
	 */
	public void setJspBody(JspFragment jspBody) {
		this.body = jspBody;
	}
	/**
	 * Tomcat伺服器預設先呼叫該方法,獲取pageContext物件
	 */
	public void setJspContext(JspContext pc) {
		this.pc = (PageContext) pc;
	}
	
}

配置檔案

<?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>myc</short-name>
	<uri>http://www.sutu.com/myc</uri>  
	<!-- 配置自定義標籤 -->
	<tag>
		<!-- 配置標籤名稱 -->
		<name>print</name>
		<!-- 自定義標籤所在的類 -->
		<tag-class>com.myjstl.JSTLDemo1</tag-class>
		<!-- 配置標籤主體 -->
		<body-content>empty</body-content>
	</tag>

</taglib>  

JSP頁面引入自定義標籤庫

<%@ taglib prefix="myc" uri="http://www.sutu.com/myc" %>

使用標籤

<body>
	<!-- 自定義標籤 -->
	<!-- 在頁面上輸出hello -->
	<myc:print/>
</body>

自定義標籤(有標籤主體)

package com.myjstl;

import java.io.IOException;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
 * 自定義標籤有標籤主體
 * @author 58351
 *
 */
public class JSTLDemo2 extends SimpleTagSupport {
	
	private PageContext pc;
	private JspFragment body;
	/**
	 * 最後呼叫該方法,目的:輸出標籤主體
	 */
	public void doTag() throws JspException, IOException {
		//直接呼叫JspFragment的invoke(Writer out),標籤主體向外輸出
		body.invoke(pc.getOut());
	}

	public void setJspBody(JspFragment jspBody) {
		this.body = jspBody;
	}

	public void setJspContext(JspContext pc) {
		this.pc = (PageContext) pc;
	}
	
}

配置檔案

	<!-- 配置自定義標籤含有標籤主體 -->
	<tag>
		<name>out</name>
		<tag-class>com.myjstl.JSTLDemo2</tag-class>
		<body-content>scriptless</body-content>
	</tag>

帶有屬性的自定義標籤

配置類

	public class JstlDemo3 extends SimpleTagSupport{
		private PageContext pc;
		// 代表標籤主體
		private JspFragment jspBody;
		// test和JSP頁面上的if test屬性名稱必須是相同的
		// 必須給我提供test屬性的set方法
		private boolean test;
		public void setTest(boolean test) {
			this.test = test;
		}
		
		/**
		 * 最後呼叫該方法,目的:輸出標籤主體,由於屬性決定
		 */
		public void doTag() throws JspException, IOException {
			// 直接呼叫JspFragment的invoke(Writer out) ,標籤主體向外輸出
			if(test){
				jspBody.invoke(pc.getOut());
			}
		}
		
		public void setJspContext(JspContext pc) {
			this.pc = (PageContext) pc;
		}
	
		public void setJspBody(JspFragment jspBody) {
			this.jspBody = jspBody;
		}
	}

配置檔案

 <tag>
	 	<!-- 配置標籤名稱 -->
	 	<name>if</name>
	 	<!-- 標籤使用的類 -->
	 	<tag-class>cn.itcast.jstl.JstlDemo3</tag-class>
	 	<!-- 配置標籤主體 -->
	 	<body-content>scriptless</body-content>
	 	<!-- 配置屬性 -->
	 	<attribute>
	 		<!-- 配置資料名稱 -->
	 		<name>test</name>
	 		<!-- 屬性是否是必須出現的 -->
	 		<required>true</required>
	 		<!--  支援EL表示式 -->
	 		<rtexprvalue>true</rtexprvalue>
	 		<!-- 屬性的型別 -->
	 		<type>boolean</type>
	 	</attribute>
	 </tag>