1. 程式人生 > >Struts2框架使用(六)之ognl表達式獲取值

Struts2框架使用(六)之ognl表達式獲取值

div access bsp pri 應用程序 屬性 att post list集合

OGNL 是對象圖導航語言 Object-Graph Navigation Language 的縮寫,它是一種功能強大的表達式語言。

我們可以使用ognl獲取很多值。

例如

我們先編寫一個Action,存入需要讀取的數據。

package com.mrlv.action;

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

import com.mrlv.pojo.Student;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.ValueStack; public class IndexAction extends ActionSupport{ private String name; private int age; private Student student; private List<Student> students; private Map<String, Student> studentMap;
/** * */ private static final long serialVersionUID = 1L; @Override public String execute() throws Exception { System.out.println("執行IndexAction"); ActionContext context = ActionContext.getContext(); // 獲取狹義上的值棧 ValueStack valueStack = context.getValueStack(); valueStack.set(
"name", "張三(valueStack)"); valueStack.set("age", 11); //獲取二次封裝的session Map<String, Object> session = context.getSession(); session.put("name", "王五(session)"); session.put("age", 13); //獲取application Map<String, Object> application = context.getApplication(); application.put("name", "趙六(application)"); application.put("age", 14); student = new Student("小七", 12); students = new ArrayList<Student>(); students.add(new Student("老八",13)); students.add(new Student("老九",14)); studentMap = new HashMap<String,Student>(); studentMap.put("goodStudent", new Student("學霸",20)); studentMap.put("badStudent", new Student("學渣",19)); return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } public Map<String, Student> getStudentMap() { return studentMap; } public void setStudentMap(Map<String, Student> studentMap) { this.studentMap = studentMap; } }

如果想要調用OGNL表達式訪問數據,需要在jsp頭部添加struts的標簽。

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

OGNL 訪問 ValueStack(值棧) 數據,這裏獲取的是

張三(valueStack)11
<s:property value="name"/>
<s:property value="age"/><br>

OGNL 訪問 ActionContext 數據,訪問某個範圍下的數據要用#,如下

#parameters 請求參數 request.getParameter(...),這裏當輸入的url中攜帶?name=AAA&age=12,則會輸出

AAA12
<s:property value="#parameters.name"/>
<s:property value="#parameters.age"/><br>

#request 請求作用域中的數據 request.getAttribute(...),輸出結果

李四(request)12
  <%
     request.setAttribute("name", "李四(request)");
     request.setAttribute("age", "12");
  %>

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

#session 會話作用域中的數據 session.getAttribute(...),輸出結果

王五(session)13
<s:property value="#session.name" />
<s:property value="#session.age"/><br>

#application 應用程序作用域中的數據 application.getAttribute(...),輸出結果

趙六(application)13
<s:property value="#application.name" />
<s:property value="#application.age"/><br>

#attr 按照 page request session application 順序查找值,輸出結果

李四(request)12
<s:property value="#attr.name"/>
<s:property value="#attr.age"/><br>

OGNL獲取集合類的時候方法如下:

  ognl訪問javaBean對象:<s:property value="student.name"/><s:property value="student.age"/><br>
  ognl訪問List集合:<s:property value="students[0].name"/>
  <s:property value="students[0].age"/><br>
  <s:property value="students[1].name"/>
  <s:property value="students[1].age"/><br>
  ognl訪問Map:<s:property value="studentMap[‘goodStudent‘].name"/>
  <s:property value="studentMap[‘goodStudent‘].age"/><br>
  <s:property value="studentMap[‘badStudent‘].name"/>
  <s:property value="studentMap[‘badStudent‘].age"/><br>

OGNL也可以通過表達式獲取靜態變量,或訪問靜態方法。

如果想要訪問靜態方法的話,需要在struts.xml上添加一條配置語句,訪問靜態變量則不用。

<!-- 使用訪問靜態方法的話,需要在struts.xml配置開啟 -->
  <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 

第一個@後面攜帶的是類的路徑名,第二個@攜帶的是靜態變量或方法。

訪問靜態屬性: <s:property value="@com.mrlv.common.MyStatic@str"/><br/>
  <!-- 使用訪問靜態方法的話,需要在struts.xml配置開啟 -->
  訪問靜態方法:<s:property value="@com.mrlv.common.MyStatic@printUrl()"/>

Struts2框架使用(六)之ognl表達式獲取值