JSF controllers are based on the MVC Controller architecture, with the one exception that unlike true MVC, JSF controllers cannot reflect changes in the Model back to the View asynchronously, since HTTP forbids unsolicited posting to the client.
The controller logic is inside the JSF
servlet and inside the various JSF tags. If you wanted to, you could create your own custom JSF tags with their own controller logic in them, but it's not a simple task.
Controllers are designed to be sharable objects, so you don't "store backing beans" inside them. Instead, the JSF framework manages the binding of the Model, View and Controller components (Backing Bean, JSF View page, and JSF tag). This allows the same controller to be used with multiple model/view pairs. Which is important for things like the inputText tag, since it means only one controller instance for the entire view instead of one per input text control. That reduces the overall memory requirements of the webapp - especially when large numbers of users are involved.
The secret of how to be miserable is to constantly expect things are going to happen the way that they are "supposed" to happen.
You can have faith, which carries the understanding that you may be disappointed. Then there's being a willfully-blind idiot, which virtually guarantees it.