Struts2(九)OGNL标签一与Struts2标签

一、什么是OGNL

 Object Graph Navigation Language对象图导航语言。

是Struts2默认的表达式语言,开源,功能更强大。和EL表达式有点相似

存取对象的属性,调用对象的方法

访问静态方法,静态属性

访问值栈及Stack Context

支持赋值、运算操作、字段类型转化等。

二、简单例子

导入所需要的struts2的包

web.xml增加struts2过滤器

<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>

实体类

package com.pb.entity;

/*
 * 街道实体类
 */
public class Street {
    private int streetId;            //街道ID
    private String streetName;    //街道名称

    public Street() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Street(int streetId, String streetName) {
        super();
        this.streetId = streetId;
        this.streetName = streetName;
    }
    public int getStreetId() {
        return streetId;
    }
    public String getStreetName() {
        return streetName;
    }
    public void setStreetId(int streetId) {
        this.streetId = streetId;
    }
    public void setStreetName(String streetName) {
        this.streetName = streetName;
    }

}
package com.pb.entity;
/*
 * 房子实体类
 */
public class Hourse {

    private int hourseId;  //房屋ID
    private String hourseName;    //房屋名称
    private Street street;            //房屋所在街道

    public Hourse() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Hourse(int hourseId, String hourseName, Street street) {
        super();
        this.hourseId = hourseId;
        this.hourseName = hourseName;
        this.street = street;
    }
    public int getHourseId() {
        return hourseId;
    }
    public String getHourseName() {
        return hourseName;
    }
    public Street getStreet() {
        return street;
    }
    public void setHourseId(int hourseId) {
        this.hourseId = hourseId;
    }
    public void setHourseName(String hourseName) {
        this.hourseName = hourseName;
    }
    public void setStreet(Street street) {
        this.street = street;
    }

}

HourseAction

package com.pb.web.action;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.Hourse;
import com.pb.entity.Street;

public class HourseAction extends ActionSupport {
        private Hourse hourse;

        @Override
        public String execute() throws Exception {
            //声明街道对象
            Street street =new Street(001,"南新路");
            hourse=new Hourse(11,"一房一厅",street);
            return SUCCESS;
        }

        public Hourse getHourse() {
            return hourse;
        }

        public void setHourse(Hourse hourse) {
            this.hourse = hourse;
        }

}

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/" extends="struts-default">
    <action name="hourse" class="com.pb.web.action.HourseAction">
    <result name="success">
    /ognl1.jsp
    </result>
    </action>
    </package>

</struts>

ognl1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OGNL一</title>
</head>
<body>
房屋的名称:<s:property value="hourse.hourseName"/>
房屋的街道名称:<s:property value="hourse.street.streetName"/>
<s:debug/>
</body>
</html>

在地址栏中输入

http://localhost:8080/OGNLDemo1/hourse.action

发生页面跳转,并取出其中的值

三、访问值栈中的值

四、访问List 、Map、Set

struts.xml

    <action name="ognl" class="com.pb.web.action.OgnlAction">
    <result name="success">
    /ognllist.jsp
    </result>
    </action>

ognllistAction

package com.pb.web.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 com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.Street;

public class OgnlAction extends ActionSupport {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private List<Street> streetList;
    private Map<String, Street> streetMap;
    private Set <Street> streetSet;
    public List<Street> getStreetList() {
        return streetList;
    }
    public void setStreetList(List<Street> streetList) {
        this.streetList = streetList;
    }
    public Map<String, Street> getStreetMap() {
        return streetMap;
    }
    public void setStreetMap(Map<String, Street> streetMap) {
        this.streetMap = streetMap;
    }
    public Set<Street> getStreetSet() {
        return streetSet;
    }
    public void setStreetSet(Set<Street> streetSet) {
        this.streetSet = streetSet;
    }

    @Override
    public String execute() throws Exception {
        streetList=new ArrayList<Street>();
        streetList.add(new Street(1, "高新南一路"));
        streetList.add(new Street(2, "高新南二路"));
        streetList.add(new Street(3, "高新南三路"));
        streetMap=new HashMap<String,Street>();
        streetMap.put("k1", new Street(4, "高新南四路"));
        streetMap.put("k2", new Street(5, "高新南五路"));
        streetMap.put("k3", new Street(6, "高新南六路"));
        streetSet =new HashSet<Street>();
        streetSet.add(new Street(7, "高新南七路"));
        streetSet.add(new Street(8, "高新南八路"));
        streetSet.add(new Street(9, "高新南九路"));
        return SUCCESS;
    }

}

