您的位置:首页 > Web前端 > JavaScript

el,jstl,ognl概念上的区分

2015-09-22 17:29 691 查看
到目前为止,我对jsp页面中el,jstl,ognl得使用之前一直处于迷茫的状态,$,#,%这三大符号把我搞晕了。看来有必要好好掌握理解一下。先从宏观上把握,这几个概念和关系,知道什么时候适合使用什么,然后从细节上掌握如何在项目中快速准确的使用。

1.背景介绍

我们都知道HTML描述的是一种静态页面。静态页面不能满足我们的需求,比如:



我用红色框框出了登录的用户名。如果是静态页面,这个位置显示的名字是一定的,现在我们要做到它显示得是动态的,不同用户登录显示得是不同用户的名称。这时我们能体会到动态页面的必要性了吧。当然我只是举了一个很简单的例子。

我们来看看代码中会如何做到动态的?

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="com.bjpowernode.drp.sysmgr.domain.*" %>
<%@ page import="com.bjpowernode.drp.sysmgr.manager.*" %>
<%@ page import="com.bjpowernode.drp.util.*" %>
<%
String command = request.getParameter("command");
if ("del".equals(command)) {
String[] userIds = request.getParameterValues("selectFlag");
//for (int i=0; i<userIds.length; i++) {
//out.println(userIds[i]);
//	UserManager.getInstance().delUser(userIds[i]);
//}
UserManager.getInstance().delUser(userIds);
}
int pageNo = 1;
int pageSize = 4;
String pageNoString = request.getParameter("pageNo");
if (pageNoString != null) {
pageNo = Integer.parseInt(pageNoString);
}
PageModel<User> pageModel = UserManager.getInstance().findUserList(pageNo, pageSize);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>用户维护</title>
<link rel="stylesheet" href="../style/drp.css">
</head>

<body class="body1">
<form name="userform" id="userform">
<table width="95%" border="1" cellspacing="0" cellpadding="0"
align="center" class="table1">
<tr>
<td width="55" class="rd6">
<input type="checkbox" name="ifAll" onClick="checkAll(this)">
</td>
<td width="119" class="rd6">
用户代码
</td>
<td width="152" class="rd6">
用户名称
</td>
<td width="166" class="rd6">
联系电话
</td>
<td width="150" class="rd6">
email
</td>
<td width="153" class="rd6">
创建日期
</td>
</tr>
<%
List<User> userList = pageModel.getList();
for (Iterator<User> iter=userList.iterator(); iter.hasNext();) {
User user = iter.next();
%>
<tr>
<td class="rd8">
<input type="checkbox" name="selectFlag" class="checkbox1"
value="<%=user.getUserId() %>">
</td>
<td class="rd8">
<%=user.getUserId() %>
</td>
<td class="rd8">
<%=user.getUserName() %>
</td>
<td class="rd8">
<%=user.getContactTel()%>
</td>
<td class="rd8">
<%=user.getEmail() %>
</td>
<td class="rd8">
<%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(user.getCreateDate()) %>
</td>
</tr>
<%
}
%>
</table>
</form>
</body>

</html>
我们可以分析一下这个jsp页面。在开头引入了java类<%@ page import="java.util.*" %> 在<% %>中可加入了大段的java代码,还有<%=user.getUserName() %> 获取后台的变量值。

在HTML中加入Java代码可以让页面动起来了。但是这样会有一些问题存在,比如这样分工不够明确,页面是用来显示的,可现在需要插入大段JAVA代码,这也是最初我们使用model1模式的做法。耦合性大,不够灵活,项目变大了以后会有很多麻烦,所以逐渐发展到model2模式,也就是MVC模式---把业务逻辑写在Controller层,页面显示写在View层。采用MVC模式后,我们尽量做到VC的分离,但是即使这样,我们还是需要动态往HTML中绑定值,尤其遇到页面复杂的情况,这时el和jstl就应运而生了。el可以解决<%=user.getUserName()
%>这类问题。而jstl可以解决<%@ page import="java.util.*" %> ,<% %>这类问题。

2 EL是什么

EL是(Expression Language)的简称,是一种表示式语言。它提供了在 JSP 中简化表达式的方法。

a、语法结构:${expression}

b、[ ]与.运算符

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

c、变量

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

3 JSTL是什么?

JSTL ( JSP Standard Tag Library ),也就是JSP标准标签库。其实到现在我才觉得自己理解了。要想理解JSTL,要先理解什么是标签库。当然要写标签库也可以写一篇博客。我之前写过一篇自定义标签库(自定义jsp标签),可参考。简单讲,当页面显示后台数据比较复杂时,比如,要循环显示后台list中的值绑定到前台table中。那我们就封装一个通用的标签,这个标签的命名可以随意,但是要参照<HTML>里面的格式,<>
,那我们可以命名为<s:iterator> <c:forEach> 等等,< c:forEach>这个c也是我们自主加入的前缀,用来做区分。只有这些肯定玩不转的。没有后台代码支持,怎么可以?我们必须封装JAVA代码,把你的逻辑写入,或许也可以加入一些HTML元素。把需要的变量设置到tld文件中做个整合。然后在前台引入tld文件。如<%@ taglib uri="/WEB-INF/tld/aofsoft.tld" prefix="c"%>. 就可以使用了。其实我描述得这些就是自定义标签的一个过程。不理解得要参照我前面的一篇博客。

在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现。鉴于此,出现了 JSTL 。大家应该明白了JSTL是个什么了吧。有了它,我们就不用在JSP页面中写入JAVA代码了。我们可以把它封装成标签,封装好的话,还可以复用。

知识都是相通的,我们还可以联系到struts2的那一套标签,<s:textfield>,<s:property>,<s:if><s:elseif><s:else>,<s:iterator>,<s:select>等等。这是不是也没有什么新鲜的。我们知道原理后,掌握它如何使用即可。

我们可以将<%=user.getUserName() %>改为el表达式为${user.userName} 可以。这只是简单介绍。

4. OGNL是什么?

OGNL是Struts 2默认的表达式语言。是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。它可以用于JSP的标签库中,以便能够方便的访问各种对象的属性;它用于界面将参数传递到Action(并进行类型转换)中;它还可以用于struts2的配置文件中。

说到这,你可以联想到可以跟OGNL对比的是什么?EL。EL也是表达式语言。可以说EL是基础。OGNL是Struts 2默认的表达式语言,但是这并不能说明struts2不能使用其他表达式语言。其实往往我们都是混着用的。什么好用用什么。

那么OGNL怎么结合sturts2来使用呢?我们主要在下一篇博客中讲解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: