el jstl ognl整理

一、EL

E L(Expression Language) 目的:为了使JSP写起来更加简单。


1、语法结构

${expression}

2、[ ]与.运算符

EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:
${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量

3、变量

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


4、隐式对象

JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:


pageContext

JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。


此外,还提供几个隐式对象,允许对以下对象进行简易访问:


术语定义

param

将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。

paramValues

将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。

header

将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。

headerValues

将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。

cookie将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。
initParam将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。


除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:


术语定义

pageScope

将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。

requestScope

将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。

sessionScope

将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:


$sessionScope.name}

applicationScope

将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。

5、pageContext对象

pageContext对象能够存取其他隐含对象。
1.pageContext对象存取其他隐含对象属性的方法,此时需要指定范围的参数。

    Object getAttribute(String name, int scope)  
    Enumeration getAttributeNamesInScope(int scope)  
    void removeAttribute(String name, int scope)  
    void setAttribute(String name, Object value, int scope) 

范围参数有四个,分别代表四种范围:PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE

2.PageContext对象取得其他隐含对象的方法
Exception getException( )回传目前网页的异常,不过此网页要为error page,
JspWriter getOut( )回传目前网页的输出流,例如:out
Object getPage( )回传目前网页的Servlet 实体(instance),例如:page
ServletRequest getRequest( )回传目前网页的请求,例如:request
ServletResponse getResponse( )回传目前网页的响应,例如:response
ServletConfig getServletConfig( )回传目前此网页的ServletConfig 对象,例如:config
ServletContext getServletContext( ) 回传目前此网页的执行环境(context),例如:application
HttpSession getSession( )回传和目前网页有联系的会话(session),例如:session

3.PageContext对象提供取得属性的方法
Object getAttribute(String name, int scope)回传name 属性,范围为scope的属性对象,回传类型为Object
Enumeration getAttributeNamesInScope(int scope)回传所有属性范围为scope 的属性名称,回传类型为Enumeration
int getAttributesScope(String name)回传属性名称为name 的属性范围
void removeAttribute(String name)移除属性名称为name 的属性对象
void removeAttribute(String name, int scope)移除属性名称为name,范围为scope 的属性对象
void setAttribute(String name, Object value, int scope)指定属性对象的名称为name、值为value、范围为scope
Object findAttribute(String name)寻找在所有范围中属性名称为name 的属性对象



6、特别强调:

1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

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


二、jsp定义标签

jstl:

<%@ taglib uri="http://java.suncom/jstl/core" prefix="c" %>

struts:

<%@ taglib prefix="s" uri="/struts-tags" %>


uri的值是怎么来的?


Struts 2库文件struts2-core-2.0.11.jar里面的文件META-INF/struts-tags.tld里面,在这个文件的开头有这么一段代码:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

<tlib-version>2.2.3</tlib-version>

<jsp-version>1.2</jsp-version>

<short-name>s</short-name>

<uri>/struts-tags</uri>

....

大家可以注意到粗斜体的<uri>/struts-tags</uri>刚好与JSP文件引入taglib声明里面的uri属性匹配,这样就找到了对应的标签定义位置了。Tomcat等Web服务器会自动加载所有jar文件下的META-INF子目录下的.tld标记定义文件,这也是为什么好多框架不需要把tld文件复制到WEB-INF。


三、jstl实例

<!-- JSTL实例 -->
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="bean" uri="http://jakarta.apache.org/struts/tags-bean" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head></head><body>
<!-- JSTL中的Set标签的使用 -->
<c:set value="10" var="r" scope="page"/>
<c:set value="米" var="unit" scope="page"/>

<c:set value="${pageScope.r*pageScope.r*3.14}" var="area" scope="page"/>
半径为${pageScope.r}${pageScope.unit}的圆的面积为:${pageScope.area }平方${pageScope.unit}
<bean:write name="r"/><bean:write name="unit"/><br><br>

<!-- JSTL中的out标签的使用 -->
<c:out value="${pageScope.r}" default="0"></c:out>
<c:out value="${pageScope.unit}" default="厘米"></c:out>
<c:out value="${pageScope.rr}" default="0000"></c:out><br><br>

<!-- JSTL中的remove标签的使用 -->
<c:remove var="r" scope="page"/>
<c:out value="${pageScope.r}" default="对不起没有!"></c:out><br><br>

<!-- JSTL中的catch标签的使用 -->
<c:catch var="err">
<%
String str=null;
str.trim();
%>
</c:catch>
错误信息为:<c:out value="${err}" default="未发生异常"></c:out><br><br>

