el+jstl

1. EL 全名为Expression Language。它是一种数据访问语言

el 表达式

2. EL 能实现如下功能:

1) 使用变量访问web域中存储的对象${user }

2) 访问javabean的属性 ${user.address.city }

3) 执行基本的逻辑运算

4) 直接使用隐式对象

5) 调用 el 函数

3. el 表达式用在哪里

1) 在 jsp 页面直接输出数据

2) 在标签中使用el直接为属性赋值

 

4. el 表达式获取数据

jsp页面使用el表达式可以轻松地获得web域中的对象

并对 javabean 、 数组、 list 、 map 进行取值

 

5. 需要对 web 域中的 list map 集合进行迭代就需要结合 jstl 迭代标签

 

 

EL变量

${user}表示在某一范围中找出名为user的变量,

查找范围为:pagerequestsesionapplication,从小到大依次查找,直到找到为止,找不到则返回null

也可指定在某一范围内查找:${sessionScope.user}

范围名称: 四个对象都是EL的隐含对象。

范围

EL中的名称

page

pageScope

request

requestScope

session

sessionScope

application

applicationScope

 

 

自动转换类型

EL表达式可实现数据类型的自动转换,只要是可相互转换的类型,如:数值型转换为字符串,字符串转换为数值型,如果结果为null,则什么都不显示,如果转换出错,则报错。

 

EL隐含对象

EL共有11个隐含对象(Implicit Object):

隐含对象

类型

说明

pageContext

javax.servlet.ServletContext

对应于JSP页面中的pageContext

pageScope

java.util.Map

代表page域中用于保存属性的Map对象

requestScope

java.util.Map

代表request域中用于保存属性的Map对象

sessionScope

java.util.Map

代表session域中用于保存属性的Map对象

applicationScope

java.util.Map

代表application域中用于保存属性的Map对象

param

java.util.Map

request.getParameter(),返回String

paramValues

java.util.Map

request.getParameterValues(),返回String[]

header

java.util.Map

request.getHeader(),返回String

headerValues

java.util.Map

request.getHeaders(),返回String[]

cookie

java.util.Map

request.getCookies()

initParam

java.util.Map

ServletContext.getInitParameter(),返回String

 

范围隐含对象:pageScoperequestScopesessionScopeapplicationScope,在这四个范围隐含对象中,只能取出属性值(Attribute),即:.getAttribute()方法的功能,不能取得其他信息。

 

隐式对象的具体用途

1. pageContext  

获得servlet上下文路径 (web应用名称)

${pageContext.request.contextPath }

2. pageScoperequestScopesessionScopeapplicationScope

准确地获得四个域中的对象,用于取值

3. paramparamValues

获得请求参数,一般用于做表单的回显

4. headerheaderValues

获得请求消息头

5. cookie 

获得浏览器发送的cookie

Cookie也是map集合,keycookiename value是对应的cookie对象

6. initParam

获得web 初始化参数

el表达式语法

注意:如果jsp页面中不能使用el表达式,那么在jsp的页面指令中加入isELIgnored="false"就可以显示了。

EL 表达式的格式是这样的:用美元符号($)定界,内容包括在花括号({})中,例如:

${user.username}

上面这句EL代码的意思是,在四个Attribute scope范围中依次去找寻key为user的对象,并且调用此对象的firstName属性值,这句EL按照原来的脚本元素编写,你会发觉代码量一定会增加很多,其实就是因为这个原因,所以开发人员喜欢上了EL表达式。 下面列出了11 个 EL 隐式对象的标识符, 不要将这些对象与JSP 9个对象混淆,其中只有一个对象是它们所共有的。

类别

标识符

描述

JSP

pageContext

PageContext 实例对应于当前页面的处理

作用域

pageScope

与页面作用域属性的名称和值相关联的 Map 类

requestScope

与请求作用域属性的名称和值相关联的 Map 类

sessionScope

与会话作用域属性的名称和值相关联的 Map 类

applicationScope

与应用程序作用域属性的名称和值相关联的 Map 类

请求参数

param

按名称存储请求参数的主要值的 Map 类

paramValues

将请求参数的所有值作为 String 数组存储的 Map 类

请求头

header

按名称存储请求头主要值的 Map 类

headerValues

