EL表达式

jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>。
以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。

使用EL表达式替换掉jsp表达式

EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!

语法: ${变量或表达式}

EL语法

1 输出基本数据类型变量
从四个域获取

${name}

指定域获取

    ${pageScope.name}

域范围: pageScoep / requestScope / sessionScope / applicationScope

 <body><%String name = "rose";  //放入域中//pageContext.setAttribute("name",name);pageContext.setAttribute("name",name,PageContext.REQUEST_SCOPE); %><%=name %><br/><%--1)从四个域自动搜索--%>EL表达式: ${name }<%--${name } 等价于<%=pageContext.findAttribute("name")%>--%><%--2) 从指定的域中获取数据--%>EL表达式: ${pageScope.name }<%--${pageScope.name } 等价于<%= pageContext.getAttribute("name",PageContext.PAGE_SCOPE)%>--%></body>

2 输出对象的属性值
3 输出集合对象 List 和Map

<body><%--1)EL输出对象的属性    --%><%//保存数据Student student = new Student("eric",20);//放入域中pageContext.setAttribute("student",student);//ListList<Student>  list = new ArrayList<Student>();list.add(new Student("rose",18));list.add(new Student("jack",28));list.add(new Student("lucy",38));//放入域中pageContext.setAttribute("list",list);//MapMap<String,Student> map = new HashMap<String,Student>();map.put("100",new Student("mark",20));map.put("101",new Student("maxwell",30));map.put("102",new Student("narci",40));//放入域中pageContext.setAttribute("map",map);    %>  <%--使用EL获取对象 --%>${student.name} - ${student.age }<%--${student.name} 等价于     (点相对于调用getXX()方法)<%=((Student)pageContext.findAttribute("student")).getName()%>--%>     <hr/><%--使用EL获取List对象 --%>${list[0].name } - ${list[0].age }<br/>${list[1].name } - ${list[1].age }<br/>${list[2].name } - ${list[2].age }<%--list[0]等价于       (中括号相对于调用get(参数)方法)((List)pageContext.findAttribute("list")).get(0)--%><hr/><%--使用EL获取Map对象 --%>${map['100'].name } -  ${map['100'].age }<br/>${map['101'].name } -  ${map['101'].age }<br/>${map['102'].name } -  ${map['102'].age }<br/></body>

4 EL表达式计算

 <body><%--1)算术表达式+  -  *  /--%>${10+5 }<br/>${10*5 }<hr/><%--2)比较运算>  <  >=  <=  ==   !=--%>${10>5 }<br/>${10<5 }<br/>${10!=10 }<hr/><%--3)逻辑运算&&  ||  !--%>${true && false }<br/>${true || false }<br/>${!false }<br/><hr/><%--4)判空null 或 空字符串:  empty--%><%//String name = "eric";//String name = null;String name = "";pageContext.setAttribute("name",name);%>判断null: ${name==null }<br/>判断空字符: ${name=="" }<br/>判空:  ${name==null || name=="" }另一种判空写法: ${empty name }     </body>

jsp标签

jsp标签作用:替换jsp脚本。

1)流程判断(if   for循环)
2)跳转页面(转发,重定向)
3)。。。。。

Jsp标签分类

1)内置标签(动作标签): 不需要在jsp页面导入标签
2)jstl标签: 需要在jsp页面中导入标签
3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签

动作标签

转发标签:  <jsp:forward />
参数标签:  <jsp:pararm/>
包含标签:  <jsp:include/>

原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。(先翻译再合并),动态包含

静态包含 vs 动态包含的区别:

1) 语法不同
静态包含语法: <%@inclue file="被包含的页面"%>
动态包含语法: <jsp:include page="被包含的页面">2)参数传递不同
静态包含不能向被包含页面传递参数
动态包含可以向被包含页面传递参数3)原理不同
静态包含: 先合并再翻译
动态包含: 先翻译再合并
  <body><%--转发 --%><% //request.getRequestDispatcher("/09.action2.jsp?name=eric").forward(request,response);%><%-- 参数 --%><%--<jsp:forward page="/09.action2.jsp"><jsp:param value="jacky" name="name"/><jsp:param value="123456" name="password"/></jsp:forward>--%><%--包含 --%><%--<jsp:include page="/common/header.jsp"><jsp:param value="lucy" name="name"/></jsp:include>--%><%@include file="common/header.jsp" %>主页的内容</body>

