版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、EL表达式El表达式格式:$sessionScope.user.age:表示为session范围内的user属性的age属性的值或者这样表示:$sessionScope.user“age”,中括号中age代表为user中的属性相当于以下代码 User user2 = (User)session.getAttribute("user"); String age = user2.getAge(); 什么情况下使用来获取属性?当属性的名称包含.符号时,只能用方式去获取这个属性,而不能使用.方式如下所示: User user3 = new User(); user3.setName
2、("zheng");session.setAttribute("com.user", user3);name:$sessionS. /此种情况获取不到name的值 name2: $sessionScope"com.user".name /只能用的方式来获取上面的sessionScope可以省略不写,如果不写的话,将从小范围的域开始查找。既依次request域,session域,Application域,如果找到就直接返回,不在继续下去,如果所有域都找不到该属性,则回传null。EL可以进行自动的类型转换 例如scop
3、e:$param.scope +11 如果param.scope为数字,可以自动转换为两个数的相加隐含对象输入相关的隐含对对象1,param 获取一个 $param.scope 相当于 request.getParameter(“scope”);2,paramValues 获取一组数据,得到是一个数组$paramV 相当于 request.getParameterValues(“name”)其他隐含对象cookie,header,pageContext(重要) PageContext对象,可以获取页面和请求的所有信息 pageContext:$pageContext.req
4、uest.contextPath /获取web应用名称 SessionId :$pageContext.session.id /获取当前session的idrequestUrl :$pageContext.request.requestURL /获取当前页面的路径EL关系运算符(关系运算符必须放在里面,放在外面无效)EL逻辑运算符(逻辑运算符必须放在里面,放在外面无效)EL 的empty运算符<!-empty可以作为一个集合,若该集合不存在或集合中没有元素,其结果都为true,否则为false -> names is Empty: $ empty requestS
5、ListEL ()运算符,代表运算的优先级。EL还有条件运算符。自定义标签自定义标签的开发与应用步骤1,编写完成标签功能的java类(标签处理器)实现SimpleTag接口public class MySimpleTag implements SimpleTag也可以继承SimpleTagSupportpublic class ReadFileTag extends SimpleTagSupport2,编写标签描述文件(tld),在tld文件中对自定义的标签进行描述在WEB-INF文件夹下新建一个tld文件<?xml version="1.0" encoding=&q
6、uot;UTF-8" ?><taglib xmlns=" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation=" version="2.0"> <!- 描速TLD文件 -> <description>MyTag1.0 core library</description> <display-name>MyTag core</display-name> <
7、tlib-version>1.0</tlib-version> <!- 用来在页面上使用标签的前缀 -> <short-name>m</short-name> <!- 作为tld文件的 id,用来唯一标识当前的TLD文件,多个tld文件的id不能重复, 在jsp页面中通过taglib标签的uri属性来引入使用-> <uri> <!- 描述自定义的MySimpleTag标签 -> <tag> <!- 在页面中使用的标签名 -> <name>myTag</name&g
8、t; <!- 标签所在的类路径名 -> <tag-class>com.zheng.tag.MySimpleTag</tag-class> <!- 标签体的类型 -> <body-content> empty </body-content> </tag></taglib> 3,在JSP页面中导入和使用自定义标签导入:<% taglib prefix="m" uri=" %> 使用: <m:myTag/>setJspContext:一定会被JSP引擎
9、所调用,先于doTag方法,把jsp引擎的pageContext传给标签处理器。实现方法如下:private PageContext pageContext;/JSP引擎把pageContext对象引入/pageContext可以获取其他8个隐含对象Overridepublic void setJspContext(JspContext arg0) System.out.println("setJspContext");this.pageContext = (PageContext) arg0;带属性的自定义标签1,先在标签处理器类中定义该属性的setter方法,建议所以属
10、性都设置为String类型。 private String value;private String count;public void setValue(String value) this.value = value;public void setCount(String count) this.count = count;2,在tld文件中描述属性<!- 描述当前标签的属性 -> <attribute> <!- 当前属性的名称 必须和标签处理器中定义的属性名称一致-> <name>value</name> <!- 属性是否
11、可必须 -> <required>true</required> <!- 当前属性是否可以接受运行时表达式的动态值 -> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>count</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute>3,在页
12、面中使用该属性<m:myTag value="$ " count="10"/>带标签体的自定义标签1,有标签体的标签<t:testJspFragment>helloWorld</t:testJspFragment>在自定义标签的标签处理器中使用JspFragment对象封装标签体信息2,jsp引擎会调用setJspBody()方法把JspFragment传递给标签处理器类,在SimpleTagSupport类中还定义了一个getJspBody()方法,用于返回JspFragment对象。3,JspF
13、ragmen中的invoke(writer)方法:invoke(writer):writer即为标签体内容输出的字符流,若为null,则输出到getJspContext().getOut(),即输出到页面上。有时可以借助StringWriter对象来得到标签体的内容。4,在tld文件中,使用<body-content>来描述标签体的类型:类型如下图简单实现forEach标签forEach标签有两个属性,items:集合类型(Collection),var:String类型1,标签处理器类package com.zheng.tag;import java.io.IOException
14、;import java.util.Collection;import javax.servlet.jsp.JspContext;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;public class ForEachTag extends SimpleTagSupport private Collection<?> items; private String var;
15、public void setVar(String var) this.var = var; public void setItems(Collection<?> items) this.items = items; Override public void doTag() throws JspException, IOException /遍历items集合 if(null != items) for(Object obj : items) /*把正在遍历的对象放入到pageContext中,键:var,值:正在遍历的对象*/ JspContext jspContext = th
16、is.getJspContext(); jspContext.setAttribute(var, obj); /把标签体的内容直接输出到页面上。 JspFragment fragMent = this.getJspBody(); fragMent.invoke(null); TLD描述文件<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns=" xmlns:xsi="/2001/XMLSchema-instance" xsi
17、:schemaLocation=" version="2.0"> <description>MyTag2 1.0 core library</description> <display-name>MyTag2 core</display-name> <tlib-version>1.0</tlib-version> <short-name>t</short-name> <uri> <tag> <name>forEach</n
18、ame> <tag-class>com.zheng.tag.ForEachTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>
19、var</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag></taglib> 3,页面上调用<br/> <% List<User> users = new ArrayList<User>(); users.add(new User("zheng1",17); users.add(new User("zheng2&
20、quot;,15); users.add(new User("zheng3",18); users.add(new User("zheng4",19); request.setAttribute("users", users); %> <t:forEach items="$requestScope.users " var="u"> $ - $u.age </t:forEach>带有父标签的自定义标签1,父标签无法获取子标签的引用,仅把子标签作为标签体来使
21、用。2,子标签可以通过getParent()方法来获取父标签的引用(需继承 SimpleTagSupport或实现SimpleTag接口)package com.zheng.tag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;/* * 父标签处理器 * author DELL * */public class ParentTag extends SimpleTagSupportprivate String nam
22、e ="Zheng"public String getName() return name; Override public void doTag() throws JspException, IOException System.out.println("父标签处理器的name :"+name); this.getJspBody().invoke(null); package com.zheng.tag;import java.io.IOException;import javax.servlet.jsp.JspException;import jav
23、ax.servlet.jsp.tagext.JspTag;import javax.servlet.jsp.tagext.SimpleTagSupport;public class SonTag extends SimpleTagSupport Override public void doTag() throws JspException, IOException /1,得到父标签的引用 JspTag parent = this.getParent(); /2,获取父标签的name属性 ParentTag parentTag = (ParentTag) parent; String name
24、 = parentTag.getName(); /3,把name的值输出到页面上 getJspContext().getOut().print("子标签输出name :" +name); 3,注意父标签的类型是JspTag类型,该接口是一个空接口,用来同意SimpleTag 和 Tag的,实际使用的时候需要进行类型的强制转换。4,在tld文件中无需对父标签进行额外的配置<!- 父标签 -> <tag> <name>parentTag</name> <tag-class>com.zheng.tag.ParentTag
25、</tag-class> <!- 因为子标签以标签体存在,所以这里一定要指定为scriptless类型 -> <body-content>scriptless</body-content> </tag> <!- 子标签 -> <tag> <name>sonTag</name> <tag-class>com.zheng.tag.SonTag</tag-class> <body-content>empty</body-content> <
26、/tag>5,在页面上引用 <t:parentTag> <t:sonTag/> </t:parentTag>开发3个标签:choose,when,otherwise其中when标签有一个boolean类型的属性:testchoose是when和otherwise的父标签,when在otherwise前使用。1,Choose标签处理器package com.zheng.tag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.
27、tagext.SimpleTagSupport;public class ChooseTag extends SimpleTagSupport private boolean flag = true; public void setFlag(boolean flag) this.flag = flag; public boolean isFlag() return this.flag; Overridepublic void doTag() throws JspException, IOException getJspBody().invoke(null);When标签处理器package c
28、om.zheng.tag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class WhenTag extends SimpleTagSupportprivate boolean test;public void setTest(boolean test) this.test = test; Overridepublic void doTag() throws JspException, IOExce
29、ption if(test) ChooseTag chooseTag = (ChooseTag) this.getParent(); boolean flag = chooseTag.isFlag(); if(flag) this.getJspBody().invoke(null); chooseTag.setFlag(false); otherwise标签处理器package com.zheng.tag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagex
30、t.SimpleTagSupport;public class OtherwiseTag extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException ChooseTag chooseTag = (ChooseTag) this.getParent(); if(chooseTag.isFlag() this.getJspBody().invoke(null); 2,tld描述文件 <tag> <name>choose</name> <tag-c
31、lass>com.zheng.tag.ChooseTag</tag-class> <body-content>scriptless</body-content> </tag> <tag> <name>when</name> <tag-class>com.zheng.tag.WhenTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>test
32、</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>otherwise</name> <tag-class>com.zheng.tag.OtherwiseTag</tag-class> <body-content>scriptless</body-content> </tag>
33、;3,页面上调用<t:choose> <t:when test="$param.age > 24 ">大学毕业</t:when> <t:when test="$param.age > 18 ">高中毕业</t:when> <t:when test="$param.age > 15 ">初中毕业</t:when> <t:otherwise>初中以下</t:otherwise> </t:choose>E
34、L 的自定义函数的开发步骤1,映射Java类中的静态方法2,这个java类必须带有public符修饰3,方法必须带有public修饰的静态方法public class MyELFunction public static String concat(String str1,String str2) return str1 + str2; 4,在tld文件中描述这个函数,在页面上导入使用即可。<!- 描述EL的自定义函数 -> <function> <!- 函数名 -> <name>concat</name> <!- 函数所在的类
35、路径 -> <function-class>com.zheng.tag.MyELFunction</function-class> <!- 函数的签名 -> <function-signature>java.lang.String concat(java.lang.String,java.lang.String)</function-signature> </function>JSTL标签1,JSTL表达式操作 <c:out>可以对要输出的敏感字符进行自动转换,其有三个属性如下图<c:set>
36、 <c:set var="name" value="zheng" scope="page"></c:set> value的值也可以是个EL表达式,相当于<% pageContext.setAttribute(“name”,”zheng”) %><c:set>为JavaBean的属性赋值<% User user = new User(); request.setAttribute("user", user); %> target:将要存放的JavaBean对
37、象,property:JavaBean中的对象,value:给属性赋值 <c:set target="$user" property="id" value="$ param.id "></c:set> <br/> <c:remove>移除属性中的变量<c:set var="date" value="1997-03-19" scope="session"/> date:$ sessionScope.date <!
38、- 存在属性的值 -> <br/> <!- 移除属性的值 -> <c:remove var="date" scope="session"/> date:-$ sessionScope.date - <!- 值已被移除 ->2,JSTL流程控制<c:if>可以对相应的值进行判断,其属性如下test:EL表达式判断(必须),var:判断后的true或false存放的变量,scope:范围域<c:set value="20" var="age" sc
39、ope="request"></c:set> <!- 如果age大于18 就执行标签体中的内容 -> <c:if test="$ requestScope.age > 18 ">成年了!</c:if> <c:choose>,<c:when>,<c:otherwise><c:choose> <c:when test="$ param.age > 60 ">老年!</c:when> <c:when
40、 test="$ param.age > 30 ">中年!</c:when> <c:when test="$ param.age > 18 ">青年!</c:when> <c:otherwise>未成年!</c:otherwise> </c:choose>3,JSTL 迭代操作<c:forEach>为循环控制,它可以将集合(Collection)中的成员循序浏览一遍,运作方式当条件符合时,就会持续重复执行<c:forEach>的本体内容。其属
41、性描述如下图 <!- begin:从哪开始,end:到那结束,step:间隔 -> <c:forEach begin="1" end="10" step="3" var="i"> $ i - <!- 输出:1 - 4 - 7 - 10 - -></c:forEach><% List<User> users = new ArrayList<User>(); users.add(new User("zheng1",17); users.add(new User("zheng2",18); users.add(new User("zheng3",19); request.setAttribute("users", users); %> <!- items:集合或map或array对象 ,var:每一个实例,varStatus: -> <!-遍历List,遍历数组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东59家数据经纪人试点经验与分类分级管理体系全解析
- 护理三基技能考核课件
- 2026年省级公共海外仓认定申报书编制指南与范文
- 2026年晋城市5691名失能人员享受待遇试点成效与评估标准实施
- 2026年网络安全威胁应对培训
- 2026年社区防火安全知识
- 牛鼻子技术护理技巧分享
- 2025-2026学年贵州省黔西南州兴仁市八年级(上)期末道德与法治试卷(含答案)
- 社区护理护理科研设计与实施培训
- 2026年高考化学二轮复习(全国)微专题04 有限制条件同分异构体的书写(专练)(原卷版)
- 中控证考试题库及答案大全
- GB/T 4326-2025非本征半导体单晶霍尔迁移率和霍尔系数测量方法
- 雨课堂在线学堂《中国传统装饰》作业单元考核答案
- 精神科常见药物不良反应及处理
- 中国21世纪议程管理中心2025年度公开招聘应届毕业生笔试模拟试题参考答案详解
- 制造业生产流程优化及案例分析
- 2025年江苏省档案初级职称考试(档案业务基础知识)历年参考题库含答案详解(5卷)
- 无人机装调检修工基础技能培训手册
- 《创新创业基础 第2版》 课件 第1章 认识创业
- 从雅贼到侦探:劳伦斯·布洛克雅贼系列小说的深度剖析
- 水务新员工培训
评论
0/150
提交评论