Controllers
@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 = server-side rendered VIEWS ke liye (traditional MVC)
- @RestController = REST APIs ke liye, JSON/XML response
- Controller THIN rakho — logic Service layer mein
@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
) { /* ... */ }