JSTL标签

JSTL (全名:java standard tag libarary - java标准标签库 )

核心标签库 (c标签库) 天天用
国际化标签(fmt标签库)
EL函数库(fn函数库)
xml标签库(x标签库)
sql标签库(sql标签库)

使用JSTL标签步骤

1) 导入jstl支持的jar包(标签背后隐藏的java代码)注意:使用javaee5.0的项目自动导入jstl支持jar包
2)使用taglib指令导入标签库 <%@taglib uri="tld文件的uri名称" prefix="简写" %>
3)在jsp中使用标签

核心标签库的重点标签:

保存数据:<c:set></c:set>
获取数据: <c:out value=""></c:out>
单条件判断<c:if test=""></c:if>
多条件判断<c:choose></c:choose><c:when test=""></c:when><c:otherwise></c:otherwise>
循环数据<c:forEach></c:forEach><c:forTokens items="" delims=""></c:forTokens>
重定向<c:redirect></c:redirect>
<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>
<%--导入标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head> <title>核心标签库</title>  </head><body><%--使用标签 --%><%--set标签 :保存数据(保存到域中)默认保存到page域 --%><c:set var="name" value="rose" scope="request"></c:set><%String msg = null;pageContext.setAttribute("msg",msg);%>${msg }<br/><%--out标签: 获取数据(从域中) default: 当value值为null时,使用默认值escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)--%><c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out><hr/><%--if标签 :单条件判断--%><c:if test="${!empty msg}">条件成立</c:if><hr/><%--choose标签+when标签+otherwirse标签: 多条件判断 --%><c:set var="score" value="56"></c:set><c:choose><c:when test="${score>=90 && score<=100}">优秀</c:when><c:when test="${score>=80 && score<90}">良好</c:when><c:when test="${score>=70 && score<80}">一般</c:when><c:when test="${score>=60 && score<70}">及格</c:when><c:otherwise>不及格</c:otherwise></c:choose><%-- forEach标签:循环 --%><%//ListList<Student>  list = new ArrayList<Student>();list.add(new Student("rose",18));list.add(new Student("jack",28));list.add(new Student("lucy",38));//放入域中pageContext.setAttribute("list",list);//MapMap<String,Student> map = new HashMap<String,Student>();map.put("100",new Student("mark",20));map.put("101",new Student("maxwell",30));map.put("102",new Student("narci",40));//放入域中pageContext.setAttribute("map",map);%><hr/><%--begin="" : 从哪个元素开始遍历,从0开始.默认从0开始end="":     到哪个元素结束。默认到最后一个元素step="" : 步长    (每次加几)  ,默认1items="": 需要遍历的数据(集合) var="": 每个元素的名称 varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)--%><c:forEach items="${list}" var="student" varStatus="varSta">序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/></c:forEach><hr/><c:forEach items="${map}" var="entry">${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/></c:forEach><hr/><%-- forToken标签: 循环特殊字符串 --%><%String str = "java-php-net-平面";pageContext.setAttribute("str",str);%><c:forTokens items="${str}" delims="-" var="s">${s }<br/></c:forTokens><%--redrict:重定向 --%><c:redirect url="http://www.baidu.com"></c:redirect></body>

自定义标签

1 编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类

