Struts2 OGNL的一個例子--標簽詳解析

jopen 12年前發布 | 29K 次閱讀 Struts2 Web框架

目錄結構:

Struts2 OGNL的一個例子--標簽詳解析

下面直接給出源碼:

ognl.jsp:

<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>OGNL示例</title>
</head>
<body> 
    <!--  OGNL顯示request、response中的值  -->      
    <h3 align="left">Session和Request值</h3> 
    request.materialName: <s:property value="#request.materialName" /><br/>
    session.materialName: <s:property value="#session.materialName" /><br/> 

    <!--  OGNL顯示條件表達式過濾的數據  -->
    <h3 align="left">根據條件顯示數據</h3>
    <p>價格小于50元的建材</p>
    <ul>
        <s:iterator value="materials.{?#this.mainbid <50}">
            <li><s:property value="materialName"/> 建材價格是 <s:property value="mainbid"/>元!</li>
        </s:iterator>
    </ul>
    <p> "人造石臺面" 的庫存數量是: <s:property value="materials.{?#this.materialName=='人造石臺面'}.{mount}[0]"/></p>

    <!--  OGNL新建Map類型數據集合,顯示子元素值  -->
    <h3 align="left">Map數據顯示</h3>
    <s:set name="frank" value="#{'material':'歐龍無苯油漆(六度)', 'mount':'500'}" />
    <p>供銷商frank手里還有建材: <s:property value="#frank['material']" /></p>
    <p>庫存量為:<s:property value="#frank['mount']" /></p>   
</body>
</html>

 現給出上面各個標簽的詳細釋義:

1.<s:property value="#request.materialName" />:顯示出屬性名為"#request.materialName"的屬性值,#表取的不是"值棧"中的值。

request見下面說明:

request  

 包含當前HttpServletRequest的屬性的Map  

 #request.userName相當于request.getAttribute("userName")

標簽總意思:取出request中存放的值。

2.<s:iterator value="materials.{?#this.mainbid <50}">:iterator標簽功能是對某個集合中的所有屬性進行迭代遍歷;?是條件判斷,是取所有符合條件的數據;

{}表示的是一個集合。materials.{?#this.mainbid <50}:#this代表當前元素,即materials的元素的實例;整體表示取出材料價格小于50的所有數據構成一個List集合,設為list。

標簽總意思:迭代顯示出取出的List數據集合list中所有行記錄。

3.<s:property value="materials.{?#this.materialName=='人造石臺面'}.{mount}[0]"/>:前半部分和上面解析是一樣的,即得到材料名稱為"人造石臺面"的List數據集合,設為list;

然后就成了"list.{mount}[0]",集合中第個元素包含實例屬性"材料名materialName","材料價格mainbid","材料數量mount",即取list集合中實例屬性mount的List集合,再取其中的第一個元素。

標簽總意思:在總的材料中取材料名為"人造石臺面"的集合中排在第一位的材料數量,并顯示出來。

4.<s:set name="frank" value="#{'material':'歐龍無苯油漆(六度)', 'mount':'500'}" />:set標簽是對一個變量指定一個值(默認范圍是Stack Context);

按key-value對的方式存于Map結構的變量中。<s:set name="A" value="#{'a','b','c'}">這樣也是可以的,只是取值方式不一樣而已。

標簽總意思:將key-value對('material'-'歐龍無苯油漆(六度)', 'mount'-'500')存于變量名為"frank"的非valueStack中。

5.<s:property value="#frank['material']" />:用"['key']"的方式訪問存于變量"frank"中的value。

標簽總意思:訪問key='material'的value值。

struts.xml:

<?xml version="1.0" encoding="gb2312"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name="struts.i18n.encoding" value="gb2312"/>  
    <package name="Tag" extends="struts-default">
        <!-- 創建Action -->
        <action name="ognl" class="action.OgnlExampleAction">
            <result name="success">/jsp/ognl.jsp</result>
        </action>      
    </package>
</struts>

 由ognl.jsp頁面提交的數據,要經struts.xml導航,靠的識別標志是<action>中的name屬性:"ognl",注意它是與ognl.jsp前綴匹配的,不能隨便起名。

OgnlExampleAction.java:

package action;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import model.Material;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class OgnlExampleAction extends ActionSupport {  
    //設置request、response參數和需要顯示的數據集合定義
    private HttpServletRequest request;
    private HttpSession session;
    private List<Material> materials;

    public String  execute() throws Exception {
            request = ServletActionContext.getRequest();
            session=request.getSession();
            //設置request、session存放值
            request.setAttribute("materialName","人造石臺面 From request");
            session.setAttribute("materialName","歐龍無苯油漆(六度) From session");

            //初始化數據集合,集合類型為List
            materials = new ArrayList<Material>();
            materials .add(new Material("歐龍無苯油漆(六度)", 100, 2000));
            materials .add(new Material("6*10mm門套線紅影木夾板飾面(單面)", 20, 2900));
            materials .add(new Material("人造石臺面", 56, 800));
        return SUCCESS;
    }

    public HttpServletRequest getRequest() {
        return request;
    }

    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }

    public HttpSession getSession() {
        return session;
    }

    public void setSession(HttpSession session) {
        this.session = session;
    }

    public List<Material> getMaterials() {
        return materials;
    }

    public void setMaterials(List<Material> materials) {
        this.materials = materials;
    }
}

這是一個Action類,繼承了ActionSupport類(Provides a default implementation for the most common actions.),實現了execute()方法。

注意request、session、materials三個實例變量,就是它們的getter/setter與jsp頁面進行交互的。

否則,#request、#session、#materials. . .無從用起。
Material.java:

package model;

//材料對象
public class Material {
    //材料名
    private String materialName;
    //材料價格
    private int mainbid;
    //材料數量
    private int mount;

    //構造初始化數據
    public Material(String materialName, int mainbid, int mount) {
        super();
        this.materialName = materialName;
        this.mainbid = mainbid;
        this.mount = mount;
    }

    public String getMaterialName() {
        return materialName;
    }

    public void setMaterialName(String materialName) {
        this.materialName = materialName;
    }

    public int getMainbid() {
        return mainbid;
    }

    public void setMainbid(int mainbid) {
        this.mainbid = mainbid;
    }

    public int getMount() {
        return mount;
    }

    public void setMount(int mount) {
        this.mount = mount;
    }
}

 這是"材料對象",在jsp中#this就是指這個對象。在Action類中就是創建了三個此對象,并添加到了ArrayList集合中。


 結果:

Session和Request值

request.materialName: 人造石臺面 From request
session.materialName: 歐龍無苯油漆(六度) From session //"歐....."這個字串第一次不輸出,刷新頁面時才顯示

根據條件顯示數據

價格小于50元的建材

  • 6*10mm門套線紅影木夾板飾面(單面) 建材價格是 20元!

"人造石臺面" 的庫存數量是: 800

Map數據顯示

供銷商frank手里還有建材: 歐龍無苯油漆(六度)

庫存量為:500

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!