To create a custom frontend controller in Magento 2, you need to follow these steps:

1. Create a Custom Module

First, you need to create a custom module. Let’s say your module is named Vendor_Module.

2. Define a Custom Route

Create a routes.xml file in app/code/Vendor/Module/etc/frontend/:
 
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="module" frontName="module" sortOrder="10">
            <module name="Vendor_Module"/>
        </route>
    </router>
</config>

3. Create Controller

Create a Index.php file in app/code/Vendor/Module/Controller/Index/:
 
<?php
namespace Vendor\Module\Controller\Index;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

class Index extends Action
{
    protected $_resultPageFactory;

    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    ) {
        $this->_resultPageFactory = $resultPageFactory;
        parent::__construct($context);
    }

    public function execute()
    {
        $resultPage = $this->_resultPageFactory->create();
        // Set title of page
        $resultPage->getConfig()->getTitle()->set(__('Hello world'));
        return $resultPage;
    }
}

4. Create the Layout XML File

Create a module_index_index.xml file in app/code/Vendor/Module/view/frontend/layout/:
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <block class="Magento\Framework\View\Element\Template" name="module_index" template="Vendor_Module::index.phtml"/>
        </referenceContainer>
    </body>
</page>

5. Create the Template phtml File

Create a index.phtml file in app/code/Vendor/Module/view/frontend/templates/:
 
<p>sample text</p>

To create a custom backend controller in Magento 2, you need to follow these steps:

1. Create a Custom Module

First, you need to create a custom module. Let’s say your module is named Vendor_Module.

2. Define a Custom Route

Create a routes.xml file in app/code/Vendor/Module/etc/adminhtml/:
 
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="module" frontName="module">
            <module name="Vendor_Module" />
        </route>
    </router>
</config>

3. Create Controller

Create a Index.php file in app/code/Vendor/Module/Controller/Adminhtml/Index/:
 
<?php
namespace Vendor\Module\Controller
<?php

namespace Vendor\Module\Controller\Adminhtml\Index;

use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

class Index extends Action
{

    protected $resultPageFactory;


    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    ) {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }


    public function execute()
    {
        $this->_view->loadLayout();
        $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Tile'));
        $this->_view->renderLayout();
    }
}
 

4. Create the Layout XML File

Create a module_index_index.xml file in app/code/Vendor/Module/view/frontend/layout/:
 
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <block class="Vendor\Module\Block\Adminhtml\CustomBlock" name="custom_block" template="custom_template.phtml"/>
        </referenceContainer>
    </body>
</page>

5. Create the Template phtml File

Create custom_template.phtml in app/code/Vendor/Module/view/adminhtml/templates/:
 
<p>sample text</p>