jsp页页

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OGNL一</title>
</head>
<body>
<h1>List</h1>
访问List<s:property value="streetList" /><br/>
访问List中第一个元素:<s:property value="streetList[0].streetName" /><br/>
List中的大小:<s:property value="streetList.size()" /><br/>
List是否为空:<s:property value="streetList.isEmpty()" /><br/>
自定义集合List:<s:property value="{1,2,3,4,5}" /><br/>
自定义集合List访问第一个元素:<s:property value="{1,2,3,4,5}[0]" /><br/>
<hr/>
<h1>Map</h1>
访问Map<s:property value="streetMap" /><br/>
访问Map中第一个元素:<s:property value="streetMap[‘k1‘].streetName" />|<s:property value="streetMap.k1.streetName"/><br/>
访问Map 中所有key:<s:property value="streetMap.keys" /><br/>
访问Map 中所有values:<s:property value="streetMap.values" /><br/>
Map中的大小:<s:property value="streetMap.size()" /><br/>
Map是否为空:<s:property value="streetMap.isEmpty()" /><br/>
自定义集合Map:<s:property value="#{‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘}" /><br/>
自定义集合Mapt访问第一个元素:<s:property value="#{‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘}[‘k1‘]" />|<s:property value="#{‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘}.k1" />

<br/>
<hr/>
<h1>Set</h1>
访问Set<s:property value="streetSet" /><br/>
访问Set中第一个元素:<s:property value="streetSet.toArray()[0].streetName" />|<s:property value="streetSet.toArray()[0].streetName"/><br/>
Set中的大小:<s:property value="streetSet.size()" /><br/>
Set是否为空:<s:property value="streetSet.isEmpty()" /><br/>
<hr/>
<s:debug/>
</body>
</html>

在页面中输入:http://localhost:8080/OGNLDemo1/ognl.action访问

五、访问静态方法和投影

5.1、访问静态方法和静态属性

package com.pb.demo;
public class Demo {
public final static String STR="STATIC STR";
public static String staticMethod(){
String info="Demo Static Method";
return info;
}
}

在ognl2.jsp 中可以通过如下代码访问该类的静态属性以及静态方法:

<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>OGNL 对象图导航语言</h1>
调用静态方法:<s:property value="@[email protected]()"/> <br>
调用静态常量:<s:property value="@[email protected]"/>
<s:debug/>
</body>
</html>

struts.xml

//开启静态方法
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />

其中<constant>常量你可以去default.properties 文件中查找并复制使用。

5.2、访问投影

选择就是过滤满足选择条件的集合元素。选择操作的语法是:collection.{X YYY},其中X
是一个选择操作符,后面则是选择用的逻辑表达式,而选择操作符有三种:
?选择满足条件的所有元素
^选择满足条件的第一个元素
$选择满足条件的最后一个元素

package com.pb.entity;
/*
 * 用户名
 */
