EL表达式、JSP标签、JSTL标签、自定义标签

来源:互联网 发布:阿里云os系统 编辑:程序博客网 时间:2024/05/22 19:27

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

<body>    <%--        1)EL输出对象的属性         --%>     <%        //保存数据        Student student = new Student("eric",20);        //放入域中        pageContext.setAttribute("student",student);        //List        List<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);        //Map        Map<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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标签:循环 --%>    <%        //List        List<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);        //Map        Map<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="" : 步长    (每次加几)  ,默认1      items="": 需要遍历的数据(集合)       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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

自定义标签

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

/** * 标签处理器类 * @author APPle * 1)继承SimpleTagSupport * */public class ShowIpTag extends SimpleTagSupport{    private JspContext context;    /**     * 传入pageContext     */    @Override    public void setJspContext(JspContext pc) {        this.context = pc;    }    /**     * 2)覆盖doTag方法     */    @Override    public 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);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

2 在web项目的WEB-INF目录下建立xxx.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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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代码,但不会执行。
0 0