一、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的资料可以访问。