/*** 标签处理器类* @author APPle* 1)继承SimpleTagSupport**/
public class ShowIpTag extends SimpleTagSupport{private JspContext context;/*** 传入pageContext*/@Overridepublic void setJspContext(JspContext pc) {this.context = pc;}/*** 2)覆盖doTag方法*/@Overridepublic void doTag() throws JspException, IOException {//向浏览器输出客户的ip地址PageContext pageContext = (PageContext)context;HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();String ip = request.getRemoteHost();JspWriter out = pageContext.getOut();out.write("使用自定义标签输出客户的IP地址:"+ip);}
}

2 在web项目的WEB-INF目录下建立itcast.tld文件,这个tld叫标签库的声明文件。(参考核心标签库的tld文件)

<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><!-- 标签库的版本 --><tlib-version>1.1</tlib-version><!-- 标签库前缀 --><short-name>itcast</short-name><!-- tld文件的唯一标记 --><uri>http://gz.itcast.cn</uri><!-- 一个标签的声明 --><tag><!-- 标签名称 --><name>showIp</name><!-- 标签处理器类的全名 --><tag-class>gz.itcast.a_tag.ShowIpTag</tag-class><!-- 输出标签体内容格式 --><body-content>scriptless</body-content></tag></taglib>

3 在jsp页面的头部导入自定义标签库

<%@taglib uri="http://gz.itcast.cn" prefix="itcast"%>

4 在jsp中使用自定义标签

<itcast:showIp></itcast:showIp>

执行过程

问题: http://localhost:8080/day14/01.hellotag.jsp 如何访问到自定义标签?

前提: tomcat服务器启动时,加载到每个web应用,加载每个web应用的WEB-INF目录下的所有文件!!!例如。web.xml, tld文件!!!

1)访问01.hellotag.jsp资源
2)tomcat服务器把jsp文件翻译成java源文件->编译class->构造类对象->调用_jspService()方法
3)检查jsp文件的taglib指令,是否存在一个名为http://gz.itcast.cn的tld文件。如果没有,则报错
4)上一步已经读到itcast.tld文件
5)读到<itcast:showIp> 到itcast.tld文件中查询是否存在<name>为showIp的<tag>标签
6)找到对应的<tag>标签,则读到<tag-class>内容
7)得到 gz.itcast.a_tag.ShowIpTag构造ShowIpTag对象,然后调用ShowIpTag里面的方法

自定义标签处理器类的生命周期

SimpleTag接口:

void setJspContext(JspContext pc)  --设置pageContext对象,传入pageContext(一定调用)通过getJspCotext()方法得到pageContext对象void setParent(JspTag parent)  --设置父标签对象,传入父标签对象,如果没有父标签,则不调用此方法。通过getParent()方法得到父标签对象。
void setXXX(值)  --设置属性值。
void setJspBody(JspFragment jspBody) --设置标签体内容。标签体内容封装到JspFragment对象中,然后传入JspFragment对象。通过getJspBody()方法得到标签体内容。如果没有标签体内容,则不会调用此方法
void doTag()  --执行标签时调用的方法。(一定调用)

自定义标签的作用:

控制是否输出标签体内容

输出: this.getJspBody().invoke(null)
不输出:  不调用invoke(null)方法

控制标签余下内容是否输出

输出: 什么不都做!
不输出: 抛出SkipPageException异常

重复输出标签体内容

重复调用: this.getJspBody().invoke(null)

修改标签体内容

StringWriter sw = new StringWriter();
this.getJspBody().invoke(sw);
String content = sw.toString();
//修改内容
//手动输出到浏览器
this.getJspContext().getOut().writer(修改过的内容);

带属性的标签

a)在标签处理器类中声明成员变量和setter方法,用于给属性变量赋值。
b)在tld文件中声明属性
c)使用属性

输出标签体内容格式

JSP:   在传统标签中使用的。可以写和执行jsp的java代码。
scriptless:  标签体不可以写jsp的java代码
empty:    必须是空标签。
tagdependent : 标签体内容可以写jsp的java代码,但不会执行。

18、EL表达式、JSP标签、JSTL标签、自定义标签相关推荐

  1. 11、Jsp加强/EL表达式/jsp标签

    1 Jsp基础回顾 Jsp基础 1)Jsp的执行过程 tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法 to ...

  2. Java-Web JSTL标签库、自定义标签库和MVC设计模式

    目录 一.JSTL标签库 1.什么是JSTL 2.JSTL标签库 3.使用taglib指令导入标签库 4.core标签库常用标签 (1)out和set (2)remove (3)url (4)if ( ...

  3. Java第四十八天,Jsp之Taglib,自定义标签详解

    理论知识 一.标签的本质是什么 自定义标签实际上是一个实现了特定接口的Java类,它封装了一些常用功能,在运行时被相应的代码所替换:它与 JavaBean 的最大区别就是 JavaBean 没有默认的 ...

  4. java web 自定义标签_JavaWeb学习——自定义标签

    自定义标签 一.自定义标签概述 使用标准JSP访问.操作JavaBean,是实现展现(HTML)与业务实现(Java代码)分离的第一步.然而,标准方法功能不够强大,以至于开发者无法仅仅使用它们开发应用 ...

  5. java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...

    EL的不足,由JSTL来加强  -> 自定义标签来实现. 1:自定义标签 1:自定义标签也是类. 2:让用户在JSP页面使用,不引用Java代码的情况下,调用Java代码. 2:标签开的类的继承 ...

  6. 【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签

    前面四篇文章都是分析 Bean 默认标签的解析过程,包括基本属性.六个子元素(meta.lookup-method.replaced-method.constructor-arg.property.q ...

  7. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签.  jsp标签的分 ...

  8. jsp的jstl的foreach标签

    jsp支持丰富的jstl标签语言(需要jar包支持),其中list循环(迭代)用的是<c:forEach></c:forEach>标签. 这个标签的作用就是迭代输出标签内部的内 ...

  9. 通过servlet.jsp.tagext.TagSupport的自定义标签实现按钮权限控制

    2019独角兽企业重金招聘Python工程师标准>>> 第一步:定义标签格式 如下图先在安全目录下建立一个tld文件 内容代码如下 <?xml version="1. ...

  10. jsp中用java写标签id_jsp中自定义标签用法实例分析

    本文实例讲述了jsp中自定义标签用法.分享给大家供大家参考.具体如下: 这里简单的写了一个自定义标签,自己定义标签的好处就是在jsp页面中可以使用自己定义的功能,完全与Java代码分离 1. tld文 ...

最新文章

  1. EMC开发实习生电面经验
  2. 2021年人工神经网络第四次作业-第五题:危险品识别
  3. python字符串截取split-python实现字符串完美拆分split()的方法
  4. xdocument查找节点值_二叉查找树(java)
  5. java jquery_jQuery数据表和Java集成
  6. 上传本地项目到gitee_用git上传本地文件到码云gitee的方法
  7. c# 整数除法取整_Java 如何取整整数除法的结果?
  8. IPMP 认证考试知识点
  9. shell - 查看天气
  10. cookies时效由谁决定_胎儿的性别,是什么时候定下来的,又是由谁决定的?
  11. linux下oracle安装教程
  12. LaTex的图文安装--TexLife+SumtraPDF+WinEdt
  13. android bugly 错误分析,Android使用bugly捕捉异常
  14. 普通运维人员真的就是秋后的蚂蚱吗?
  15. unity3d简单的粒子特效
  16. 杨超越杯编程大赛,参赛作品过100个,工程师评论:杨超越是谁?
  17. Python数据库(MySQL、MongoDB、Redis)编程
  18. C语言 static 声明静态变量?大佬原来用它干这事!
  19. 2022广东省安全员A证第三批(主要负责人)试题及模拟考试
  20. 希望计算机专业都知道这些优质比赛

热门文章

  1. RARP的定义及工作原理
  2. resize函数详解
  3. 软件不是艺术品(原创)
  4. 思科路由器高危漏洞可导致攻击者完全访问小企业网络
  5. 微信小程序与后台PHP交互
  6. nova-rootwrap笔记
  7. AP设备漫游阈值设置
  8. 动态规划法的基本知识
  9. CloudSim仿真流程
  10. nuxt3中四种请求API的方法