el,jstl,ognl概念上的区分

  到目前为止,我对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来使用呢?我们主要在下一篇博客中讲解。


  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值