EL函式、自定義EL函式、自定義標籤
阿新 • • 發佈:2019-01-14
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>