博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb开发之EL和JSTL
阅读量:6822 次
发布时间:2019-06-26

本文共 4922 字,大约阅读时间需要 16 分钟。

hot3.png

一、EL

1.概述

EL 全名为Expression Language。

EL表达式可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码。

EL主要作用如下:

(1)获取数据:
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(例如:某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
(2)执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。如:${user==null}
(3)获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
(4)调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。  

EL表达式是JSP 2.0规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。

注意:当有些Tomcat服务器如不能使用EL表达式时:

(1)升级成tomcat6;
(2)在JSP中加入<%@ page isELIgnored="false" %>。

<%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止,FALSE表示不禁止。JSP2.0中默认的启用EL语言。

2.语法结构

${expression}

3.访问EL作用域属性

3.1 []与.运算符

EL 提供.和[]两种运算符来存取数据。

当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如:

${user.My-Name}
应当改为:
${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
//data是一个变量${sessionScope.user[data]}

3.2 变量

EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就返回空字符串。

属性范围在EL中的名称

    Page             PageScope
    Request         RequestScope
    Session         SessionScope
    Application     ApplicationScope

如果我们需要指定变量的寻找范围,可以在EL表达式中指定搜寻范围。如:

 ${pageScope.username}
 ${requestScope.username}
 ${sessionScope.username}
 ${applicationScope.username}

在Spring中,所有逻辑处理单元返回的结果数据,都将作为Attribute被放置到HttpServletRequest 对象中返回(具体实现可参见Spring源码中org.springframework.web.servlet.view.InternalResourceView.exposeModelAsRequestAttributes方法的实现代码),也就是说SpringMVC 中,结果数据对象默认都是requestScope。因此,在Spring MVC中,以下寻址方法应慎用:

 ${sessionScope.logininfo.username}
 ${applicationScope.logininfo.username}

4.EL隐含对象

4.1 与范围有关的隐含对象

与范围有关的EL隐含对象包含以下四个:pageScope、requestScope、sessionScope和applicationScope,它们基本上就和JSP的pageContext、request、session和application一样。在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。

例如:我们要取得session中储存一个属性username的值,可以利用下列方法取得username的值:

session.getAttribute("username")
在EL中则使用下列方法:
${sessionScope.username}

4.2 与输入有关的隐含对象

与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。

例如:我们要取得用户的请求参数时,可以利用下列方法:

request.getParameter(String name)request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据:
${param.name}${paramValues.name}

4.3 其他隐含对象

 1)cookie

 JSTL并没有提供设定cookie的动作。

 例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。

 2)header和headerValues

 header储存用户浏览器和服务端用来沟通的数据。

 例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。

 另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。

 3)initParam

 initParam取得设定web站点的环境参数(Context)。

 例:一般的方法

String userid = (String)application.getInitParameter("userid");
可以使用EL表达式获取:
${initParam.userid}

 4)pageContext

 pageContext取得其他有关用户要求或页面的详细信息。

${pageContext.request.queryString}         取得请求的参数字符串${pageContext.request.requestURL}          取得请求的URL,但不包括请求之参数字符串${pageContext.request.contextPath}         服务的web application 的名称${pageContext.request.method}              取得HTTP 的方法(GET、POST)${pageContext.request.protocol}            取得使用的协议(HTTP/1.1、HTTP/1.0)${pageContext.request.remoteUser}          取得用户名称${pageContext.request.remoteAddr }         取得用户的IP 地址${pageContext.session.new}                 判断session 是否为新的${pageContext.session.id}                  取得session 的ID${pageContext.servletContext.serverInfo}   取得主机端的服务信息

5.EL运算符

5.1 算术运算符有五个:+、-、*或$、/或div、%或mod

    例:${5+5}    结果是10

5.2 关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge

    例:${5>6}    结果是false

5.3 逻辑运算符有三个:&&或and、||或or、!或not

    例:${true and false}    结果是false

5.4 其它运算符有三个:Empty运算符、条件运算符、()运算符

    例:${empty param.name}、${A?B:C}、${A*(B+C)}

