基本用法如下:
<%
//分别在4个域对象中存储数据
pageContext.setAttribute("name1", "唐僧");
session.setAttribute("name2", "猪八戒");
application.setAttribute("name3", "孙悟空");
request.setAttribute("name4", "哆啦A梦");
%>
name1=${name1}
name2=${name2}
name3${name3}
name4${name4}
演示使用er表达式:支持对象的导航
<%
User user=new User();
user.setUsername("哆啦A梦");
user.setAge(14);
Friend f=new Friend();
f.setName("大雄");
Cat[] ct=new Cat[2];
ct[0]=new Cat("胖虎","黑色");
ct[1]=new Cat("小夫","绿色");
f.setCats(ct);
user.setFriend(f);
session.setAttribute("user", user);
%>
//注意,这样的方式获取的值,相对应的属性必须提供get方法。
获取"哆啦A梦"的名字:${user.username}
或者这样获取:${user["username"]}
获取"年龄":${user["age"] }
获取哆啦A梦朋友的名字:${user.friend.name }
或者这样获取:${user["friend"]["name"] }
获取朋友的第一只猫:${user.friend.cats[0].name }
或者这样获取:${user["friend"]["cats"][0]["name"]}
ER表达式对运算符的支持:
3+4=${3+4 }
5*9=${5*9 }
6/4=${6/4 }
5/3=${5/3 }
<% session.setAttribute("n", 10); %>
n+5=${n+5 }
n/10=${n/10 }
对一元运算符号的支持:${-n }
对比较运算符的支持:${n>10 }||${n==10 }||${n gt 9 }||${n eq 11 }
对逻辑运算符的支持:${n>5 && n<10 }||${n>5 || n<10 }
对善缘运算符的支持:${n>5?"真的":"假的" }
<%
pageContext.setAttribute("gdy", null);
List list=new ArrayList();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
pageContext.setAttribute("list", list);
%>
对empty(是否为null)运算符的支持:${empty gdy }||${not empty gdy }
获取集合中的全部数据${list}
获取集合中的第一个数据${list[0]}
EL表达式 | 表示类型 | 备注 | 对应的jsp内置对象 |
pageContext | javax.servlet.jsp.PageContext | 和jsp的内置对象完全一样 | pageContext |
requestScope | java.util.Map |
代表者ServletRequest中的那个Map | 没有 |
pageScope | java.util.Map |
代表者PageContext中的那个Map | 没有 |
sessionScope | java.util.Map |
代表者HttpSession中的那个Map | 没有 |
applicationScope | java.util.Map |
代表者ServletContext中的那个Map | 没有 |
param | java.util.Map |
代表一个请求参数 | 没有 |
paramValues | java.util.Map |
代表重命名的请求参数 | 没有 |
header | java.util.Map |
代表一个请求消息头 | 没有 |
headerValues | java.util.Map |
代表重命名的请求消息头 | 没有 |
initParam | java.util.Map |
代表web.xml中配置文件的全局参数 | 没有 |
cookie | java.util.Map |
获取cookie值的key,是cookie的name,Value是cokie对象本身 | 没有 |
param可以直接获取客户端传递过来的值。
例如:
JER03.jsp通过param获取传递过来的值代码为:
preage获取姓名为:${param.username }
用法如下:
<% request.setCharacterEncoding("UTF-8"); %>
JER03.jsp中通过paramValues获取方法为:
<% request.setCharacterEncoding("UTF-8"); %>
preage获取姓名为:${param.username }||${param["username"] }
el表达式获取表单中同名控件的数据:${paramValues.username[0] }||${paramValues.username[1] }
【EL表达式-----自定义函数】
自定义函数类代码为:
package com.gdy.jjsp;
public class JSELFunction {
/**
* 将字符串转换为大写
* @param str
* @return
*/
public static String upper(String str){
return str.toUpperCase();
}
}
在.tld文件引入上面自定义类的代码为:
描述,注释
gdfunn
1.1
gdyfun
com.gdy.function
upper
com.gdy.jjsp.JSELFunction
java.lang.String upper(java.lang.String)
在页面中引入在tld文件中定义的类的代码为:
<%@ taglib uri="com.gdy.function" prefix="fun" %>
在jsp页面中调用的代码为:
EL表达式自定义函数${fun:upper("abcD") }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="com.gdy.function" prefix="fun" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
EL表达式
EL表达式自定义函数${fun:upper("abcD") }
1.在页面${fun:upper("abcD")}表达式中fun是由taglib引入tld的类时后面prefix字段的值决定的,名字可以在引入时自己随便修改。
2.在taglib引入表达式中uri=“com.gdy.function”的值是在tld文件中
3.在tld文件中
代码中的
在
由于EL表达式不支持字符串的任何运算,所以在EL表达式中使用自定义函数来解决
自定义标签简介
自定义标签主要用于移除Jsp页面中的java代码。
使用自定义标签移除jsp页面中的java代码,只需要完成以下两步骤
1.编写一个狮蝎Tag接口的java类型(标签接口处理器)。
2.编写标签库描述符(tld)文件,在tld文件中吧标签处理器进行描述。
【EL表达式-----自定义标签】
功能:使用自己定义的标签:
例如要实现使用自己定义的标签来打印出当前时间
自定义的标签为:
注意:在定义自定义标签处理类,类必须要继承SimpleTag接口。或者继承实现了SimpleTag接口的类,当页面匹配到自定义标签后,会执行自定义处理类的toTag()方法。
自定义处理类代码为:
package com.gdy.jjsp;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 演示自定义标签 打印当前时间
* @author Administrator
* 执行原理:
* SimpleTag接口中的方法;
* Void doTag();由服务器调用。在JSP中遇到标签时调用。
* JspTag getParent();由程序员调用。获取该标签的父标签对象。没有返回null
*
* 以下三个方法的共同特点:由服务器调用,在调用doTag之前就调用完了。
* void setJspBody(JspFragment jspBody):由服务器调用。传入标签的内容。
* void setJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象
* void setParent(JspTag parert):由服务器调用。传入你的父类,没父类的传入null;
*
*/
public class JERSimpleTag extends SimpleTagSupport{
/**
* doTag()方法容器会自动调用
* 当jsp文件解析遇见自定义标签后,找到对应的类,会自动调用doTage方法
* 在执行doTage方法之前,jsp引擎先调用了getPageContext方法,所以在该对象中可以直接使用getJSPContext()方法
*
*/
@Override
public void doTag() throws JspException, IOException {
//获取当前时间
Date dt=new Date();
//获取pageContext对象
//在执行doTage方法之前,jsp引擎先调用了getPageContext方法,所以在该对象中可以直接使用getJSPContext()方法
PageContext pagecontext=(PageContext)getJspContext();
//获取输出流对象
JspWriter out = pagecontext.getOut();
//向页面输出
out.write(dt.toLocaleString());
}
}
后缀为tld文件的定义关联方法为:
1.0
1.2
mygettime
com.gdy.gettime
showTime
com.gdy.jjsp.JERSimpleTag
empty
页面jsp引入代码为:
<%@ taglib uri="com.gdy.gettime" prefix="my" %>
jsp页面全部代码为:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="com.gdy.function" prefix="fun" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="gdy" %>
<%@ taglib uri="com.gdy.gettime" prefix="my" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
EL表达式
EL表达式自定义函数${fun:upper("abcD") }
${gdy:toUpperCase("aaaaa") }
El表达式之自定义标签
自定义标签:|
自定义标签执行原理
SimpleTag接口中的方法:
void doTag():由服务器调用。在JSP中遇到标签时调用。
JspTaggetParent():由程序员调用。获取该标签的父标签对象。没有返回null
以下三个方法的共同特点:由服务器调用,在调用doTag之前就调完了。
voidsetJspBody(JspFragment jspBody):由服务器调用。传入标签的内容。
voidsetJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象
voidsetParent(JspTag parent):由服务器调用。传入你的爹。没爹传入null
自定义标签的详细功能(基本功)
1.控制页面中某部分内容不显示
2.控制结束标签后的JSP内容不执行
3.控制主体内容重复执行:带属性的标签开发
4.获取标签主体内容,改变后再输出
示例1:控制页面中某部分内容不显示
类的后台代码为:package com.gdy.jjsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 自定义类,演示隐藏内容
* @author Administrator
*
*/
public class JERSimpleTag02 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
}
}
tld文件绑定方法为:
Hide
com.gdy.jjsp.JERSimpleTag02
tagdependent
<%@ taglib uri="com.gdy.gettime" prefix="my" %>
演示ER表达式 自定义标签隐藏内容
哈哈,隐藏内容在这你看不到我
页面显示效果为:
示例2:控制结束标签后的JSP内容不执行
java类代码为:
package com.gdy.jjsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 控制结束标签后的内容不显示
* @author Administrator
*
*/
public class JERSimpleTag03 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//拿到标签中的主题内容
JspFragment body = getJspBody();
// //第一种方法
// //拿到pageContext对象
// PageContext page=(PageContext)body.getJspContext();
// //拿到输出流对象
// JspWriter out=page.getOut();
// //输出主体内容
// body.invoke(out);
//第二张方法
body.invoke(null);
//跑出自定义异常
throw new SkipPageException();
}
}
HideEnd
com.gdy.jjsp.JERSimpleTag03
tagdependent
jsp页面相关代码为:
<%@ taglib uri="com.gdy.gettime" prefix="my" %>
演示ER表达式 自定义标签隐藏内容
哈哈,隐藏内容在这你看不到我
控制结束标签后的JSP内容不执行
结束标签后的内容不执行【标签里面内容】 【标签后面内容】
显示结果为:
示例3 控制主题的部分内容重复执行
java类代码为:
package com.gdy.jjsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class JERSimpleTag04 extends SimpleTagSupport {
//定义属性,方便自动接收页面传递过来的值
private int num;
//必须提供set方法,这样系统才能自动接收值
public void setNum(int num) {
this.num = num;
}
@Override
public void doTag() throws JspException, IOException {
for(int i=0;i
HideCopy
com.gdy.jjsp.JERSimpleTag04
scriptless
num
true
true
jsp页面调用代码为:
控制标签的主体内容重复执行
我要循环---------
示例4:获取主体内容,改变后输出
java处理类代码为:
package com.gdy.jjsp;
import java.io.IOException;
import java.io.StringWriter;
import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/*
* 演示控制标签的主体内容改变后输出
*/
public class JERSimpleTag05 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//获取主体内容
JspFragment body = getJspBody();
//我们先把数据写入到一个缓冲流中,然后从缓冲流中取出数据进行修改,修改的数据再写入缓冲流中
//创建一个字符串输出缓冲流,可以从中获取数据
StringWriter sw=new StringWriter();
//将数据写入缓冲流中
body.invoke(sw);
//从缓冲流中拿到数据
String str=sw.toString();
//改变数据
str=str.toUpperCase()+"我已经改变";
//获取输出流对象输出到页面
getJspContext().getOut().write(str);
}
}
HideTH
com.gdy.jjsp.JERSimpleTag05
tagdependent
<%@ taglib uri="com.gdy.gettime" prefix="my" %>
获取标签的主体内容,改变后再输出
获取标签的主体内容改变后再输出:我是主体内容aaabbbccc
web显示结果为:
jsp页面代码为:
<%@ taglib uri="com.gdy.gettime" prefix="my" %>
控制标签的主体内容是否输出(if else 语句功能)
真的
假的
真的
假的
1.0
1.2
mygettime
com.gdy.gettime
choose
com.gdy.jjsp.JERChoose
scriptless
when
com.gdy.jjsp.JERWhen
scriptless
test
true
true
otherwise
com.gdy.jjsp.JEROtherwise
scriptless
com.gdy.jjsp.JERChoose内代码为:
package com.gdy.jjsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 模拟执行if else功能
* @author Administrator
*
*/
public class JERChoose extends SimpleTagSupport{
private boolean flag=true;//通过该变量控制是否执行else部分
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
getJspBody().invoke(null);
}
}
com.gdy.jjsp.JERWhen类代码为:
package com.gdy.jjsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class JERWhen extends SimpleTagSupport{
private boolean test;
public void setTest(boolean test){
this.test=test;
}
@Override
public void doTag() throws JspException, IOException {
if(test){
//条件为真:执行主体内容 ,修改父标签中的变量的值
getJspBody().invoke(null);
//获取父标签
JERChoose choose=(JERChoose)getParent();
//修改父标签中的值
choose.setFlag(false);
}
}
}
com.gdy.jjsp.JEROtherwise类代码为:
package com.gdy.jjsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class JEROtherwise extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//获取父标签
JERChoose choose=(JERChoose)getParent();
if(choose.isFlag()){
getJspBody().invoke(null);
}
}
}