Visualforce 検索一覧画面実装（View State 確認用）

#１．画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/97758c67-fd5f-5773-48a3-4936de9b84b4.png)

#２．Apex Controller 実装
```java:ContactListController.cls
public with sharing class ContactListController {
    // 【ViewState確認用】
    private String v1 = '11';
        
    // 【ViewState確認用：transient】
    transient public String v2 = '22';
    
    // 【ViewState確認用：Static】
    public Static String v3 = '33';
    
    // 検索条件
    public Contact condition{ get;set; }
    
    // 検索結果リスト
    public List<Contact> results { get;set; }
    
    /**
     * コンストラクタ
     */
    public ContactListController() {
        this.condition = new Contact();
        this.results = new List<Contact>();
    }

    /**
     * クリアボタン処理
     */
    public PageReference clear(){
        this.condition = new Contact();
        this.results = new List<Contact>();
        return null;
    }

    /**
     * 検索ボタン処理
     */
    public PageReference search() {
        try {
            system.debug('condition:' + condition);
        
            // 入力チェック
            If (String.IsBlank(condition.EMail) && String.IsBlank(condition.AccountId)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'メールまたは取引先名のいずれかを入力してください。'));
                return null;
            }

            // 検索条件からSOQLを作成
            String strSoqlQuery = 'select Name, AccountId, Phone, Email from Contact where Id != null ';

            // メール
            String strEMail;
            If (!String.IsBlank(condition.EMail)) {
                strEMail = '%' + condition.EMail + '%';
                strSoqlQuery = strSoqlQuery + ' and EMail like :strEMail';
            }

            // 取引先名
            String strAccountId;
            If (!String.IsBlank(condition.AccountId)) {
                strAccountId = condition.AccountId;
                strSoqlQuery = strSoqlQuery + ' and AccountId =:strAccountId';
            }

            // 対象データを検索する
            system.debug('strSoqlQuery:'+ strSoqlQuery);
            this.results = database.query(strSoqlQuery);
        } catch (Exception e){
             ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, e.getMessage()));
        } 
        return null;
    }
}
```
#３．Visualforce Page 実装
```html:ContactListPage.page
<apex:page controller="ContactListController">
    <apex:form id="theForm">
        <apex:pageBlock title="取引先責任者検索画面">
            <apex:pageMessages id="messagearea" showDetail="false" />
            <apex:pageblockSection id="conditionSection" title="検索" columns="2">
                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="メール" />
                    <apex:inputField value="{!condition.EMail}" />
                </apex:pageBlockSectionItem>
                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="取引先名" />
                    <apex:inputField value="{!condition.AccountId}" />
                </apex:pageBlockSectionItem>
            </apex:pageblockSection>
            <apex:pageBlockButtons id="buttonSection" location="bottom">
                <apex:commandButton value="検索" action="{!search}" style="font-size:12pt;width:100px;height:30px;" reRender="searchresult,messagearea" />
                <apex:commandButton value="クリア" action="{!clear}" style="font-size:12pt;width:100px;height:30px;" reRender="conditionSection,searchresult,messagearea" />
            </apex:pageBlockButtons>
        </apex:pageBlock>
        <apex:outputpanel id="searchresult">
            <apex:pageBlock title="検索結果：" rendered="{!(results.size == 0)}">検索条件に該当するデータがありません</apex:pageBlock>
            <apex:pageBlock id="resultBlock" title="取引先責任者一覧"
                rendered="{!(results.size > 0)}">
                <apex:outputtext style="width:110px" value="結果 : {!results.size}件" />
                <apex:pageblockTable id="resultTable" value="{!results}" var="item">
                    <apex:column >
                        <apex:facet name="header">取引先責任者</apex:facet>
                        <apex:outputLink value="{!URLFOR('/' + item.Id)}">
                            <apex:outputField value="{!item.Name}" />
                        </apex:outputlink>
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">取引先名</apex:facet>
                        <apex:outputField value="{!item.AccountId}" />
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">携帯</apex:facet>
                        <apex:outputField value="{!item.Phone}" />
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">メール</apex:facet>
                        <apex:outputField value="{!item.Email}" />
                    </apex:column>
                </apex:pageblockTable>
            </apex:pageBlock>
        </apex:outputpanel>
    </apex:form>
</apex:page>

```