1. 程式人生 > 其它 >9.Visualforce 自定義控制器(Custom Controllers)

9.Visualforce 自定義控制器(Custom Controllers)

1.自定義控制器簡介

自定義控制器包含可在 Visualforce 頁面使用的自定義邏輯和資料操作。例如,自定義控制器可以檢索要顯示的專案列表、呼叫外部 Web 服務、驗證和插入資料等等 — 所有這些操作都將對使用它作為控制器的 Visualforce 頁面可用。
控制器通常檢索要在 Visualforce 頁面中顯示的資料,幷包含響應頁面操作(如單擊按鈕)的程式碼。

畢竟眾口難調,並非所有 Web 應用程式都是標準的。當想要覆蓋現有功能、通過應用程式自定義導航、使用呼叫或 Web 服務,或者需要更好地控制訪問頁面資訊的方式時,藉助 Visualforce,這一切都遊刃有餘。可以使用 Apex 編寫自定義控制器,並從頭到尾完全控制應用程式的邏輯。

2.建立使用自定義控制器的 Visualforce 頁面

通過在 <apex:page> controller 屬性中引用控制器類的名稱,將自定義控制器新增到 Visualforce 頁面。
當頁面使用了自定義控制器時,不能再使用標準控制器。頁面使用不同的屬性來設定自定義控制器。

apex:

public class ContactsListWithController {
    private String sortOrder = 'LastName';
    public List<Contact> getContacts() {
        List<Contact> results = Database.query(
            
'SELECT Id, FirstName, LastName, Title, Email ' + 'FROM Contact ' + 'ORDER BY ' + sortOrder + ' ASC ' + 'LIMIT 10' ); return results; } public void sortByLastName() { this.sortOrder = 'LastName'; } public void sortByFirstName() {
this.sortOrder = 'FirstName'; } }

Visualforce page:

<apex:page controller="ContactsListWithController">
    <apex:form>
        <apex:pageBlock title="Contacts List" id="contacts_list">
            <!-- Contacts List -->
            <apex:pageBlockTable value="{! contacts }" var="ct">
                <apex:column value="{! ct.FirstName }"/>
                <apex:column value="{! ct.LastName }"/>
                <apex:column value="{! ct.Title }"/>
                <apex:column value="{! ct.Email }"/>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>

程式碼解析:

在該頁面上,Visualforce 將表示式轉換為對控制器的 getContacts() 方法的呼叫。該方法返回聯絡人記錄列表,這正符合 <apex:pageBlockTable> 的預期。

getContacts() 方法稱為 getter 方法,這是一種通用模式,其中 Visualforce 標記中的 {! someExpression } 自動連線到控制器中名為 getSomeExpression() 的方法。這是頁面訪問需要顯示的資料的最簡單方法。

預覽結果:

 3.在自定義控制器中建立操作方法以響應頁面上的使用者輸入

顯示資料固然重要,但對任何網頁應用來說,響應使用者行為都是必不可少的。藉助自定義控制器,可以通過編寫操作方法來響應使用者活動,在頁面上建立大量的自定義操作。

Visualforce page:

<apex:page controller="ContactsListWithController">
    <apex:form>
        <apex:pageBlock title="Contacts List" id="contacts_list">
            <!-- Contacts List -->
            <apex:pageBlockTable value="{! contacts }" var="ct">
                <apex:column value="{! ct.FirstName }">
                    <apex:facet name="header">
                        <apex:commandLink action="{! sortByFirstName }"
                            reRender="contacts_list">First Name
                        </apex:commandLink>
                    </apex:facet>
                </apex:column>
                <apex:column value="{! ct.LastName }">
                    <apex:facet name="header">
                        <apex:commandLink action="{! sortByLastName }"
                            reRender="contacts_list">Last Name
                        </apex:commandLink>
                    </apex:facet>
                </apex:column>
                <apex:column value="{! ct.Title }"/>
                <apex:column value="{! ct.Email }"/>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>

預覽結果:通過點選FirstName,LastName來實現排序

 程式碼分析:

新標記向每個 <apex:column> 元件添加了兩個巢狀元件。<apex:column> 本身有一個純文字標題,但我們想讓標題變成可點選的效果。

<apex:facet> 允許我們自定義列標題的內容。我們想要的是一個呼叫正確操作方法的連結。連結是使用 <apex:commandLink> 元件建立的,將 action 屬性設定為引用控制器中操作方法的表示式。

(請注意,與 getter 方法相比,操作方法名稱與引用操作方法的表示式相同。)

單擊連結會觸發控制器中的操作方法。操作方法更改私有變數的排序,然後重新顯示錶。重新顯示錶時,會重新評估 {! contacts },通過剛設定的排序重新執行查詢。最終結果是按照使用者點選請求的順序重新排列表格。