Submit form load results instead of messages
The example of @Ajay was not working for me. 
This one do. Hope this help.

public function buildForm(array $form, FormStateInterface $form_state) {

    // Your $form fields here ...

    $form['actions']['#type'] = 'actions';
    $form['actions']['submit'] = array(
      '#type' =&gt; 'submit',
      '#value' =&gt; $this-&gt;t('Save'),
      '#button_type' =&gt; 'primary',
    );

    // Render this field bellow the submit button and above return $form.
    if (!empty($formValues = $form_state-&gt;getValues())){

      $header = ["Key","Value"];

      $output = [];
      foreach ($formValues as $key =&gt; $value) {
        if ($key=='submit'){
          break;
        }
        $output[$key]['key'] = $key;
        $output[$key]['value'] = $value;
      }

      $form['mytable'] = [
        '#type' =&gt; 'table',
        '#header' =&gt; $header,
        '#rows' =&gt; $output,
        '#empty' =&gt; t('No Data'),
      ];
    }

    return $form;
}

public function submitForm(array &amp;$form, FormStateInterface $form_state) {
    $form_state-&gt;setRebuild();
}


Soon I'll write a post about other ways to render form's data in a controller or even with a Private Temp Storage