Эта статья морально устарела :( . Приглашаю продолжить ваше знакомство с Salesforce на нашем Форуме!
Спустя некоторое время работы с Salesforce начинаешь понимать что в разработке Visualforce страниц можно выделать два подхода. Чистое использование apex тегов, которые предлагает нам salesforce и традиционное html-javascript программирование с использованием функционала visualforce.
Вообще Salesforce жестко высказывается по этому поводу в пользу чистого apex программирования и даже до недавнего времени всякие javascript frameworks были запрещены для использования на страницах. Но, наверное, мировое сообщество начинает брать вверх и политика salesforce перестает быть столько категоричной.
Насколько я знаю, единственный случай когда стоит учитывать требования Salesforce - это если вы собираетесь выложить свое приложение в AppExcenge. В этом случае Вам предстоит пройти ряд серьезных проверок вашего кода. И тут солянка из html и apex может послужить поводом для возврата приложения на переделку. В остальных случаях подход к разработке страницы ложится на ваши плечи.
Вот типичный пример различия обоих подходов из нашего приложения Library.
<!-- html method -->
<apex:outputPanel layout="block" id="BookTableBox">
<table id="BookTable">
<tr>
<th>Name</th>
<th>ISBN</th>
<th>Date Of Publication</th>
<th>Author</th>
<th></th>
</tr>
<apex:repeat value="{!Books}" var="book">
<tr>
<td>
<apex:outputField value="{!book.Name}"/>
</td>
<td>
<apex:outputField value="{!book.ISBN__c}"/>
</td>
<td>
<apex:outputField value="{!book.Date_Of_Publication__c}"/>
</td>
<td>
<apex:repeat value="{!book.Book_Author__r}" var="author">
<apex:outputField value="{!author.Author__r.Name}"/> <br />
</apex:repeat>
</td>
<td>
<a href="#">Edit</a><br />
<a href="#">Delete</a>
</td>
</tr>
</apex:repeat>
</table>
</apex:outputPanel>
<!-- apex method -->
<apex:dataTable value="{!Books}" var="book" id="BookTable" >
<apex:column >
<apex:facet name="header">Name</apex:facet>
<apex:outputField value="{!book.Name}"/>
</apex:column>
<apex:column >
<apex:facet name="header">ISBN</apex:facet>
<apex:outputField value="{!book.ISBN__c}"/>
</apex:column>
<apex:column >
<apex:facet name="header">Date Of Publication</apex:facet>
<apex:outputField value="{!book.Date_Of_Publication__c}"/>
</apex:column>
<apex:column >
<apex:facet name="header">Authors</apex:facet>
<apex:repeat value="{!book.Book_Author__r}" var="author">
<apex:outputField value="{!author.Author__r.Name}"/> <br />
</apex:repeat>
</apex:column>
<apex:column >
<apex:facet name="header">Action</apex:facet>
<apex:outputLink value="#">Edit</apex:outputLink><br />
<apex:outputLink value="#">Delete</apex:outputLink>
</apex:column>
</apex:dataTable>