ognl和ui标签

发表时间:2017-05-16 15:47:22 浏览量( 25 ) 留言数( 0 )

学习目标:

1、了解ognl表达式的历史

2、了解struts2的ui标签


学习过程:

前面我们的页面还是使用EL表达式和JSTL标准标签库,但是struts2推介使用ognl表达式和struts2的标签,下面我们就学习ognl和相关的一些标签。

一、ognl表达式

OGNL全称是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言。Struts 2默认的表达式语言就是使用OGNL。OGNL常常结合struts2标签来使用。使用比较灵活,但学习起来也相对来说比较难,尤其是“%”、“#”、“$”这三个符号的使用,不熟练的话,常常会犯晕。下面我们就简单先介绍一下这三个符号。大家先浏览一下,在后面讲解标签的时候会应用到。

1、“#”符号有三种用途:  

(1)、访问非根对象(struts中值栈为根对象)。

“#”相当于ActionContext.getContext(),这也是ognl最基本的功能,上下文包括以下几个:

     |
                    |--application
                    |
                    |--session
      context map---|
                    |--value stack(root)
                    |
                    |--action (the current action)
                    |
                    |--request
                    |
                    |--parameters
                    |
                    |--attr (searches page, request, session, then application scopes)

示例如下:

application   

 包含当前应用的ServletContext的属性(attribute)的Map   

 #application.userName相当于 application.getAttribute("userName")    

session   

 包含当前HttpSession的属性(attribute)的Map   

 #session.userName相当于session.getAttribute("userName")    

parameters   

 包含当前HTTP请求参数的Map   

 #parameters.id[0]作用相当于   request.getParameter("id")       

request   

 包含当前HttpServletRequest的属性(attribute)的Map   

  #request.userName相当于request.getAttribute("userName")    

attr   

attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。

(2)、用于过滤和投影(projecting)集合

如: books.{?#this.price>35}     

用于过滤和投影(projecting)集合,如books.{?#this.price<100}。 你可以选择其中一种投影方式

  • ? - 投影(过滤)所有符合条件的集合

  • ^ - 投影(过滤)第一个符合条件的元素

  • $ - 投影(过滤)最后一个符合条件的元素

(3)、构造Map 

如:#{'foo1':'bar1', 'foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:    

2、“%”符号的用途是在标签的属性值被理解为字符串类型时。告诉执行环境%{}里的是OGNL表达式,并执行

实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能。 

3、“$”有两种用途   

(1)、在国际化资源文件中,引用OGNL表达式。   

在国际化配置文件中配置如:

reg.agerange=年龄必须在${min}同${max}之间

(2)、在Struts 2配置文件中,引用OGNL表达式:    

在我们讲解文件下载时使用过,如:

  <param name="contentDisposition">attachment;filename="${downName}"</param>

在后面讲解验证框架时,我们还会使用到这个功能。

4、还支持lamba 表达式

如struts2的官方示例如下:

实现费波那契数列,是以递归的方法来定义:

F_{0}=0

F_{1}=1

F_{n}=F_{{n-1}}+F_{{n-2}}

使用struts2实现。

二、UI标签

UI标签主要分为主题和模板标签、form表单标签两类。标签种类比较多,但是相对简单而且容易使用,struts2的官方文档给的示例比较详细,这里我就简单的介绍一下,详细可以参考官方文档:

http://struts.apache.org/release/2.3.x/docs/ui-tags.html

我们可以修改之前的用户注册页面,使用struts2的表单标签重写,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>添加用戶</title>

</head>
<body>

	<!-- struts2 UI Form  -->
	<s:form action="add" namespace="/user" method="post" theme="xhtml">

		<!--label 显示文本信息   key 读取国际化资源文件-->
		<s:textfield key="username" name="user.username"></s:textfield>
		<s:password label="密码" name="user.passwd"></s:password>
		<s:textfield name="user.age" key="用户年龄"></s:textfield>
		<s:textfield name="user.registerTime" label="注册时间"></s:textfield>
		<s:textfield name="user.weight" label="体重"></s:textfield>
		<s:textfield name="user.email" label="邮箱"></s:textfield>

		<s:radio list="#{'1':'男','0':'女'} " name="user.gender" label="性别"
			value="1"></s:radio>

		<s:checkboxlist list="#{'1':'篮球','2':'羽毛球','3':'足球'}" label="爱好"
			name="like" value="{'1','3'}"></s:checkboxlist>

		<s:select list="#{'1':'计算机','2':'非计算机'} " label="专业" name="pro" />
		<s:submit value="注册"></s:submit>
	</s:form>


</body>
</html>

首先,我们要先声明使用struts2的标签:

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

然后我们使用struts2的form标签