Advertisement

从零开始掌握SpringMVC:核心流程与常用注解实战

阅读量:

1. MVC流程详解

1.1 Http请求到DispatcherServlet

在Spring MVC框架中,所有的HTTP请求都会首先经过一个核心的Servlet——DispatcherServlet。它是整个Spring MVC的前端控制器,负责接收请求并将其分发到合适的处理器。示例代码(web.xml配置):

复制代码
    <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
      
      
      
      
      
      
      
      
      
    

1.2 HandlerMapping寻找处理器

DispatcherServlet接收到请求后,会通过HandlerMapping寻找合适的处理器(Controller)。HandlerMapping是一个接口,其实现类用于映射请求URL到具体的Controller方法。示例代码(基于注解的配置):

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
    }
    
    
      
      
      
      
      
      
      
      
      
    

1.3 调用处理器Controller

找到合适的处理器后,DispatcherServlet会调用这个处理器(Controller)的方法来处理请求。Controller是一个用来定义请求处理逻辑的组件。示例代码:

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
    }
    
    
      
      
      
      
      
      
      
      
      
    

1.4 Controller调用业务逻辑处理后返回ModelAndView

Controller处理请求后,通常会返回一个ModelAndView对象。这个对象包含了视图名和模型数据,视图名用于指示渲染哪个视图,模型数据用于传递到视图中进行展示。示例代码:

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/hello")
    public ModelAndView hello() {
        ModelAndView mav = new ModelAndView("hello");
        mav.addObject("message", "Hello, World!");
        return mav;
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
    

1.5 DispatcherServlet查询ModelAndView并进行视图解析

DispatcherServlet会使用视图解析器(ViewResolver)来解析ModelAndView对象中的视图名,生成最终的视图对象。示例代码(配置视图解析器):

复制代码
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    </bean>
    
    
      
      
      
      
      
    

1.6 ModelAndView反馈浏览器HTTP响应

最终,DispatcherServlet将生成的视图对象和模型数据传递给视图引擎,渲染出HTML并返回给浏览器作为HTTP响应。

2. MVC常用注解

2.1 @Controller

@Controller是一个标注,用于声明一个类是Spring MVC中的Controller。示例代码如下:

复制代码
    @Controller
    public class ExampleController {
    // 处理请求的方法
    }
    
    
      
      
      
      
    

2.2 @RequestMapping

@RequestMapping用于映射请求URL到具体的处理器方法或类上。示例代码如下:

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
    }
    
    
      
      
      
      
      
      
      
      
      
    

2.3 @ResponseBody

@ResponseBody注解用于直接将方法的返回值作为HTTP响应体,而不是解析为视图。示例代码如下:

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/data")
    @ResponseBody
    public String data() {
        return "{\"message\":\"Hello, World!\"}";
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
    

2.4 @PathVariable

@PathVariable用于将URL中的占位符参数绑定到方法参数上。示例代码:

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/user/{id}")
    @ResponseBody
    public String getUser(@PathVariable("id") int userId) {
        return "User ID: " + userId;
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
    

2.5 @RequestParam

@RequestParam用于将请求参数绑定到方法参数上。示例代码如下:

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/greet")
    @ResponseBody
    public String greet(@RequestParam("name") String name) {
        return "Hello, " + name;
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
    

3. 实战案例:实现一个简单的SpringMVC应用

3.1 创建SpringMVC项目结构

首先,我们需要创建一个标准的Maven项目,并在pom.xml中添加Spring MVC的依赖。

复制代码
    <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.9</version>
    </dependency>
    </dependencies>
    
    
      
      
      
      
      
      
      
    

3.2 配置DispatcherServlet

在web.xml中配置DispatcherServlet。

复制代码
    <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
      
      
      
      
      
      
      
      
      
    

3.3 定义Controller处理请求

创建一个Controller类来处理请求。

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/hello")
    public ModelAndView hello() {
        ModelAndView mav = new ModelAndView("hello");
        mav.addObject("message", "Hello, World!");
        return mav;
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
    

3.4 使用注解处理路径和参数
利用各种注解处理请求路径和参数。

复制代码
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @RequestMapping("/greet")
    @ResponseBody
    public String greet(@RequestParam("name") String name) {
        return "Hello, " + name;
    }
    
    @RequestMapping("/user/{id}")
    @ResponseBody
    public String getUser(@PathVariable("id") int userId) {
        return "User ID: " + userId;
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

3.5 集成业务逻辑

将业务逻辑集成到Controller中。

复制代码
    @Service
    public class GreetingService {
    public String greet(String name) {
        return "Hello, " + name;
    }
    }
    
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
    @Autowired
    private GreetingService greetingService;
    
    @RequestMapping("/greet")
    @ResponseBody
    public String greet(@RequestParam("name") String name) {
        return greetingService.greet(name);
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

3.6 配置视图解析器

在Spring配置文件中配置视图解析器。

复制代码
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    </bean>
    
    
      
      
      
      
      
    

3.7 运行项目并验证

运行项目并通过浏览器验证功能是否正确。

访问 http://localhost:8080/example/hello ,应该看到“Hello, World!”。
访问 http://localhost:8080/example/greet?name=John ,应该看到“Hello, John”。
访问 http://localhost:8080/example/user/1 ,应该看到“User ID: 1”。

全部评论 (0)

还没有任何评论哟~