There are basically two types of controllers: application and infrastructure. An application controller is any code that responds to a specific user request. Such controllers are used to implement the activity flow within use cases in your application. An infrastructure controller is any code that responds generically to user requests and perform functionality that spans multiple application user requests.
For example, in Struts the Action classes you create are application controllers. These are things like "add an item to my shopping cart," "search for a product in the catalog," "display my shopping cart," "log in," "log out," and so on.
The ActionServlet class is the infrastructure controller. That servlet performs generic operations, such as populating form beans, validating form beans, executing the app. controller (an Action object), and dispatching to the appropriate view based on the execute methods return value. [Well, technically the RequestProcessor class/subclass does this work, but the ActionServlet delegates that work to the RequestProcessor.]
So in Struts, any given user request is likely to through the infrastructure controller (ActionServlet) first, which then dispatches the request to the appropriate application controller which performs the actual functionality for that request.