• 沒有找到結果。

在 JSP 中使用 OGNL

在文檔中 第一部分: (頁 127-132)

第七章 表达式语言 OGNL

7.4 在 JSP 中使用 OGNL

前面已经详细介绍了 OGNL 的语法,下面就在 Eclipse 中用 OGNL 完成一个实例。在这 个实例中会用到上面介绍的大部分语法,有变量的访问,有操作列表 Lists,有操作映射 Maps,

还有选择操作等等。会在 JSP 中完成这个实例。

7.4.1 项目概述

整个项目的控制逻辑比较简单,重心将放在页面 JSP 文件使用 OGNL。在这个项目中有 一个 User 类的定义,其中包含三个成员变量:username、sex、age。然后在 Action 中定义 一个链表 List 的对象,向链表中增加三个 User 类的对象,最后在页面上对 List 进行操作。

同时在 Action 中还会获取当前 Action 的请求 request,以及会话 session,然后在其中分别添 加一对键值,在页面上再通过 OGNL 表达式进行访问。最后还会在页面上定义一个 MAP 对 象,然后对其进行读取操作。整个项目要完成的功能就是这么多了。下面先了解一下整个工 程目录,如图 7-2 所示:

图 7-2 整个工程的目录

从工程的目录示意图中可以看出这是一个相对简单的项目,包含五个源文件,分别是:

User.java、OgnlExeAction.java、OgnlExe.jsp、struts.xml、web.xml。这些文件的意义与前述 工程的一致,因此在这里不再重复。在下面的小节里将按顺序分别进行详细讲解 OGNL 在 JSP 页面中的使用方法。

7.4.2 工程代码编写

首先看看模型 User 类的定义文件 User.java,这个 JavaBean 风格的类一共有三个成员变 量,这个类用来为页面提供数据模型,具体的代码如下:

User.java

package action;

public class User { /*三个成员变量的定义*/

private String username;

private String sex;

private int age;

/*下面是构造函数*/

public User(String username, String sex, int age) { super();

this.username = username;

this.sex = sex;

this.age = age;

}

/*省略 Get、Set 方法*/

}

这个类定义了三个私有成员变量以及它们各自的 Get、Set 方法,还有一个显示定义的 构造函数,是为了方便在 Action 中生成 User 类实例。再看看 Action 的具体代码:

OgnlExeAction.java package action;

/*省略导入的包*/

@SuppressWarnings("serial")

public class OgnlExeAction extends ActionSupport { private HttpServletRequest request;

private HttpSession session;

private List<User> users;

public String execute() throws Exception { /*获取 request 和 session*/ HttpServletRequest 和 HttpSession 类的对象以期为页面提供数据,同时为了演示对 List 的各 种操作,故又增加了一个用来存放 User 类对象的 List 的成员变量。定义了这些工具类之后,

接下来便为它们赋值,request 和 session 分别赋值为当前 Action 的请求和会话,在 List 中也 添加了三个 User 对象。

有了这些准备之后,就可以在页面上通过 OGNL 表达式对值栈进行访问。JSP 文件将是 该示例项目的核心文件,通过这个 JSP 文件将演示前述的 OGNL 语法特性是如何应用到具 体的页面中的,下面就重点阐述一下 OgnlExe.jsp 文件,该页面文件的代码如下:

OgnlExe.jsp

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<h3><font color="blue">访问 Action 上下文</font></h3>

<!-- 对 request 和 session 中的值进行访问 -->

request.userName: <s:property value="#request.userName" /><br/>

session.userName: <s:property value="#session.get('userName')" /><br/>

<hr />

<h3><font color="blue">用于过滤和投影集合</font></h3>

<p>年龄小于 21 岁的名单</p>

<ul>

<!-- 在 List 中选择年龄小于 21 的 User 对象 -->

<s:iterator value="users.{?#this.age <21}">

<li><s:property value="username" /> 年龄是 <s:property value="age" />岁!</li>

</s:iterator>

<h3><font color="blue">构造 Map</font></h3>

<!-- 定义 Map,然后选择对应的键进行访问 -->

<s:set name="xu" value="#{'xxp':'xuxinpeng', 'wz':'wangzhen'}" />

<p>键名"xxp" 是 <s:property value="#xu['xxp']" />的缩写</p> 名为'wangzhen'的 User 对象中的 age 属性,但是这个表达式返回的是一个集合,所以要用“[索 引]”来访问其值,读者可以参考前述小节的语法讲解。

页面完成之后,最后就是配置文件 struts.xml,其具体的内容就是:

struts.xml

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

<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<constant name="struts.devMode" value="true" />

<package name="Struts2_OGNL_Exe" extends="struts-default">

<default-interceptor-ref name="completeStack"></default-interceptor-ref>

<action name="OgnlExe" class="action.OgnlExeAction">

狐,地址栏输入:http://localhost:8080/OgnlExe/OgnlExe.action 运行结果如图 7-3 所示:

图 7-3 成功运行的页面

7.5 小结

本章对在使用 Struts2 编写页面代码过程中经常要使用的表达式语言进行了详细的探 讨,详细的讲述了 OGNL 中变量的声明,对象的属性的访问,静态方法的调用,以及各种 集合类型的使用。同时也介绍了 OGNL 中的高级特性包括类型转换,lamuda 表达式,集合 的投影,选择等操作。但正如在一开始就指出的,对于 OGNL 表达式语言其实只要掌握:

属性访问、方法调用、下标运算以及链式表达式就可以应付绝大部分的应用需求。高级的特 性使得代码能够更加简洁,同时表达更多的操作,例如集合的投影操作就可以省去大约 10 多行的常规代码。在讲述了 OGNL 的所有语法细节之后,给出了一个 JSP 的实例来指导读 者如何进行现实的页面开发。虽然没有覆盖所有的语法特性,必定给读者以启示。

OGNL 的这些丰富的特性,使得程序员可以在无类型的 Web 世界构建起强类型的对象,

并且给程序员提供了丰富的类型转换机制。这些特性无疑都给开发工作带来了极大的便利。

相信读者通过这一章节的学习,在编写动态页面代码的时候可以更加的得心应手。

在文檔中 第一部分: (頁 127-132)