导航:
1.标准控制器
2.自定义控制器
3.创建一个控制器扩展
标准控制器
操作方法可以从页面标记调用使用{!}符号的action参数的标签。
- apex:commandButton 创建调用操作的按钮
- apex:commandLink 创建调用操作的链接
- apex:actionPoller 定期调用操作
- apex:actionSupport 使另一个命名组件上的事件(如“onclick”、“onmouseover”等)调用操作
- apex:actionFunction 定义一个调用动作的新JavaScript函数
- apex:page 加载页时调用操作
下表描述了操作方法所支持的所有标准控制器。你可以把这些行为与任何Visualforce组件包括一个action属性
Action | Description |
---|---|
save | 插入新记录或更新现有记录(如果它当前在上下文中)。此操作完成后,save操作将用户返回到原始页面(如果已知),或将用户导航到已保存记录的详细信息页面. |
quicksave | 插入新记录或更新现有记录(如果它当前在上下文中)。与保存操作不同,此页面不会将用户重定向到其他页面. |
edit | 将用户导航到当前位于上下文中的记录的编辑页。此操作完成后,编辑操作将用户返回到用户最初调用该操作的页面. |
delete | 删除当前在内容中的记录。此操作完成后,delete操作刷新页面或将用户发送到关联对象的选项卡. |
cancel | 中止编辑操作。此操作完成后,取消操作将用户返回到用户最初调用编辑的页面. |
list | 返回标准列表页的PageReference对象,基于该对象最近使用的列表筛选器。例如,如果标准控制器是contact,并且用户查看的上一次筛选列表是上周新建的,则会显示上周创建的联系人. |
例如,下面的页面允许你更新一个account。当你点击Save,保存操作将会被触发在标准控制器当中,并且这个account将会被更新。
<apex:page standardController="Account">
<apex:form>
<apex:pageBlock title="My Content" mode="edit">
<apex:pageBlockButtons>
<apex:commandButton action="{!save}" value="Save"/>
</apex:pageBlockButtons>
<apex:pageBlockSection title="My Content Section" columns="2">
<apex:inputField value="{!account.name}"/>
<apex:inputField value="{!account.site}"/>
<apex:inputField value="{!account.type}"/>
<apex:inputField value="{!account.accountNumber}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
自定义控制器
1.自定义控制器和控制器扩展
标准控制器能够为visualforce 页面提供所有的你需要的功能,因为它们作用于一个标准页面时包括了相同的逻辑。例如,如果你使用标准Accounts 控制器时,在一个Visualforce页面点击Save按钮和在一个标准的Account中编辑页面保存的结果在操作上完全一致。
然而,如果你想要取覆盖一个已经存在的功能,通过一个应用自定义导航,使用图表或者Web服务,或者如果你需要细粒度控制哪些信息需要被关联到你的页面,你能写一个自定义控制器或者一个控制器扩展用Apex:
2.什么是自定义控制器和控制器扩展?
一个自定义控制器是一个Apex类实现的所有逻辑页面没有利用标准控制器。使用自定义控制器当你希望Visualforce页面完全在系统运行模式,不执行当前用户的权限和字段级安全。
一个控制器扩展是一个Apex类,它扩展了标准或自定义控制器的功能。使用控制器扩展时:
- 你想利用一个标准的内置功能控制器但覆盖一个或多个操作,如编辑、视图,保存或删除。
- 你想要去添加一个新的操作。
- 你想要遵从用户的权限去建立一个Visualforce 页面。相反,它在用户模式下执行,其中应用当前用户的权限、字段级安全性和共享规则。
3.创建一个自定义控制器
一个自定义控制是一个Apex类,为外部、顶层类使用默认、无构造参数。你不能创建一个包含参数的自定义构造控制器。
1.在设置中,在Quick Find box中进入Apex Classes,然后选择Apex Classes。
2.点击New。
3.单击版本设置以指定Apex的版本和用于此类的API。如果您的组织已从AppExchange安装了托管包,则还可以指定要与此类一起使用的每个托管包的版本。对所有版本使用默认值。这将类与Apex和API的最新版本以及每个托管包相关联。如果要访问与最新包版本不同的组件或功能,可以指定托管包的旧版本。您可以指定Apex的旧版本和API来维护特定的行为。
4.在类编辑器中,输入类的Apex代码。单个类的长度可以高达100万个字符,不包括注释、测试方法或使用@isTest定义的类。
5.单击“保存”保存更改并返回“类详细信息”屏幕,或单击“快速保存”保存更改并继续编辑类。在保存类之前,Apex类必须正确编译。
案例:
下面是一个自定义控制器的简单案例:
public class MyController {
private final Account account;
public MyController() {
account = [SELECT Id, Name, Site FROM Account
WHERE Id = :ApexPages.currentPage().getParameters().get('id')];
}
public Account getAccount() {
return account;
}
public PageReference save() {
update account;
return null;
}
}
下面的Visualforce标记显示了如何在页面中使用上面的自定义控制器:
<apex:page controller="myController" tabStyle="Account">
<apex:form>
<apex:pageBlock title="Congratulations {!$User.FirstName}">
You belong to Account Name: <apex:inputField value="{!account.name}"/>
<apex:commandButton action="{!save}" value="save"/>
</apex:pageBlock>
</apex:form>
</apex:page>
创建一个控制器扩展
控制器扩展是任何包含构造函数的Apex类,该构造函数只接受一个类型的参数ApexPages.standard控制器或CustomControllerName,其中CustomControllerName是要扩展的自定义控制器的名称。
下面是一个控制器扩展的简单案例:
public class myControllerExtension {
private final Account acct;
// The extension constructor initializes the private member
// variable acct by using the getRecord method from the standard
// controller.
public myControllerExtension(ApexPages.StandardController stdController) {
this.acct = (Account)stdController.getRecord();
}
public String getGreeting() {
return 'Hello ' + acct.name + ' (' + acct.id + ')';
}
}
下面的Visualforce标记显示了如何在页面中使用上面的控制器扩展:
<apex:page standardController="Account" extensions="myControllerExtension">
{!greeting} <p/>
<apex:form>
<apex:inputField value="{!account.name}"/> <p/>
<apex:commandButton value="Save" action="{!save}"/>
</apex:form>
</apex:page>