40 EL和JSTL核心技术

207 阅读2分钟

1 EL表达式

EL表达式提供了在JSP中简化表达式的方法,可以方便地访问各种数据并输出,主要功能是:

  • 依次访问pageContext、request、session和appliction作用域对象存储的数据
  • 获取请求参数
  • 访问Bean对象的属性
  • 访问集合中的数据
  • 输出简单的运算结果

1.1 访问内置对象的数据

传统访问方式的语法是:<%= request.getAttribute("varName")%>

使用EL表达式是:${varName}

1.2 访问请求参数的数据

传统方式访问请求参数的数据需要使用:request.getParameter(name)或者request.getParameterValue(name)

使用EL表达式访问请求参数需要使用:param 接受的参数只有一个值 paramValues 接受的参数有多个值

${param.name}
${paramValues.hobby[0]}

1.3 访问Bean对象的属性

在EL表达式中访问Bean对象的方式有两种:

  • 对象名.属性名,例如{对象名.属性名},例如{user.name}
  • 对象名["属性名"],例如{对象名["属性名"]},例如{user["name"]}

这两种方式的区别是:当要存取的属性名中包含一些特殊的字符,如:.或,等非字幕的或数字的符号,就一定要使用[]方式而不是.的方式

除此之外,使用[]方式还可以动态的取值,具体如下:

<%
	request.setAttribute("prop","age");
%>
<!--相当于在表达式中写一个变量 -->
${user[prop]}

1.4 访问集合中的数据

<!-- student为ArrayList类型的对象 -->
${student[0].name}

1.5 EL表达式中常用的内置对象

类别标识符描述
JSPpageContextpageContext处理当前页面
作用域pageScope同页面作用域属性名称和值有关的Map类
requestSCope同请求作用域属性名称和值有关的Map类
sessionScope同会话作用域属性名称和值有关的Map类
applicationScope同程序作用域属性名称和值有关的Map类
请求参数param根据名称存储请求参数的值的Map类
paramValue把请求参数的所有值作为一个String数组来存储的Map类
请求头header根据名称存储请求头主要值的Map类
headerValue把请求头的所有值作为一个String数组类存储的Map类
Cookiecookie根据名称存储请求附带的Cookie的Map类
初始化参数initParam根据名称存储Web应用程序上下文初始化参数的Map类

1.6 常用的运算符

常用的算术运算符有:+加、-减、*乘、div或/除以及%或mod取余,和java中的算术运算符是一样的

常用的关系运算符有:==等于、!=不等于、<小于、>大于、<=小于等于以及>=大于等于

常用的逻辑运算符有:&&与运算、||或运算以及!非运算

条件运算符是:${条件表达式 ? 语句1 : 语句2},类似于java中的三目运算符

验证运算符:${empty 表达式}返回布尔值,判读表达式是否为空值或者null、无元素的集合或者数组,以及长度为0的字符串

2 JSTL标签

JSTL是JSP辨准标签库,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性、降低程序的维护难度。

使用JSTL之前需要导入JSTL的jar包,并且在JSP页面使用taglib指定引入jstl标签库,具体代码如下:

<% taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

下面会介绍JSTL中常用的标签:

输出标签

<c:out></c:out> 将指定的内容输出

设置标签

<c:set></c:set> 设置标属性范围值

删除标签

<c:remove></c:remove>删除指定数据

单条件判断标签

<c:if test="EL条件表达式">
  满足条件执行
</c:if>

多条件判断标签

<c:chose>
  <c:when test="EL条件表达式">
    满足条件执行
  </c:when>
  ···
  <c:otherwise>
    不满足上面所有条件后执行
  </c:otherwise>
</c:chose>

循环标签

<c:forEach var="循环变量" items="集合">
  ...
</c:forEach>

常用的函数标签

<% taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 导入函数标签

常用的格式化标签

<% taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 导入函数标签

当然除了上面的标签外,我们也可以自定义标签,步骤如下:

  • 编写标签类继承SimpleTagSupport类或TagSupport类并重写doTag方法或doStartTag方法

    public class HelloTag extends SimpleTagSupport{
      private String name;
      public String getName(){
        return name;
      }
      public void setName(String s){
        name=s;
      }
      @Override
      public void doTag() throws JspEXception,IOException{
        JspWriter out=this.getJspContext().getOut();
        out.println("自定义标签的参数为:"+name);
      }
    }
    
  • 定义标签库文件并配置标签说明文件到WEB-INF下

    <tag>
      <name>helloTag</name>
      <tag-class>com.bjx.HelloTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
        <name>name</name>
        <required>true</required>
      </attribute>
    </tag>
    
  • 在JSP中添加taglib指令引入标签库使用

    <% taglib prefix="hello" uri="http://bjx.com" %>