文档章节

javaweb开发之EL和JSTL

小米米儿小
 小米米儿小
发布于 2013/12/05 12:39
字数 2017
阅读 322
收藏 12

一、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" %>
<tags:hello username="admin"/>

三、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" %>
页面使用标签示例:
<c:set var="ctx" value="${pageContext.request.contextPath}" />

2. XML processing

说明:支持XML文档的处理
页面引入标签:

<%@ taglib prefix='x' uri="http://java.sun.com/jsp/jstl/x" %>
页面使用标签示例:
<x:parse var="doc" xml="${citizenXML}" />

3. I18N capable formatting

说明:支持JSP页面的国际化。
页面引入标签:

<%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %> 
页面使用标签示例:
<fmt:formatDate  value="${now}" type="date" />

4. Database access(sql)

说明:支持JSP对数据库的操作。
页面引入标签:

<%@ taglib prefix='sql' uri="http://java.sun.com/jsp/jstl/sql" %>
页面使用标签示例:
<sql:setDataSource var="mysqlDS" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="root" password="" />

我们使用最多的是Core核心标签库。更多关于JSTL的资料可以访问http://www.codejava.net/java-ee/jstl/

© 著作权归作者所有

共有 人打赏支持
下一篇: javaweb开发之jsp
小米米儿小
粉丝 40
博文 114
码字总数 83921
作品 0
成都
程序员
私信 提问
浅谈jsp、freemarker、velocity区别

以前做web开发页面层用的基本就是就是,最近公司java项目页面层用的技术是velocity。听说jsp要淘汰,也不知道是真是假,但本人还是比较喜欢jsp的,下面是网上查找的javaweb项目页面3种技术的...

cccyb
2017/10/21
0
0
给一个没有开发经验、应届毕业生一份工作吧

本人是一个应届毕业生,软件技术专业的学生,大专学历,想找一个份java方面的工作,我在大学期间专业就是学历jave,本人非常精通java基础,熟悉javaweb开发,熟悉servlet、jsp、el表达式、J...

you缘么
2015/01/01
4.6K
66
jsp中include乱码的三种解决方案

问题描述:<%@ include file="/footer.html" %> 的中文乱码问题 第一种情况可以修改被include的文件: 1.当jsp include动态文件时(jsp文件)可以在被include的jsp文件头部加上代码: <%@ pa...

扁-哥
2013/04/12
0
0
EL表达式和JSTL标签

EL表达式: EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识...

晨曦之光
2012/05/16
174
0
JavaWeb12-HTML篇笔记(二)

Ø 为什么学习JSTL: JSTL和EL结合 替换页面中<%%> Ø JSTL版本: JSTL1.0 :不支持EL表达式. JSTL1.1 和 1.2 :支持EL表达式. Ø JSTL的标签库:包含了五类标签. core(核心标签),fmt(国际化标签)...

我是小谷粒
2018/05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
10
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部