将请求头的所有值作为 String 数组存储的 Map 类

Cookie

cookie

按名称存储请求附带的 cookie 的 Map 类

初始化参数

initParam

按名称存储 Web 应用程序上下文初始化参数的 Map 类

 

EL表达式语言的运算:

类别

运算符

算术运算符

+、-、*、/(或 div)和 %(或 mod)

关系运算符

==(或 eq)、!=(或 ne)、<</code>(或 lt)、>(或 gt)、<=(或 le)和 >=(或 ge)

逻辑运算符

&&(或 and)、||(或 or)和 !(或 not)

验证运算符

empty

 

 

JSTL核心语法

JavaServer Page standard Tag Library,JSP标准标签函数库。
JSTL 1.1必须在支持Servlet 2.4和JSP 2.0以上版本的Container中使用,如Tomcat 5以上版本。使用必须导入URI。
JSTL 1.1包含两个jar包:jstl.jar和standard.jar。
JSTL提供的标签库分五大类:

JSTL

前缀

URI

核心标签库(Core tag library)

c

http://java.sun.com/jsp/jstl/core

I18N格式标签库(I18N-capable formatting)

fmt

http://java.sun.com.jsp/jstl/fmt

SQL标签库(SQL tag library)

sql

http://java.sun.com/jsp/jstl/sql

XML标签库(XML tag library)

xml

http://java.sun.com.jsp/jstl/xml

函数标签库(Function tag library)

fn

http://java.sun.com/jsp/jstl/funcions

 

注意:JSTL 1.1的URI中有/jsp,而JSTL1.0中没有,不要写错路径。 导入核心标签库: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

 1、核心标签库
 核心标签库主要包括:基本输入输出,流程控制,迭代,URL操作。
 表达式操作(输入输出):out,set,remove,catch
 流程控制:if,chose(when,otherwise)
 迭代操作:forEach,forTokens
 URL操作:import,url,redirect

   1)、表达式操作
 out:显示数据的内容
 <c:out value="" default="" escapeXml="true|false" />
  value:要显示的值
  default:默认值
  escapeXml:是否转换特殊字符
  如果没有指定default,而value值为null时,显示空字符串。
  如: <c:out value="${sessionScope.loginUser.username }" default="您还没有登录" />
 set:将变量存储在JSP范围或JavaBean属性中。
  <c:set var="" value="" scope="" target="" property=""/> 
  var:变量名称
  value:被存储的值
  scope:范围
  target:为一个JavaBean或Map对象
  property:指定target对象的属性

 remove:移除变量 
    <c:remove var="" scope=""/>
  var:移除的变量名称
  scope:范围
 如果没有指定范围,则移除所有范围内相同名称的变量。

catch:处理异常
 <c:catch var="">
  //发生异常的代码
 </c:catch>
 将会发生异常的代码包围起来,当发生异常时,将错误信息存储在var指定的变量中。只有catch标签内的代码中止执行,其余部分将继续完成。

  2、流程控制
 if:
 <c:if test="" var="" scope="">
     //代码
    </c:if>
 test:如果表达式执行结果为true,则执行本体内的代码,否则不执行。如果要结果为假时执行,则加!。
 如:
  <c:if test="${ 1==1}">
    结果为真。
  </c:if>

  choose:相当于switch语句块
 <c:choose>
      <c:when test=""></c:when>
      <c:when test=""></c:when>
      <c:when test=""></c:when>  
  <c:otherwise></c:otherwise>   
  </c:choose>
 when和otherwise必须在choose之间,when必须在otherwise之前
 可以有1个或多个when语句块,可以有0个或多个otherwise块
 when块必须有test属性,当有几个when为真时,只有第一个执行。
如:
<c:choose>
     <c:when test="true">
      when1
     </c:when>
     <c:when test="true">
      when2
     </c:when>
     <c:when test="false">
      when3
     </c:when>  
  <c:otherwise>
   otherwise
  </c:otherwise>   
</c:choose>

foreach:迭代 
   <c:forEach var="" items="" begin="" end="" step="" varStatus="">
   </c:forEach>
 var:存放当前元素的变量
 items:被迭代的集合对象,数组,list,map等等
 begin:开始位置
 end:结束位置
 step:步长
 varStatus:存放当前元素的相关信息。   

 示例:
 <center>
    <c:forEach var="i" begin="1" end="10">
     <c:forEach begin="1" end="${2*i-1 }">*</c:forEach>
     <br />
    </c:forEach>
    </center>

