Spring MVC深度解析:构建现代Web应用

Spring MVC是Java Web开发中最受欢迎的框架之一,本文将详细介绍Spring MVC 4.x的核心概念和实践技巧。

Spring MVC架构

Spring MVC采用经典的MVC(Model-View-Controller)设计模式,通过DispatcherServlet作为前端控制器,统一处理请求和响应。

核心组件

  1. DispatcherServlet
  2. HandlerMapping
  3. Controller
  4. ModelAndView
  5. ViewResolver

配置Spring MVC

web.xml配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Spring MVC配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc">
    
    <mvc:annotation-driven/>
    <context:component-scan base-package="com.example.controller"/>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

控制器开发

RESTful控制器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }
    
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userService.save(user);
        return new ResponseEntity<>(savedUser, HttpStatus.CREATED);
    }
}

表单处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@Controller
@RequestMapping("/users")
public class UserFormController {
    
    @GetMapping("/register")
    public String showRegistrationForm(Model model) {
        model.addAttribute("user", new User());
        return "register";
    }
    
    @PostMapping("/register")
    public String processRegistration(@Valid User user, BindingResult result) {
        if (result.hasErrors()) {
            return "register";
        }
        userService.register(user);
        return "redirect:/users/success";
    }
}

数据验证

Bean Validation

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class User {
    @NotNull
    @Size(min = 4, max = 20)
    private String username;
    
    @Email
    private String email;
    
    @NotBlank
    @Size(min = 6)
    private String password;
}

异常处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) {
        ErrorResponse error = new ErrorResponse("USER_NOT_FOUND", ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }
    
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleGenericError(Exception ex) {
        ErrorResponse error = new ErrorResponse("INTERNAL_ERROR", "An unexpected error occurred");
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

拦截器使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class AuthenticationInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        if (token == null) {
            response.sendError(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
        return true;
    }
}

文件上传

1
2
3
4
5
6
7
8
9
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        String filename = file.getOriginalFilename();
        // 处理文件上传
        return "redirect:/upload/success";
    }
    return "redirect:/upload/failure";
}

性能优化

  1. 使用异步控制器
1
2
3
4
5
6
@GetMapping("/async")
public DeferredResult<ResponseEntity<?>> handleAsync() {
    DeferredResult<ResponseEntity<?>> result = new DeferredResult<>();
    // 异步处理逻辑
    return result;
}
  1. 配置视图缓存
  2. 使用压缩和缓存头
  3. 优化静态资源处理

最佳实践

  1. 使用适当的HTTP方法
  2. 实现合理的错误处理
  3. 采用RESTful API设计
  4. 正确处理跨域请求
  5. 实现安全验证

总结

Spring MVC提供了强大而灵活的Web开发框架,通过合理使用其特性,我们可以构建出高效、安全、可维护的Web应用。

参考资料

  • Spring MVC官方文档
  • Spring实战(第4版)
  • RESTful Web Services Cookbook
使用绝夜之城强力驱动