struts2 ognl表达式

来源:互联网 发布:php json decode null 编辑:程序博客网 时间:2024/06/08 11:59
 OGNL对象图导航语言
Object Graphic Navigation Language.
可以单独使用获取关系复杂的数据
eg:
Person p=new Person();
p.setName("张三");
p.setAddress(new Address("上海中兴区","rar"));
ognl.Ognl.setValue("Address.addr", p, "上海交通大学");
String name=(String) ognl.Ognl.getValue("Address.addr", p);
System.out.println(name);
源于ognl.jar工具包.其作用如下:
   (1)对属性获取和设置
   (2)调用对象方法
   (3)调用静态属性和方法
   (4)对集合进行过滤
   (5)支持Java中的运算符,操作符
   (6)定义List常量 {"tom","sun"}
   (7)定义Map常量 #{"M":"男","F","女"}
struts2标签
(1) struts2使用OGNL来访问ValueStack中的信息.
 a. 访问context区域内容语法以"#key"开始
 b. 访问root区域内容语法为"属性名"
(2)struts2提供了很多标签,有些标签属性需要指定OGNL表达式.
 a. 通用标签
debug,property,date,if...else,iterator
bean,push,action,set
 b. 表单标签
form,textfield,password,checkbox,checkboxlist,radio,select,optgroup

思考
   EL表达式为什么能获取Action对象的属性?
   HttpServletRequest request;
   request = new StrutsRequestWrapper(request);
   request.getAttribute("user");
   public class StrutsRequestWrapper extends HttpServletRequestWrapper{
    public Object getAttribute(String key){
    //先去request对象中寻找信息
    Object obj = super.getAttribute(key);
    //如果在原request中找不到,去valuestack中查找
    if(obj == null){
    ValueStack vs = ActionContext.getContext().getValueStack();
    obj = vs.findValue(key);//"name"充当OGNL表达式,从而访问了root区域的Action对象
    }
    return obj;
    }
   
   }
   
<s:iterator value="list.{?#this.age>=18}">满足年龄大于18的子集
<s:property value="@java.lang.Math@PI" />
代码:
package testvaluestack;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.struts2.ServletActionContext;

import bean.Address;
import bean.Person;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class teststack extends ActionSupport
{
private Date date;
private List list;
private int price;
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String execute() {
// TODO Auto-generated method stub
date=new Date();
Map session=ActionContext.getContext().getSession();
session.put("ses", "haha");
Map request=(Map) ActionContext.getContext().get("request");
request.put("res", "request获取");
list=new ArrayList<Address>();
for(int i=0;i<10;i++)
{
Address address=new Address("海淀区"+i+"号","33260"+i);
list.add(address);
}
price=100000;
sex="男";
Person person=new Person();
person.setAddress(new Address("上海","332600"));
person.setName("王五");
person.setPrice(500);
//存放在栈顶的Person对象可以直接通过price获取,重名情况不好获取
ActionContext.getContext().getValueStack().push(person);
/*
* 存放在栈顶的Map 通过person.price获取
* ActionContext.getContext.getValueStack().set("person",person);
* */
System.out.println("hello");
return SUCCESS;
}
}



<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
     <s:property value="person.name"/><br />
  <s:date name="date" format="yyyy-MM-dd hh:mm"/><br />
  ses:<s:property value="#session.ses"/><br />
  res:<s:property value="#request.res"/><br />
  <ul>
  <s:iterator value="list" var="er" status="status">
  <li><s:property value="#status.count"/>.<s:property value="#er.addr"/></li>
  </s:iterator>
  </ul>
  <s:property value="price"/>
  <s:if test="price>100000">太贵了</s:if>
  <s:else>太便宜了</s:else>
  <br />
  <s:if test='sex.equals("男")'>男性</s:if>
  <s:else>女性</s:else><br />
  <s:property value="address.addr"/>
    <s:debug></s:debug><br />
  </body>
</html>
<s:form action="form" namespace="/" theme="simple">//不需要是form提供的主题
    用户名:<s:textfield name="name"></s:textfield>
<br />
    密码:<s:password name="passwd" showPassword="true"></s:password>//回显时默认是不显示密码的
<br />
    年龄:<s:textfield name="age"></s:textfield>
<br /> 
    Email:<s:textfield name="Email"></s:textfield>
<br />
    性别:<s:radio list='#{"M":"男","FM":"女"}' name="sex"></s:radio><br />//list还可以是Map List(后面跟listkey和listvalue List<Sex> )
    爱好:<s:checkboxlist list="#request.likes" name="mylikes"></s:checkboxlist><br />//封装成数组交给bean数据库存字符串
    兴趣:<s:select headerKey="-1" headerValue="--请选择--"list="#request.likes" name="dds"></s:select><br />
    <s:submit value="提交"></s:submit>
</s:form>



<s:form action="sample02" theme="simple">
<s:bean name="tarena.action.ModelBean" var="data"></s:bean>
请选择朋友:<s:select name="friend" list="{}">
<s:optgroup label="男性" list="#data.males" listKey="name" listValue="name"></s:optgroup>//带分组的选择
<s:optgroup label="女性" list="#data.females" listKey="name" listValue="name"></s:optgroup>
</s:select>  <br>
姓名:<s:textfield  name="name"></s:textfield><br/>
密码:<s:password name="pwd" showPassword="true"></s:password><br/>
年龄:<s:textfield name="age"></s:textfield><br/>
Email:<s:textfield name="email"></s:textfield><br/>
性别:<s:radio list='#{"M":"男","F":"女"}' name="sex"></s:radio><br/>
是否已婚:<s:checkbox name="marry"></s:checkbox><br/>
个人爱好:<s:checkboxlist name="myloves" list="#data.loves" listKey="key" listValue="value"></s:checkboxlist>
<br/>
<s:radio name="mylove" list="#data.loves"  listKey="key" listValue="value"></s:radio>
<br/>
爱好:
<s:select name="mylove" emptyOption="true" headerKey="-1" headerValue="--请选择--" list="#data.loves" listKey="key" listValue="value">
</s:select>

</s:form> 


原创粉丝点击