<table class="indexTable">
 <c:forEach var="article" items="${sessionScope.type1Map}" end="3">
  <tr>
   <td width="55%" align="center">
  <a href="#">${article.value.title}</a>
  </td>
   <td width="45%" align="center">
  [${fn:substring(article.value.writeDate,0,16) }]
  </td>
  </tr>
 </c:forEach>
</table>

注意:
如果有step,则必须大于0,否则出异常。
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 'step' <= 0
如果有begin,则必须大于等于0
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 'begin' < 0
当begin大于items的大小时,迭代不执行。
items为空时,迭代不执行。
当items为Map时,使用var.value.xxx的方法取出value中的值。

2、I18N格式标签库
 用于格式化输出,可实现国际化格式输出等。
 主要包括:国际化,消息,数字日期格式化。
 数字格式化:
 如:
  <fmt:formatNumber value="12" pattern="0.00"/>
  输出:12.00

3、SQL标签库(不推荐使用)
 主要包含:setDataSource,query,update,param等

4、使用函数标签库
 引入标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
 使用标签截取字符串:
 ${fn:substring("xxxxxxx",0,5) }

5、使用fmt格式化日期
<jsp:useBean id="now" class="java.util.Date"/> 
<fmt:formatDate var="d" type="date" value="${now}"/>
now : ${now}
d : ${d}

1、JSTL的用法:

  如果要使用JSTL标记库,首先必须把对应的标签库引入进来,如下代码演示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  目前项目中,使用的应该是JSTL1.1以上的版本,在JSTL1.1中有5个核心标记库,分别是   core(核心库),format(格式化库),SQL(数据库),XML(XML读取库),functions(基于EL操作库)
  JSTL的xml 和 sql 库使用定制标记,从而能够在JSP页面上实施复杂的功能,但是在您的视图层使用这类功能可能不是最好的方法,所以在实际开发中,几乎不可能使用xml和sql标签库,我们在这里着重讲解core和format库。

2、CORE标签库:

  Core的意思就是核心,通常开发中,我们命名为c标签,如果要使用core标签库中的标签,我们必须写入如下代码到指定的JSP中:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
   然后,我们开始c标签的开发。  

  Ⅰ.<c:out>标签:
  <c:out value="hello world" />
   <!-- c:out标签是没有取值功能,只有显示功能 -->
 <c:out value="${two}" default="目前没有任何值"/>
  <c:out value="${one}" escapeXml="false"/>
  <c:out value="${one}">
  目前没有任何值
  </c:out>
<!-- value属性是所见即所得模式,default属性是在EL取不到值的时候显示,escapeXml属性是关闭HTML标签解析 如果c:out标签是双标签出现的时候,中间插入的内容就是默认值 通常情况下,c:out都会和EL合并使用,因为c:out自身是无法取值的 -->

  Ⅱ.<c:set>标签:
<c:set var="name" value="china" scope="pageContext"/>
<%=pageContext.getAttribute("name") %>
${name}
<!-- c:set标签是设置某一个值或者对象到某一个scope中,var代表key值,value代表value值,scope代表访问,scope默认是pageContext中 -->
  另外一个例子:
<%
 UserBean ub = new UserBean();
 %>
<c:set var="beanname" target="ub" property="username" value="thinkmore"/>
<%=((UserBean)pageContext.getAttribute("beanname")).getUsername() %>
${beanname.username}
<!-- var代表key值,target代表对象名,property代表对象中的属性名,value代表value值 -->

  Ⅲ.<c:remove>标签:
<c:remove var="name"/>
<%=pageContext.getAttribute("name") %>
${name}
<!-- 在scope中移除对应key的属性或者对象 -->
  Ⅳ.<c:catch>标签:
<c:catch var="exception">
<% new Integer("a"); %>
</c:catch>
${exception }
  <!--这个标签相当于捕获在它里边标签抛出异常对象 -->

  Ⅴ.<c:if>标签:
