1.集合的投影(过滤)有以下三种方式:
a.“?#”:投影(过滤)所有符合条件的集合,如:users.{?#this.age > 19};
b.“^#”:投影(过滤)第一个符合条件的元素,如:users.{^#this.age > 19};
c.“$#”:投影(过滤)最后一个符合条件的元素,如:users.{$#this.age > 19} 。
2.“this”表示集合中的元素;
3.投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的元素,如:users.{?#this.age > 19}[0]。
实例:
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="
http://java.sun.com/xml/ns/javaee
"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
">
<welcome-file-list>
<welcome-file>hello.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
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.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<include file="example.xml"/>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
-->
<!-- Add packages here -->
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="GBK" />
<package name="user" namespace="/" extends="struts-default">
<action name="user" class="cn.edu.ahau.mgc.struts2.action.UserAction">
<result>/addSuccess.jsp</result>
</action>
</package>
</struts>
UserAction.java:
package cn.edu.ahau.mgc.struts2.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import cn.edu.ahau.mgc.struts2.model.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String userName;
private User user;
private List<User> users = new ArrayList<User>();
private Set<User> usersSet = new HashSet<User>();
private Map<String, User> usersMap = new HashMap<String, User>();
public UserAction() {
users.add(new User("1", 19));
users.add(new User("2", 20));
users.add(new User("3", 21));
usersSet.add(new User("1", 19));
usersSet.add(new User("2", 20));
usersSet.add(new User("3", 21));
usersMap.put("u1", new User("1", 19));
usersMap.put("u2", new User("2", 20));
usersMap.put("u3", new User("3", 21));
}
public String execute() {
return SUCCESS;
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String test() {
return "Action Method";
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public Set<User> getUsersSet() {
return usersSet;
}
public void setUsersSet(Set<User> usersSet) {
this.usersSet = usersSet;
}
public Map<String, User> getUsersMap() {
return usersMap;
}
public void setUsersMap(Map<String, User> usersMap) {
this.usersMap = usersMap;
}
}
User.java:
package cn.edu.ahau.mgc.struts2.model;
public class User {
private String userName;
private int age;
private User firend;
public User() {
}
public User(String userName, int age) {
super();
this.userName = userName;
this.age = age;
}
public User getFirend() {
return firend;
}
public void setFirend(User firend) {
this.firend = firend;
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "User(" + this.userName + ", " + this.age + ")";
}
public String hello() {
return "Hello World!";
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
index.jsp:
<%@ page language="java" pageEncoding="GB18030"%>
<%
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>ResultParam</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<a href="user">user</a><br />
</body>
</html>
addSuccess.jsp:
<%@ page language="java" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
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>Dynamic</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
User Add Success! <br />
投影(过滤)所有符合条件的集合:users.{?#this.age > 19} --> <s:property value="users.{?#this.age > 19}" /><br />
投影(过滤)所有符合条件的集合中指定的元素:users.{?#this.age > 19}[0] -->
<s:property value="users.{?#this.age > 19}[0]" /><br />
投影(过滤)第一个符合条件的元素:users.{^#this.age > 19} --> <s:property value="users.{^#this.age > 19}" /><br />
投影(过滤)最后一个符合条件的元素:users.{$#this.age > 19} --> <s:property value="users.{$#this.age > 19}" /><br />
<s:debug></s:debug>
</body>
</html>
相关推荐
在 Struts2 中,OGNL 表达式可以用于实现投影,即根据特定的条件来过滤数据。例如,在上述示例代码中,我们使用 OGNL 表达式来实现投影,过滤出年龄大于 1 的用户。OGNL 表达式可以写在 Struts2 的配置文件 struts....
- 在Struts2中,使用`#`符号可以访问特定的数据上下文,如`request`、`parameters`、`session`和`application`。例如,`#request`代表请求范围内的变量,`#session`则表示session范围内的变量。 - 当访问根对象...
OGNL 符号的使用 OGNL(Object-Graph Navigation Language)是一...OGNL 表达式在 Struts2 中的使用非常广泛,开发者需要充分了解“%”、“#”、“$”这三个符号的使用规则,以便更好地使用 OGNL 表达式提高开发效率。
OGNL(Object-Graph Navigation Language)是一种基于 Java 的表达式语言,Struts2 框架中使用 OGNL 来访问和操作 ValueStack 中的对象。在 Struts2 中,OGNL 是一个强大的工具,允许开发者访问和操作 ValueStack 中...
OGNL 表达式语言中使用了多种符号,包括 #、% 和 $ 符号。# 符号用于访问非根对象属性、过滤和投影集合、构造 Map 和 List 等。% 符号用于计算 OGNL 表达式的值。$ 符号用于在国际化资源文件中引用 OGNL 表达式和在 ...
* 在Struts 2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示: <param name="min">10 <param name="max">100 <message>BAction-test校验:数字必须为${min}为${max}之间! 二、OGNL常用...
与 Struts 1 相比,Struts 2 的标签库使用 OGNL 表达式作为基础,提供了更强大的对象和集合访问功能。 Struts 2 的标签库将所有标签统一到了一个标签库下,简化了用户对标签库的使用。同时,Struts 2 的标签库还...
- **标签库的使用**:Struts2 提供了一系列基于 OGNL 的标签,这些标签可以帮助开发者更方便地在视图层中使用 OGNL。 #### 六、OGNL 的高级特性 除了基本的属性访问和方法调用之外,OGNL 还支持一些高级特性,比如...
它在许多Java应用框架中得到了广泛应用,尤其是在Struts2中作为默认的表达式语言。OGNL中的`#`、`%`和`$`符号各有其独特的功能和应用场景,对于理解和熟练使用这些符号至关重要。 #### #符号的用途 1. **访问根...
在Struts2中,OGNL主要用于访问值栈中的数据,包括Action实例以及它所包含的对象属性。 **1. 访问Action的普通属性** ```html ``` 上述代码展示了如何通过`<s:property>`标签访问值栈中Action实例的一个属性...
总的来说,OGNL是Struts 2中非常重要的组件,它提供了强大的表达式能力,能够方便地处理对象图的导航和数据操作。理解并熟练运用OGNL的这些特性,可以极大地提高开发效率,简化Struts 2应用中的数据绑定和逻辑控制。
3. **在Struts2中的使用**:Struts2标签通常与OGNL结合使用,例如`<s:property value="xx" />`标签用于显示或设置值,这里的`xx`就是OGNL表达式。 4. **特殊符号的使用**: - **“#”符号**:主要用于访问上下文和...
- **计算OGNL表达式值**:当需要在字符串上下文中使用OGNL表达式时,`%`符号就派上用场了。例如,`['foo1']}"/`,这里的`%{}`告诉STRUTS2计算`#foobar['foo1']`的值,并将其作为URL的一部分。 3. `$` 符号: - **...
在Struts2中,井号(#)、星号(*)和百分号(%)在OGNL表达式中扮演着不同的角色。 首先,井号(#)主要与OGNL上下文和Action上下文关联。在Struts2中,#被用来访问OGNL上下文中的对象,这包括ActionContext,它...
### Struts2中#与$的区别及OGNL表达式的运用 #### 一、OGNL概述与Struts2中的角色 **OGNL**(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置Java对象图中的属性。在Struts2框架中,OGNL...
在使用OGNL表达式时,尤其是在Struts2的标签中,需要特别注意`#`、`%`这两个符号的使用。`#`符号有三个主要用途: 1. 访问非根对象,如OGNL上下文和Action上下文,`#`常用于访问ActionContext中的各种上下文属性。 ...
例如,在Struts2框架中,不恰当的使用可能导致代码注入攻击。因此,开发者需要确保在处理用户输入时进行严格的过滤和转义,或者使用安全的OGNL上下文(如Spring MVC中的`@Validated`注解)。 **使用OGNL工具** ...
Action中的属性会被放入ValueStack,从而可以直接在JSP中通过OGNL表达式访问。 8. **ValueStack Debug和Contents** 为了调试目的,可以开启Struts2的值栈调试功能,查看栈中的内容,帮助开发者了解当前请求的状态...
在Struts2中,OGNL作为默认的表达式语言,因为它提供了许多其他语言不具备的功能,例如对对象方法的直接调用、静态方法和属性的访问、赋值操作以及对集合的便捷操作。 1. **对象方法调用**:OGNL允许直接通过表达式...
Struts2提供了简单的数据验证机制,可以在Action类中使用注解或XML配置进行字段级别的验证。此外,还可以自定义验证逻辑,实现业务规则的复杂验证。 ### Struts ValueStack(值栈) ValueStack是Struts2的核心概念...