Struts2 04--- 值棧 ognl(S標籤)

       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>
相關文章
相關標籤/搜索