一、默認作用域
JavaController是一個基於MVC架構的JavaWeb框架,它的默認作用域是request,這意味着,每一個請求都會創建一個新的JavaController實例,並在該請求處理完成後銷毀。
同時,JavaController支持其他的作用域,如session和singleton,但需要在Controller類上進行標註。
@Controller
@SessionScope // 標註該Controller為session作用域
public class UserController {
// ...
}
二、路由映射
JavaController支持通過@RequestMapping註解進行路由映射,該註解可以作用於類和方法上,使得請求可以被正確地分發到指定的Controller和方法中。
同時,@PathVariable註解也被廣泛應用於JavaController中,可以在路由中包含參數,以便獲得更多的請求信息。
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUserById(@PathVariable Long id, Model model) {
// ...
return "user";
}
}
三、模型綁定
JavaController支持將請求的參數自動綁定到Controller方法的參數上,以及支持通過Model對象向View層傳遞數據。
使用@RequestParam註解可以指定請求參數名和請求參數類型,同時支持默認值和必須性校驗。
@Controller
@RequestMapping("/users")
public class UserController {
@PostMapping("/")
public String createUser(@RequestParam String username,
@RequestParam(required = false, defaultValue = "18") Integer age,
Model model) {
// ...
model.addAttribute("user", newUser);
return "userCreated";
}
}
四、攔截器
JavaController支持攔截器,通過實現HandlerInterceptor接口可以實現在請求前、請求後和之後的視圖渲染過程中執行特定的邏輯。
攔截器可以實現權限控制、日誌記錄等通用的邏輯,同時也非常適合對請求進行性能監控和統計。
public class LoggingInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
LOGGER.info("Received a request: {}, {}", request.getMethod(), request.getRequestURI());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
// ...
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
// ...
}
}
五、異常處理
JavaController支持通過@ControllerAdvice註解的異常處理器來處理Controller中拋出的異常,同時也非常適合集中處理通用異常、進行日誌記錄等操作。
可以通過@ExceptionHandler註解指定處理特定異常類型的邏輯。
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(HttpServletRequest request, BusinessException ex) {
ResultModel result = new ResultModel(ResultStatus.FAILURE);
result.setMessage(ex.getMessage());
LOGGER.error("Failed to handle the request: {}", request.getRequestURI(), ex);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
}
@ExceptionHandler(Exception.class)
public ResponseEntity handleUnexpectedException(HttpServletRequest request, Exception ex) {
ResultModel result = new ResultModel(ResultStatus.FAILURE);
LOGGER.error("Failed to handle the request: {}", request.getRequestURI(), ex);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
}
}
原創文章,作者:SOBB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/144176.html
微信掃一掃
支付寶掃一掃