🎮
Spring MVC

Controllers

@Controller vs @RestController
💡 Controller ek TRAFFIC POLICE OFFICER hai — incoming requests (traffic) ko dekhta hai, DECIDE karta hai kya karna hai (business logic call karna), aur SAHI response (direction) waapas bhejta hai — chahe wo ek PAGE (view) ho ya raw DATA (JSON).

@Controller purani-style Spring MVC hai — method return type ek VIEW NAME hota hai, jo ViewResolver ke through ACTUAL HTML page mein resolve hota hai (server-side rendering, jaise Thymeleaf templates). @RestController = @Controller + @ResponseBody — return value SEEDHA response body mein serialize ho jaata hai (JSON), NO view rendering.

Modern applications (React/Angular frontend + Spring backend) mein, @RestController hi PRIMARY choice hai — backend sirf DATA (JSON) provide karta hai, UI rendering frontend framework ki responsibility hai.

@RestController
@RequestMapping("/api/products")
public class ProductController {
    private final ProductService service;

    public ProductController(ProductService service) {
        this.service = service;
    }

    @GetMapping
    public List<Product> getAll() {
        return service.findAll();   // JSON array response
    }

    @GetMapping("/{id}")
    public Product getOne(@PathVariable Long id) {
        return service.findById(id);
    }
}
🎮
Controller ek TRAFFIC POLICE OFFICER hai — incoming requests (traffic) ko dekhta hai, DECIDE karta hai kya karna hai (business logic call karna), aur SAHI response (direction) waapas bhejta hai — chahe wo ek PAGE (view) ho ya raw DATA (JSON).
1 / 2
⚡ झट से Recap
  • @Controller = server-side rendered VIEWS ke liye (traditional MVC)
  • @RestController = REST APIs ke liye, JSON/XML response
  • Controller THIN rakho — logic Service layer mein
इस page में (2 subtopics)

@Controller traditional MVC hai — method ka return value ek VIEW NAME hota hai (jaise "home" → home.html render hoti hai, Thymeleaf/JSP se). @RestController = @Controller + @ResponseBody — return value DIRECTLY response body mein jaata hai (JSON/XML), koi view render NAHI hoti. Modern REST APIs mein @RestController hi almost hamesha use hota hai.

@Controller
public class HomeController {
    @GetMapping("/")
    public String home() {
        return "home";   // "home.html" template render hogi
    }
}

@RestController
public class ApiController {
    @GetMapping("/api/users")
    public List<User> getUsers() {
        return userService.findAll();   // directly JSON return hoga
    }
}

@PathVariable URL PATH se values extract karta hai (jaise /users/42 mein "42"). @RequestParam QUERY STRING se values leta hai (jaise /users?page=1 mein "page=1"). Dono ko OPTIONAL bhi banaya ja sakta hai (required=false) aur DEFAULT values di ja sakti hain.

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) { /* ... */ }

@GetMapping("/users")
public List<User> getUsers(
    @RequestParam(defaultValue = "0") int page,
    @RequestParam(required = false) String search
) { /* ... */ }