<!-- JSTL中的if标签的使用 -->
<c:if test="${param.name=='lgq'}" var="result">
刘广清,你好!<br><br>
</c:if>
判断条件为:${result }<br><br>

<!-- JSTL中的choose、when、otherwise标签的使用 -->
<%
Random ran=new Random();
Integer luck=new Integer(ran.nextInt(10));
request.setAttribute("luck",luck);
%>
<c:choose>
<c:when test="${luck==8}">恭喜你中了一等奖!</c:when>
<c:when test="${luck==6}">恭喜你中了二等奖!</c:when>
<c:when test="${luck==9}">恭喜你中了三等奖!</c:when>
<c:otherwise>谢谢参与,欢迎下次再来!</c:otherwise>
</c:choose><br><br>   

<!-- JSTL中的forEach标签的使用 -->
<%
String user[]={"admin","lgq","guest","user"};
request.setAttribute("user",user);
%>
<table border="1" width="60%">
<tr>
<td>内容</td>
<td>索引值</td>
<td>共访问过</td>
<td>是否为第一个成员</td>
<td>是否为最后一个成员</td>
</tr>
<c:forEach items="${user}" var="u" varStatus="s">
<tr align="left">
<td><c:out value="${u}"/></td>
<td><c:out value="${s.index}"/></td>
<td><c:out value="${s.count}"/></td>
<td><c:out value="${s.first}"/></td>
<td><c:out value="${s.last}"/></td>
</tr>
</c:forEach>
</table>
<c:forEach var="num" begin="1" end="5">
<c:out value="${num}"/>的平方是:<c:out value="${num*num}"></c:out><br>
</c:forEach><br><br>

<!-- JSTL中的forTokens标签的使用 -->
<%
String use="admin,lgq,guest,user";
request.setAttribute("use",use);
%>
<table border="1" width="60%">
<tr>
<td>内容</td>
<td>索引值</td>
<td>共访问过</td>
<td>是否为第一个成员</td>
<td>是否为最后一个成员</td>
</tr>
<c:forTokens items="${use}" delims="," var="uu" varStatus="ss">
<tr align="left">
<td><c:out value="${uu}"/></td>
<td><c:out value="${ss.index}"/></td>
<td><c:out value="${ss.count}"/></td>
<td><c:out value="${ss.first}"/></td>
<td><c:out value="${ss.last}"/></td>
</tr>
</c:forTokens>
</table><br><br>


<!-- JSTL中的import标签的使用 -->
<c:import url="http://localhost:8080/JSTL/MyJsp.jsp" var="code"/>
<textarea rows="10" cols="10">${code}</textarea>


</body></html>

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lgq_0714/archive/2009/04/29/4136482.aspx


四、OGNL表达式

  OGNL[1]支持各种纷繁复杂的表达式。但是最最基本的表达式的原型,是将对象的引用值用点串联起来,从左到右,每一次表达式计算返回的结果成为当前对象,后面部分接着在当前对象上进行计算,一直到全部表达式计算完成,返回最后得到的对象。OGNL则针对这条基本原则进行不断的扩充,从而使之支持对象树、数组、容器的访问,甚至是类似SQL中的投影选择等操作。

1. 基本对象树的访问  

对象树的访问就是通过使用点号将对象的引用串联起来进行。  例如:xxxx,xxxx.xxxx,xxxx. xxxx. xxxx. xxxx. xxxx   

2. 对容器变量的访问  

对容器变量的访问,通过#符号加上表达式进行。  例如:#xxxx,#xxxx. xxxx,#xxxx.xxxxx. xxxx. xxxx. xxxx   

3. 使用操作符号  

OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等。  

4. 容器、数组、对象  

OGNL支持对数组和ArrayList等容器的顺序访问:例如:group.users[0]  同时,OGNL支持对Map的按键值查找:  例如:#session['mySessionPropKey']  不仅如此,OGNL还支持容器的构造的表达式:  例如:{"green", "red", "blue"}构造一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map  你也可以通过任意类对象的构造函数进行对象新建:  例如:new Java.net.URL("xxxxxx/")  

5. 对静态方法或变量的访问  

要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):  例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources  

6. 方法调用  

直接通过类似Java的方法调用方式进行,你甚至可以传递参数:  例如:user.getName(),group.users.size(),group.containsUser(#requestUser)  

7. 投影和选择  

OGNL支持类似数据库中的投影(projection) 和选择(selection)。  投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。  例如:group.userList.{username}将获得某个group中的所有user的name的列表。  选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:  ? 选择满足条件的所有元素  ^ 选择满足条件的第一个元素  $ 选择满足条件的最后一个元素  例如:group.userList.{? #txxx.xxx != null}将获得某个group中user的name不为空的user的列表。




1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值