public class User {
    private Integer age;
    private String name;
    private String pasword;
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public User(String name, String pasword, Integer age) {
        super();
        this.name = name;
        this.pasword = pasword;
        this.age = age;
    }
    public Integer getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    public String getPasword() {
        return pasword;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setPasword(String pasword) {
        this.pasword = pasword;
    }

}
package com.pb.web.action;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User;

public class UserAction extends ActionSupport {
    private User user;
    private List<User> users=new ArrayList<User>();
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    @Override
    public String execute() throws Exception {
        User u1 = new User();
        u1.setName("zhangsan");
        u1.setPasword("zhangsan");
        u1.setAge(10);
        this.users.add(u1);
        User u2 = new User();
        u2.setName("lisi");
        u2.setPasword("lisi");
        u2.setAge(23);
        this.users.add(u2);
        User u3 = new User();
        u3.setName("wangwu");
        u3.setPasword("wangwu");
        u3.setAge(22);
        this.users.add(u3);
        return SUCCESS;
    }

}

struts.xml

<package name="default" namespace="/" extends="struts-default">
    <action name="login" class="com.pb.web.action.UserAction">
    <result name="success">
    /ognl.jsp
    </result>
    </action>
    </package>

jsp页面

<%@taglib prefix="s" uri="/struts-tags" %>
<!-- 年龄大于18 的所有用户的姓名 -->
集合元素过滤:<s:property value="users.{?#this.age>18}.{name}"/><br/>
<!-- 年龄大于18 的所有用户的第一个用户的姓名 -->
集合元素过滤:<s:property value="users.{^#this.age>18}.{name}"/><br/>
<!-- 年龄大于18 的所有用户的最后一个用户的姓名 -->
集合元素过滤:<s:property value="users.{$#this.age>18}.{name}"/><br/>
时间: 2025-01-07 13:04:57

Struts2(九)OGNL标签一与Struts2标签的相关文章

struts2中ognl标签详解

<body> <s:set name="age" value="61" /> <!-- if elseif else 参数test:决定标志里的内容是否显示的表达式,类型boolean 注:else标志没有这个参数 --> <h3>if语句</h3> <s:if test="{age>60}"> 老年人 </s:if> <s:elseif test=&

Struts2的OGNL标签详解

一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以分为两类: 表当标签:表单标签主要用与生成HTML页面的from元素,以及普通表单元素的标签. 非表单标签:非表单标签主要用于生成页面的树.Tab页等. 流程控制标签:主要包含用于实现分页.循环等流程的标签. 数据访问标签:主要包含用于输出ValueStack中的值,完成国际化等功能的标签. Str

struts2第四天——拦截器和标签库

一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能,有很多拦截器,每次执行一部分拦截器,比如一些默认拦截器等 默认拦截器的位置在 core的jar包的struts-default.xml里边<interceptor>标签里边 二.拦截器基本原理 拦截器在什么时候执行: 在action对象创建之后和action方法执行之前进行执行(使用在相关位置打断

struts2的返回类型、struts的标签库、struts2中完成国际化

struts2的返回类型:在jsp-servlet中, 返回的类型主要有 转发, 重定向: 转发主要是RequestDispatcher的forward方法来进行操作的req.getRequestDispatcher("goods/queryGoodFenYe.jsp").forward(req, resp);重定向主要使用response对象的一些方法来操作:1.response.sendRedirect("index.jsp");2.response.addHe

Struts2中UI标签之表单标签介绍

1.在Struts2中UI标签的表单标签分为两种:form标签本身和单个表单标签. 2.Struts2表单标签包括:form.textfield.password.radio.checkbox.checkboxlist.select.doubleselect.combobox.optiontransferselect.optgroup.updownselect.textarea.hidden.file.label.submit.token.head.datepicker.reset.richte

Struts2中s:set标签和s:if标签小结

1.  s:set标签 格式:<s:set name="" value="" scope=””/> 说明:把jsp页面中的一个值,以name存储起来.Scope存储的范围是在application.session.request.page…….默认是存储在该action中. 用法①:<s:set name="miloList" value="{‘java’,’php’,’C#’}"/> 这个值是一个li

Struts2中UI标签之表单标签的一个例子

1.最近写了一篇文章,介绍了一下Struts2中UI标签的表单标签,文章地址为:http://blog.csdn.net/u012561176/article/details/44986183  因为缺少了个例子,大家看文字和表格也看不出什么效果来,所以今天来介绍一个例子,用Struts2中UI标签的表单标签实现一个个人信息的表单,但是有些表单标签没有演示出来,大家可以根据我介绍UI标签的表单标签来进行学习,这里只是给个例子. 2.首先新建一个Struts2项目,项目名为PersonMess

struts2之如何使用复杂的UI标签

转载请注明:http://blog.csdn.net/uniquewonderq 问题: 练习使用复杂的UI标签,并给框体福默认值,标签包括: 7.单选框标签 8.多选框标签 9.下拉框标签 在上一节案例的基础上,继续模拟,使用这3类标签. 步骤一:单选框标签 单选框有两种用法, 根据其初始化radio方式的不同,可以好分为静态和动态2种方式.首先我们使用静态方式来初始化客户性别选项,并根据客户数据勾选客户性别,需要在update_customer.jsp上使用单选框标签来实现 .代码如下: <

Struts2之OGNL表达式

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.Struts2框架使用OGNL作为默认 的表达式语言. 相对于EL表达式,它提供了平时我们需要的一些功能,如: 支持对象方法调用,如xxx.sayHello(); 支持类静态方法调用和常量值访问,表达式的格式为@[类全名(包括包路径)]@[方法名|值名],例如:@[email protected]('foo%s','bar')或@[email protected]_NAME;