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 },通過剛設定的排序重新執行查詢。最終結果是按照使用者點選請求的順序重新排列表格。