OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言,經過它簡單一致的表達式語法,能夠存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。中文名是對象圖導航語言,咱們一般叫作S標籤。html
那麼,怎麼在一個jsp頁面中導S標籤呢?只要在jsp頁面的頂部寫上這行代碼:<%@ taglib uri="/struts-tags" prefix="s"%>,就能夠將S標籤導入頁面中使用了。java
Struts 2默認的表達式語言是OGNL。OGNL既能夠取值,又能夠做爲頁面標籤使用。apache
首先簡單介紹一下經常使用的OGNL頁面標籤:jsp
form表單<s:form>
文本框:<s:textfield></s:textfield>
多行文本:<s:textarea></s:textarea>
密碼框:<s:password></s:password>
下拉框:<s:select list="#{1:'請選擇',2:'吃飯',3:'睡覺'}" name="select"></s:select>
下拉框:<s:combobox list="#{1:'請選擇',2:'吃飯',3:'睡覺'}" name="下拉框" ></s:combobox>
單選框:<s:radio list="#{1:'打豆豆',2:'吃飯',3:'睡覺'}" name="單選框" value="1"></s:radio>
多選框:<s:checkboxlist list="#{1:'打豆豆',2:'吃飯',3:'睡覺'}" name="多選框" value="2"></s:checkboxlist>
</s:form>
標籤在form表單裏使用會自動換行,多選框也有另外一種複雜一點的寫法。可是ONGL不會做爲經常使用的頁面標籤,由於咱們通常寫頁面都有html的標籤。ide
那麼,既然它不會做爲頁面標籤被咱們經常使用,就來說一下它的另外一種用法,取值:它經常使用來獲取值棧裏面的值。spa
既然說到值棧,那麼先簡單介紹一下值棧。debug
值棧是struts2裏面自己提供的一種存儲機制,相似於域對象,值棧,能夠存值和取值。存儲在action對象中,每次訪問action都會建立一個action對象,action對象裏面有且只有一個值棧的對象。3d
值棧的存值形式分爲兩種,一種是保存在content中,結果是map集合。另外一種是保存在root中,結果是list集合。咱們經常使用的是root。值棧有一個最大的特色就是先進後出,存在於最頂端的值可稱爲棧頂元素,上一個元素和下一個元素之間的關係可稱爲壓棧。code
獲取值棧對象:ActionContext actionContext = ActionContext.getContext();orm
ValueStack stack1 = actionContext.getValueStack();
package com.action; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.entity.Person; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.ValueStack; public class IndexAction extends ActionSupport { private String name; public String getName() { return name; } private Person p; public Person getP() { return p; } private List<Person> lp = new ArrayList<>(); public List<Person> getLp() { return lp; } @Override public String execute() throws Exception { // // 獲取值棧對象 // ActionContext ac = ActionContext.getContext(); // // 值棧對象 存在於action對象中 (每一次訪問action就會產生一個新的action對象) // ValueStack vs = ac.getValueStack(); // vs.push("PUSH開頭"); // vs.set("name", "哈哈"); // vs.push("PUSH結尾"); // 單個變量 name = "哈哈"; // 單個對象 p = new Person(); p.setName("haha"); p.setAge(18); p.setSex("男"); // 單個集合 lp.add(new Person("asd", 1, "男")); lp.add(new Person("asda", 12, "男")); // 域對象 HttpServletRequest req = ServletActionContext.getRequest(); req.setAttribute("name", "我是域對象的值"); return SUCCESS; } }
<!-- 獲取值值棧對象(Map) --> <s:property value="name"/> <!-- 獲取值 (String) --> <s:property value="[2].top"/> --%> <!-- 獲取值 獲取單個 變量 --> <s:property value="name"/><br> <!-- 獲取值 獲取單個對象 --> <s:property value="p.name"/> <s:property value="p.age"/> <s:property value="p.sex"/><br> <!-- 獲取值 集合 第一種方式--> <s:property value="lp[0].name"/> <s:property value="lp[1].name"/><br> <!-- 獲取值 集合 第二種方式--> <s:iterator value="lp"> <s:property value="name"/> <s:property value="age"/> <s:property value="sex"/><br> </s:iterator> <!-- 獲取值 集合 第三種方式--> <s:iterator value="lp" var="a"> <s:property value="#a.name"/> <s:property value="#a.age"/> <s:property value="#a.sex"/><br> </s:iterator> <!-- 獲取值 集合 第四種方式--> <c:forEach items="${lp}" var="p"> ${p.name} ${p.age} ${p.sex} </c:forEach> <!-- 獲取值 域對象 --> <s:property value="#request.name"/> <!-- s標籤裏放變量值 --> <!-- value所綁定的值是值棧裏面name的值 --> <s:textfield value="%{name}"></s:textfield> <!--在頁面上輸出一個字符串--> <s:property value="'OGNL'"/><!--能夠看見值棧裏面全部的對象和值--> <s:debug></s:debug>