6.EL函数

在JSP页面中调用EL函数库的步骤:

  1)在工程中导入JSTL包。

  2)在JSP页面中导入EL函数库。

<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
   3 )在需要的位置调用EL函数。例如:
${fn:length(list)}

二、自定义标签

1. 概述

JSP1.1规范中新增了自定义标签库规范。

自定义标签的好处:

可以将jsp页面一大段很复杂的代码简化成使用一个标签完成,保持页面代码的可读性。
把jsp中的java代码隐藏起来,有利于和美工的协同合作。
可以将jsp页面重复的代码封装后重复使用。

2. 自定义标签

JSP2.1新版的TagLib容易写了很多。具体实现和使用方法:

第一步,自定义标签:

在WEB-INF/tags目录下放一个hello.tag文件,内容如下,先声明了编码,和传入的变量,剩下就是普通的JSP内容了:

<%@tag pageEncoding="UTF-8"%><%@ attribute name="user" type="java.lang.String" required="true"%>Hello, <%==username%>

第二步,使用自定义标签:

在jsp中指向之前的目录,以tag文件名作为tag名称进行调用:

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>

三、JSTL

JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)。

从JSP1.1规范开始,JSP就支持在JSP中使用自定义标签了,自定义标签的广泛使用,导致了程序员对相同功能的标签重复定义。为了解决这个问题,JSTL就诞生了。

JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上。

JSTL包含两部分:标签库和EL表达式语言。

标签库目前支持四种标签:

1. Core

说明:支持JSP中的一些基本操作。

页面引入标签:

<%@ taglib prefix='c' uri="http://java.sun.com/jsp/jstl/core" %>
页面使用标签示例:

2. XML processing

说明:支持XML文档的处理

页面引入标签:

<%@ taglib prefix='x' uri="http://java.sun.com/jsp/jstl/x" %>
页面使用标签示例:

3. I18N capable formatting

说明:支持JSP页面的国际化。

页面引入标签:

<%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %> 
页面使用标签示例:

4. Database access(sql)

说明:支持JSP对数据库的操作。

页面引入标签:

<%@ taglib prefix='sql' uri="http://java.sun.com/jsp/jstl/sql" %>
页面使用标签示例:

我们使用最多的是Core核心标签库。更多关于JSTL的资料可以访问。

转载于:https://my.oschina.net/hongdengyan/blog/181690

你可能感兴趣的文章
分形树的绘制
查看>>
获取父页面标签对象,获取当前标签div高度
查看>>
分享10条PHP性能优化的小技巧,帮助你更好的用PHP开发:
查看>>
loadrunner请求中有汉字 如何编码
查看>>
java数据结构 • 面向对象 • 异常 • 随机数·时间
查看>>
springmvc 实现pc端手机端适配(同一个请求根据不同客户端展示不同界面)
查看>>
BTree和B+Tree详解
查看>>
VS2005工程迁移到Eclipse CDT
查看>>
Linux高端内存映射(上)【转】
查看>>
usb_control_msg参数详解【转】
查看>>
8086汇编指令速查手册
查看>>
Node.js安装及环境配置
查看>>
j2EE web.xml中的url-pattern的映射规则
查看>>
华盛顿大学的埃德 拉佐斯卡在一次讲座中提到了一个让人吃惊的数字,如果一个晶体管对应一粒大米,在2004年,每年全球晶体管的生产数量和大米的产量是一样的。...
查看>>
我曾对员工讲,我们做阿里云计算平台,要努力做到让创业者发自内心地相信,在阿里云计算平台上创新、创业,照样可以做成上市公司,甚至会比阿里巴巴还要厉害。有了这样的信任度,云计算才能真正做起来。...
查看>>
(转)前端面试题
查看>>
进销存管理系统——可行性分析
查看>>
git指南
查看>>
SQL-Delete Duplicate Emails
查看>>
前端页面与Nodejs使用websocket通信
查看>>