OGNL:

已下方的例子

public class ListLeagueAction extends ActionSupport{
private List leagueList;
public List getLeagueList() {
return leagueList;
}
public String execute() throws Exception{ 
        ActionContext actCtx = ActionContext.getContext();
        Map<String,Object> application = actCtx.getApplication();
        
        LeagueService leagueSvc = (LeagueService)application.get("leagueSvc");
        // 抓取存在application內的資料
 
        leagueList = leagueSvc.getAllLeagues();     
        
        // Goto the list view
        String path = SUCCESS;
        return path;
   }
}

透過此頁Action去設定leagueList值,以便jsp頁面(如下方jsp頁面)使用OGNL方式來存取資料

 

<s:iterator value="leagueList" var="league" status="loopStatus">
   <s:if test="#loopStatus.odd == true"> 
       <s:set name="color" value="'#DCDCDC'" />
   </s:if>
   <s:else>
   <s:set name="color" value="'#F8F8FF'" />
   </s:else>
        <li style="background-color:<s:property value='color'/>">  
        ${league.title} (${league.year},${league.season})
        </li>    
    </s:iterator> 

已上例子就是透過Action的OGNL方式存取資料

 

 

Collections.unmodifiableList();

介紹這個方法是指,塞進去的List後則不可修改了

Ex:

 private static final List<League> LEAGUES_CACHE = new LinkedList<League>();

private String dataDirectory;
    
    public LeagueService(String dataDirectory) {
        this.dataDirectory  = dataDirectory;
        // Make sure that the leagues cache has been initialized
        synchronized ( LEAGUES_CACHE ) {
            if ( LEAGUES_CACHE.isEmpty() ) {
                cacheLeagues();
            }
        }
    }
 
 
 private void cacheLeagues() {
    File leagueFile = new File(dataDirectory, "leagues.txt");
        BufferedReader leagueReader = null;
        
        try {
            leagueReader = new BufferedReader(new FileReader(leagueFile));
            String record;
            
            // Read every record (one per line)
            while ( (record = leagueReader.readLine()) != null ) {
                String[] fields = record.split("\t");
                if(fields.length==4){                
               // Extract the data fields for the record
               int objectID = Integer.parseInt(fields[0]);
               int year = Integer.parseInt(fields[1]);
               String season = fields[2];
               String title = fields[3];
               
               // Create the League object and save it in the cache
               League l = new League(objectID, year, season, title);
               LEAGUES_CACHE.add(l);
                }
                
            } // END while loop
            
        } catch (Exception e) {
            System.err.println(e);
            
            // Clean up IO resources
        } finally {
            if ( leagueReader != null ) {
                try { leagueReader.close(); } catch (IOException e) { System.err.println(e); }
            }
        }
    } // END of cacheLeagues method

 

  public List<League> getAllLeagues() {
        // Return an immutable List; which makes this read-only
        return Collections.unmodifiableList(LEAGUES_CACHE);
    }

 

上面也就是組完List資料後return 出去 ,則此值不可再做更改

 

 

 

第二堂課主要是在網頁的部分,利用Struts2去修改網頁顏色等設定

首先建立一個Class 並且一樣須 繼承 ActionSupport 

而繼承ActionSupport 須實做 execute() 方法

public String execute() throws Exception {
ActionContext context = ActionContext.getContext();
Map<String,Object> application = context.getApplication();

LeagueService leagueSvc =(LeagueService)application.get("leagueSvc");
leagueList = leagueSvc.getAllLeagues();
return SUCCESS;
}

首先ActionContext  元件有很多好用的屬性 而我們使用的是  裡頭的getApplication屬性

此屬性回傳的是map 故下方的值須用map型別來接

(http://struts.apache.org/release/2.0.x/struts2-core/apidocs/com/opensymphony/xwork2/ActionContext.html  官網參考)

再來看到 LeagueService  是已經寫好的頁面,目的是要用來接所需的資料 ,OK後則會一樣 return SUCCESS

然後一樣在src下新增一個Strut.xml 並定一個action ,class指向上方的class 如下方class屬性的路徑

<action name="list_leagues" class="duke.soccer.web.ctrler.servlet.mytest2" method="execute">
<result name="success">jsp/list_leagues.jsp</result>
</action>

將action 取名list_leagues 就像給它個ID ,再給他個result 用來接class所 return 回來

的狀況,因class 回傳為'success'所以我們給她回傳的名稱是"success"

並給予動作是連結到jsp/list_leagues.jsp 這一頁

 

再來就去看我們的jsp頁面

<ul>
<li><a href='<s:url action="list_leagues" var="helloLink" />'>List all leagues</a></li>
<li><a href='jsp/reg_select_league.jsp'>Register for a league</a></li>
</ul>
<a href="${helloLink}">Hello Link</a>

<s:url action="list_leagues" var="helloLink" /> 利用struts2標簽(要用時頁面開端記得

要匯入<%@ taglib prefix="s" uri="/struts-tags" %>)  prefix="s"就是<s: 表示

,可以看到 此動作 去呼叫 list_leagues, 而var則是類似給他此動作的呼叫名稱(如果沒給賄直接呈現結果)

既然給了var="helloLink" ,則下發就有OGNL方式去接"helloLink": href="${helloLink}"

 

接下來去看我們會連置的頁面  jsp/list_leagues.jsp

<ul>
<s:iterator value="leagueList" var="league" status="loopStatus" >
<s:if test="#loopStatus.odd == true">
<s:set name="Color" value="'#CCFF66'" />
</s:if>
<s:else>
<s:set name="Color" value="'#FFFFFF'" />
</s:else>

<li style="background-color:<s:property value="Color" />">${league.title} (${league.year},${league.season})</li>

</s:iterator>
</ul>

關於一些相關標簽 可去關網 http://struts.apache.org/release/2.1.x/docs/home.html 查詢

iterator 這的status 命名為 "loopStatus"目的是在抓ID時用的,可看見範例程式下方code有#loopStatus就是抓此ID

vlaue="leagueList" 則是指一開始我們 Class 內的leagueList (此變數在執行execute時已取得相關資料)

有趣的是 Struts標籤一樣可以做 if else 陳述句

<s:if test="如果怎樣.."    則<s:set 就會怎樣...   <s:else 否則   <s:set 又會怎樣...

#loopStatus.odd == true   指的是 如果loopStatus 是屬於單數行(odd) 時。

另外如果眼尖會發現 value = " '#XXXX'  "  加了單引號,目的是因為"#" 字,會怕被網頁誤以為是抓XXXX 這ID

接下來 Value 值就可以用 property 標籤來取 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 JoshS 的頭像
    JoshS

    JoshS的部落格

    JoshS 發表在 痞客邦 留言(0) 人氣()