SpringMVC从零搭建到核心组件详解:手把手构建企业级Web应用

一、项目初始化与基础配置

1.1 创建Maven聚合项目

在IDE中新建Empty Project作为根项目,通过pom.xml配置全局版本管理:

  1. <properties>
  2. <java.version>1.8</java.version>
  3. <spring.version>5.3.20</spring.version>
  4. </properties>

创建子模块时需注意:

  • 模块类型选择maven-archetype-webapp(传统项目)或maven-archetype-quickstart(需手动添加Web支持)
  • 打包方式强制指定为war<packaging>war</packaging>
  • 推荐使用JDK 1.8+版本以获得完整注解支持

1.2 Web环境配置

src/main目录下创建标准Web目录结构:

  1. webapp/
  2. ├── WEB-INF/
  3. ├── web.xml # 核心配置文件
  4. └── lib/ # 依赖库(Maven自动管理)
  5. └── static/ # 静态资源

关键配置点:

  1. 确保web.xml位于WEB-INF目录下
  2. 动态Web模块版本建议选择4.0(对应Servlet 4.0规范)
  3. 静态资源访问路径默认映射到/static/

二、核心组件配置详解

2.1 DispatcherServlet配置

作为框架入口,需在web.xml中完成双重配置:

  1. <servlet>
  2. <servlet-name>dispatcher</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:spring-mvc.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>dispatcher</servlet-name>
  12. <url-pattern>/</url-pattern> <!-- 关键配置 -->
  13. </servlet-mapping>

路径匹配规则解析

  • /:拦截所有非JSP请求(包括静态资源)
  • *.do:传统路径后缀模式
  • /app/*:路径映射模式
  • 最佳实践:生产环境建议使用/模式配合资源过滤

2.2 Spring MVC配置文件

resources目录下创建spring-mvc.xml,完成三大核心配置:

  1. <!-- 1. 启用注解驱动 -->
  2. <mvc:annotation-driven/>
  3. <!-- 2. 静态资源处理 -->
  4. <mvc:resources mapping="/static/**" location="/static/"/>
  5. <!-- 3. 视图解析器 -->
  6. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  7. <property name="prefix" value="/WEB-INF/views/"/>
  8. <property name="suffix" value=".jsp"/>
  9. </bean>

进阶配置

  • 添加<mvc:default-servlet-handler/>处理未匹配请求
  • 配置拦截器:
    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <bean class="com.example.MyInterceptor"/>
    5. </mvc:interceptor>
    6. </mvc:interceptors>

三、控制器开发实践

3.1 基础控制器实现

  1. @Controller
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @GetMapping("/{id}")
  5. public String getUser(@PathVariable Long id, Model model) {
  6. model.addAttribute("user", userService.findById(id));
  7. return "user/detail"; // 对应/WEB-INF/views/user/detail.jsp
  8. }
  9. @PostMapping
  10. public String createUser(@Valid UserDTO userDTO, BindingResult result) {
  11. if(result.hasErrors()) {
  12. return "user/form";
  13. }
  14. userService.save(userDTO);
  15. return "redirect:/user/" + userDTO.getId();
  16. }
  17. }

关键注解说明

  • @Controller:标识组件为控制器
  • @RequestMapping:路径映射(支持类级和方法级)
  • @GetMapping/@PostMapping:HTTP方法限定
  • @PathVariable:路径参数绑定
  • @Valid:启用参数校验

3.2 高级特性实现

3.2.1 异常处理机制

  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3. @ExceptionHandler(ResourceNotFoundException.class)
  4. public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
  5. return ResponseEntity.status(404)
  6. .body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
  7. }
  8. }

3.2.2 文件上传处理

  1. @PostMapping("/upload")
  2. public String handleFileUpload(
  3. @RequestParam("file") MultipartFile file,
  4. RedirectAttributes redirectAttributes) {
  5. if(file.isEmpty()) {
  6. redirectAttributes.addFlashAttribute("message", "请选择文件");
  7. return "redirect:/upload";
  8. }
  9. try {
  10. byte[] bytes = file.getBytes();
  11. // 文件处理逻辑...
  12. redirectAttributes.addFlashAttribute("message",
  13. "上传成功: " + file.getOriginalFilename());
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. return "redirect:/upload";
  18. }

四、性能优化与最佳实践

4.1 配置优化建议

  1. 线程池配置

    1. <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    2. <property name="corePoolSize" value="5"/>
    3. <property name="maxPoolSize" value="10"/>
    4. <property name="queueCapacity" value="25"/>
    5. </bean>
  2. 缓存控制

    1. @Configuration
    2. public class WebConfig implements WebMvcConfigurer {
    3. @Override
    4. public void addResourceHandlers(ResourceHandlerRegistry registry) {
    5. registry.addResourceHandler("/static/**")
    6. .addResourceLocations("classpath:/static/")
    7. .setCachePeriod(3600); // 缓存1小时
    8. }
    9. }

4.2 安全防护措施

  1. CSRF防护

    1. <mvc:interceptors>
    2. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    3. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    4. <bean class="org.springframework.web.servlet.mvc.WebContentInterceptor">
    5. <property name="cacheSeconds" value="0"/>
    6. <property name="useExpiresHeader" value="true"/>
    7. <property name="useCacheControlHeader" value="true"/>
    8. <property name="useCacheControlNoStore" value="true"/>
    9. </bean>
    10. </mvc:interceptors>
  2. XSS防护

    1. @Configuration
    2. public class XssConfig {
    3. @Bean
    4. public FilterRegistrationBean<XssFilter> xssFilterRegistration() {
    5. FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
    6. registration.setFilter(new XssFilter());
    7. registration.addUrlPatterns("/*");
    8. registration.setOrder(1);
    9. return registration;
    10. }
    11. }

五、调试与问题排查

5.1 常见问题解决方案

  1. 404错误排查流程

    • 检查DispatcherServleturl-pattern配置
    • 验证控制器方法是否被正确扫描(@ComponentScan范围)
    • 确认请求路径与@RequestMapping匹配规则
  2. 静态资源访问问题

    • 确保配置了<mvc:resources><mvc:default-servlet-handler/>
    • 检查浏览器开发者工具中的网络请求路径

5.2 调试技巧

  1. 日志配置

    1. # application.properties
    2. logging.level.org.springframework.web=DEBUG
    3. logging.level.org.springframework.web.servlet.DispatcherServlet=TRACE
  2. 内置工具类
    ```java
    // 获取当前请求信息
    HttpServletRequest request = ((ServletRequestAttributes)
    RequestContextHolder.getRequestAttributes()).getRequest();

// 获取会话信息
HttpSession session = request.getSession();
```

通过本文的系统化讲解,开发者可以完整掌握SpringMVC框架从环境搭建到高级特性开发的完整流程。建议结合实际项目需求,逐步实践文中提到的各项技术点,特别注意配置细节与安全防护措施的实施。对于企业级应用开发,建议进一步研究Spring Security集成、分布式会话管理等高级主题。