<c:if test="true">比较成功</c:if>
<!-- test属性中的比较必须是EL表达式和jsp脚本元素 -->
<c:if test="${2>1}" var="return">EL比较成功</c:if>
${return}
<c:if test="<%=2>1 %>" var="return">jsp脚本比较成功</c:if>
 <c:choose>标签和<c:when>标签和<c:otherwise>标签
<c:choose>
 <c:when test="${1<0}">1<0比较成功</c:when>
 <c:when test="${1<1}">1<1比较成功</c:when>
 <c:when test="${1<2}">1<2比较成功</c:when>
 <c:otherwise>没有结果</c:otherwise>
</c:choose>
<!-- when和otherwise标签必须在choose里面 -->

  Ⅵ.<c:forEach>标签:
<!-- c:forEach就是一个循环取值的概念 -->
<% List list = new ArrayList();
   list.add("one");
   list.add("two");
   list.add("three");
   list.add("four");
   list.add("five");
   list.add("six");
   request.setAttribute("list",list);
 %>
${list}
<br/>
<c:forEach items="${list}" var="arraylist" begin="0" end="5" step="2">
${arraylist }
</c:forEach>
<br/>EL取值:${arraylist }
<br/>

<!-- c:forEach可以当做普通的循环,例如下面就是循环打印几个技术的字符串 -->
<c:forEach begin="0" end="5">
技术
</c:forEach>
<!-- c:forEach也可以取出map中的key和value -->
<%
  Map map = new HashMap();
  map.put("key1","value1");
  map.put("key2","value2");
  map.put("key3","value3");
  request.setAttribute("map",map);
 %>
<c:forEach items="${map}" var="maplist">
${maplist.key }
${maplist.value }
</c:forEach>

  Ⅶ.<c:forTokens>标签:
<%
 String str = "one,two,three,four,five,six,seven";
 request.setAttribute("math",str);
 %>
<c:forTokens items="${math}" delims="," var="va">
${va}
</c:forTokens>  
 <c:url>标签和<c:param>标签
<c:url value="error.jsp" var="errorpage">
<c:param name="username" value="china"/>
</c:url>

  Ⅷ.<c:import>标签:
<c:import url="one.jsp"/>
<!-- import的作用和include包含指令的作用是一样的 -->

  Ⅸ.<c:redirect>标签:
<c:redirect context="/2010struts1.2" url="/welcome.jsp"/>
<!--Context属性是指定网站名,url是跳转路径,两个都要加上斜线,重新定向到另外一个页面上,也可以使用下面的方式:-->
<c:redirect  url=" http://localhost:8080/test/one.jsp"/>

3、 FN标签库:

Ⅰ.fn:contains 判断一个字符串是否含有另外一个字符串
           例如:<c:if test="${fn:contains(str, searchString)}">

Ⅱ.fn:containsIgnoreCase 同上面tag只是不区分大小写

Ⅲ.fn:endsWith 判断一个字符串是否以某一个字符串结束
           例如:<c:if test="${fn:endsWith(filename, ".txt")}">

Ⅳ.fn:escapeXml 将一个字符串转换为没有xml无法识别的一个字符串
           例如:${fn:escapeXml(info)}

Ⅴ.fn:indexOf 判断某个字符串在一个字符串中位置
           例如:${fn:indexOf(name, "-")}

Ⅵ.fn:join 拼接
           例如:${fn:join(.gif' />, ";")}

Ⅶ.fn:length 计算一个字符串长度

Ⅷ.fn:replace 替换某一个字符串
           例如:${fn:replace(text, "-", "•")}

Ⅸ.fn:split 基于某一个符号拆分
           例如:${fn:split(customerNames, ";")}

Ⅹ.fn:startsWith 是否以某一个字符串开始
           例如:<c: test="${fn:startsWith(product.id, "100-")}">

Ⅺ.fn:sub 获取一个字符串
           例如:${fn:sub(zip, 6, -1)}

Ⅻ.fn:subAfter 从某一个字符串开始取一个字符串
           例如:${fn:subAfter(zip, "-")}

ⅠⅠ.fn:subBefore 上条反过程

ⅠⅡ.fn:toUpperCase 把一个字符串中全部转为大写

ⅠⅢ.fn:trim 去掉一个字符串两边空格
           例如:${fn.trim(name)}

 

原文地址:https://www.cnblogs.com/qq809306794/p/3173619.html