Spring MVC基础介绍

本文详细介绍了SpringMVC模式在Web开发中的应用,包括模型、视图、控制器的职责,以及数据访问对象、业务对象、拦截器和过滤器的角色。此外,还阐述了SpringMVC框架的工作流程,以及Controller、View、Model的使用方法和参数绑定、响应处理的示例。
摘要由CSDN通过智能技术生成

Spring MVC模式的基本概念

Spring MVC模式是一种基于Java的Web应用程序开发框架,它将Web层分为模型(M),视图(V)和控制器©三层,支持使用Spring框架来进行Web开发。

1. 模型(Model)

模型层是应用程序的核心,它是应用程序中用来处理数据和业务逻辑的部分。在SpringMVC模式中,模型层负责将应用程序的业务逻辑和数据结构分离出来。

2. 视图(View)

视图层是应用程序的用户界面部分,它负责呈现模型层所提供的数据。在SpringMVC模式中,视图层使用JSP或者Thymeleaf模板引擎,来生成HTML页面。

3. 控制器(Controller)

控制层是应用程序中用来处理用户请求和返回响应的部分。在SpringMVC模式中,控制器层负责根据用户请求调用相应的模型层和视图层,并将处理结果传回给客户端。

除了这三层之外,SpringMVC模式还包括其他的相关组件,例如数据访问对象(DAO)、业务对象(Service)、拦截器(Interceptor)和过滤器(Filter)等。

4. 数据访问对象(DAO)

数据访问对象是用来访问数据存储的组件,负责将模型层中的数据存储到数据库中,并从数据库中读取数据供模型层使用。在SpringMVC模式中,我们通常使用Spring框架中的JdbcTemplate或Hibernate等来实现数据访问对象。

5. 业务对象(Service)

业务对象是负责执行业务逻辑的组件,负责从控制器层接收请求并调用模型层和数据访问对象来完成业务逻辑。在SpringMVC模式中,我们通常使用Spring框架中的Service注解来定义业务对象。

6. 拦截器(Interceptor)

拦截器是在控制器层前面进行拦截和处理的组件,它可以被用来实现安全性、日志记录以及国际化等特性。在SpringMVC模式中,我们通常使用Spring框架中的拦截器来实现这些功能。

7. 过滤器(Filter)

过滤器是用来处理HTTP请求和响应的组件,它可以被用来实现系统级别的安全性、日志记录等特性。在SpringMVC模式中,我们通常使用Spring框架中的过滤器来实现这些功能。

二、Spring MVC框架的工作流程

当一个请求到达Spring MVC应用程序时,Spring MVC框架会经过一系列的步骤来处理这个请求并返回响应。下面是Spring MVC框架的工作流程及其相应的流程图:

  1. 客户端发送请求:客户端(浏览器)发送一个HTTP请求到Web服务器,请求一个特定的URL。

  2. 前端控制器接收请求:Web服务器将请求发送给前端控制器(DispatcherServlet),它是Spring MVC框架的入口点。

  3. 前端控制器查询处理器映射器:前端控制器将请求发送给处理器映射器(HandlerMapping),它负责将请求映射到正确的处理程序。

  4. 处理器映射器查找处理器:处理器映射器根据请求的URL信息查找合适的处理器(Controller)来处理请求。

  5. 处理器适配器调用处理器:处理器适配器(HandlerAdapter)将请求传递给处理器(Controller),并调用其相应的方法来处理请求。

  6. 处理器处理请求:处理器根据请求的处理方法执行相应的业务逻辑,例如查询数据库、调用业务对象等,并返回一个模型(Model)和视图(View)。

  7. 处理器返回模型和视图信息:处理器将模型和视图传递给前端控制器,并等待前端控制器的进一步指示。

  8. 前端控制器查询视图解析器:前端控制器将返回的视图信息传递给视图解析器(ViewResolver),它负责将逻辑视图名解析为实际的视图。

  9. 视图解析器解析视图:视图解析器根据逻辑视图名解析为实际的视图对象,例如JSP或Thymeleaf视图。

  10. 前端控制器调用视图:前端控制器将模型和解析后的视图传递给视图,以便渲染视图并生成最终的响应。

  11. 视图渲染响应:视图将模型数据与视图模板进行合并,并生成一个HTML响应。

  12. 前端控制器将响应发送给客户端:前端控制器将生成的HTML响应发送给Web服务器,然后Web服务器将其返回给客户端(浏览器)。

整个流程的封装性和松耦合性使得Spring MVC框架具有良好的灵活性和可扩展性。它将请求的处理流程进行了清晰的划分,使得开发人员能够更加专注于业务逻辑的实现和界面的设计,提高了开发效率。

下面是一个示例流程图,展示了Spring MVC框架的工作流程:
视图层
数据访问层
服务层
控制器层
Web层
发送请求
选择合适的Controller
调用合适的Service/业务逻辑层
调用Mapper/数据访问层
访问数据库并返回数据
调用合适的视图
生成响应结果
View
Controler
Mapper
Service
Controller
DispatcherServlet
客户端

三、Spring MVC中的Controller、View、Model等概念和使用方法

在Spring MVC中,Controller、View、Model是三个重要的概念,也是整个框架的核心,尤其是在MVC架构中。本篇文章将详细解释这三个概念,并使用代码示例演示其使用方法。

1. 控制器(Controller)

控制器是Spring MVC框架中的一个组件,它负责处理请求,并根据请求的内容选择合适的处理程序来处理。它是整个框架的入口点,接收来自客户端(浏览器)的请求,并在Spring容器中查找处理程序,将请求映射到正确的处理程序。控制器还负责将处理程序执行的逻辑结果存储在模型对象中,并选择正确的视图来呈现结果。

在Spring MVC中,控制器通常是一个Java类,并且使用@Controller注解进行标注。例如:

@Controller
public class UserController {
  
    @GetMapping("/users")
    public String listUsers(Model model) {
       // ...
       return "userList";
    }
  
    // ...
}

在上面的示例中,我们声明了一个UserController类,并使用@Controller注解标注该类,这意味着Spring框架会将该类看作一个控制器。该类中的listUsers方法使用@GetMapping注解来指定路由,通过model对象向view传递处理结果,在最后返回视图的名称"userList"。

2. 视图(View)

视图在Spring MVC框架中负责将处理程序执行的逻辑结果呈现出来。视图通常是一个包含HTML、CSS、JavaScript和动态内容的模板文件。Spring MVC框架中有多种视图类型可供选择,包括JSP、Thymeleaf、FreeMarker、Velocity、React等。

在Spring MVC中,视图通常被视图解析器来解析。视图解析器的任务是将逻辑视图名称解析为实际的视图类型。视图解析器检索视图模板并渲染模板,以生成最终的响应。不同类型的视图之间的差异通常是该视图如何编写HTML代码和如何呈现结果。

下面是一个JSP视图的示例代码:

<!DOCTYPE html>
<html>
<head>
    <title>User List</title>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Email</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach items="${users}" var="user">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.name}</td>
                    <td>${user.email}</td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
</body>
</html>

在上面的示例中,我们使用JSP视图来呈现用户列表,通过JSTL标签库从model对象中提取数据来呈现用户列表。

3. 模型(Model)

在Spring MVC框架中,模型用于在处理程序中保存数据,以便在视图中呈现数据。Spring MVC的模型是一个Map类型的对象,其中包含数据对象的键值对。通常,处理程序负责填充模型对象,然后将其传递给视图以呈现数据。

在Spring MVC中,模型对象通常是通过处理程序参数传递的。Spring框架中有多个类型的处理程序参数可用于获取模型对象,例如@ModelAttribute、@PathVariable、@RequestParam和@RequestBody。

下面是一个例子:

@Controller
public class UserController {
  
    @Autowired // 自动注入UserService
    private UserService userService; 
  
    @GetMapping("/users")
    public String listUsers(Model model) {
        List<User> users = userService.findAll();
        model.addAttribute("users", users);
        return "userList";
    }
  
    // ...
}

在上面的示例中,我们使用Model对象(model)从控制器传递数据给视图。我们通过userService对象获取了用户列表,然后将列表添加到Model对象中,model.addAttribute(“users”, users),最后将模型数据作为返回值返回给视图视图的名称为"userList"。

四、Spring MVC的请求处理、参数绑定和响应处理

在Spring MVC中,请求处理、参数绑定和响应处理是非常重要的环节,它们负责接收和处理客户端发送的请求,将数据传递给处理程序,并最终生成响应返回给客户端。

1. 请求处理

在Spring MVC中,请求处理由控制器(Controller)负责。控制器是通过@RequestMapping注解来映射URL路径的,它接收的请求默认使用GET方法,也可以通过@RequestParam注解来指定其他HTTP方法,例如POST、PUT、DELETE等。下面是一个简单的示例:

@Controller
public class UserController {

    @RequestMapping("/users")
    public String listUsers() {
        // 处理逻辑
        return "userList";
    }

    // ...
}

上述示例中,控制器接收到"/users"的GET请求后,处理逻辑并返回一个字符串"userList"作为视图的名称。

2. 参数绑定

在Spring MVC中,控制器方法的参数可以根据请求的参数自动绑定。常用的参数绑定注解有@RequestParam、@PathVariable和@RequestBody。

@RequestParam注解用于绑定请求的查询参数或表单参数到方法的参数。例如,我们可以在控制器方法的参数上添加@RequestParam注解来接收一个名为id的查询参数:

@Controller
public class UserController {

    @RequestMapping("/user")
    public String getUser(@RequestParam("id") Integer userId) {
        // 处理逻辑
        return "userDetail";
    }

    // ...
}

上述示例中,控制器方法接收到名为id的请求参数,并将其绑定到userId参数上。

@PathVariable注解用于绑定请求URL中的路径变量到方法的参数。例如,我们可以在控制器方法的参数上添加@PathVariable注解来接收一个名为id的路径变量:

@Controller
public class UserController {

    @RequestMapping("/user/{id}")
    public String getUser(@PathVariable("id") Integer userId) {
        // 处理逻辑
        return "userDetail";
    }

    // ...
}

上述示例中,控制器方法接收到形如"/user/123"的请求URL,并将路径变量123绑定到userId参数上。

@RequestBody注解用于将请求的内容绑定到方法的参数上。例如,我们可以在控制器方法的参数上添加@RequestBody注解来接收一个JSON格式的请求体:

@Controller
public class UserController {

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public String createUser(@RequestBody User user) {
        // 处理逻辑
        return "userList";
    }

    // ...
}

上述示例中,控制器方法接收到一个JSON格式的请求体,将其绑定到User对象上。

3. 响应处理

在Spring MVC中,响应处理是将处理结果转化为视图并返回给客户端。通常,控制器方法返回一个字符串作为视图的名称,然后视图解析器会根据视图名称解析出对应的视图。视图可以是JSP、Thymeleaf、FreeMarker等模板引擎生成的页面,也可以是纯JSON数据。

例如,我们可以返回一个JSP视图:

@Controller
public class UserController {

    @RequestMapping("/users")
    public String listUsers(Model model) {
        List<User> users = userService.findAll();
        model.addAttribute("users", users);
        return "userList";
    }

    // ...
}

上述示例中,控制器方法将获取到的用户列表数据添加到Model对象中,并返回一个字符串"userList"作为视图的名称。

如果返回的是纯JSON数据,可以使用@ResponseBody注解将方法的返回值直接作为响应体传递给客户端:

@Controller
public class UserController {

    @RequestMapping("/users")
    @ResponseBody
    public List<User> listUsers() {
        List<User> users = userService.findAll();
        return users;
    }

    // ...
}

上述示例中,控制器方法直接返回用户列表数据,并通过@ResponseBody注解将其作为响应体返回给客户端。

五、Spring MVC的常用注解汇总

在Spring MVC中,注解是非常重要的,它们用于标记和配置各个组件,使得开发工作更加简便和高效。

1. @Controller

@Controller注解用于标记一个类作为Spring MVC的控制器类。它将一个类声明为控制器,使得Spring能够自动识别并进行相关的配置和处理。下面是一个示例:

@Controller
public class UserController {
    // ...
}

2. @RequestMapping

@RequestMapping注解用于映射URL路径到控制器的方法。它可以用于类级别和方法级别,并可以指定请求方法、路径参数、头部信息等。下面是一个示例:

@Controller
@RequestMapping("/users")
public class UserController {

    @RequestMapping(method = RequestMethod.GET)
    public String listUsers() {
        // 处理逻辑
        return "userList";
    }

    // ...
}

3. @RequestParam

@RequestParam注解用于绑定请求的查询参数或表单参数到方法的参数。它可以指定参数的名字、是否必需、默认值等。下面是一个示例:

@Controller
public class UserController {

    @RequestMapping("/user")
    public String getUser(@RequestParam("id") Integer userId) {
        // 处理逻辑
        return "userDetail";
    }

    // ...
}

4. @PathVariable

@PathVariable注解用于绑定请求URL中的路径变量到方法的参数。它可以指定变量的名字、是否必需等。下面是一个示例:

@Controller
public class UserController {

    @RequestMapping("/user/{id}")
    public String getUser(@PathVariable("id") Integer userId) {
        // 处理逻辑
        return "userDetail";
    }

    // ...
}

5. @RequestBody

@RequestBody注解用于将请求的内容绑定到方法的参数上。它可以用于接收JSON格式的请求体、XML格式的请求体等。下面是一个示例:

@Controller
public class UserController {

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public String createUser(@RequestBody User user) {
        // 处理逻辑
        return "userList";
    }

    // ...
}

6. @ResponseBody

@ResponseBody注解用于将方法的返回值直接作为响应体传递给客户端。它可以用于返回纯JSON数据、XML数据等。下面是一个示例:

@Controller
public class UserController {

    @RequestMapping("/users")
    @ResponseBody
    public List<User> listUsers() {
        List<User> users = userService.findAll();
        return users;
    }

    // ...
}

7. @ModelAttribute

@ModelAttribute注解用于绑定请求参数到数据模型上,使得模型可以在视图中使用。它可以用于方法级别和方法参数级别。下面是一个示例:

@Controller
public class UserController {

    @ModelAttribute("user")
    public User getUser() {
        return new User();
    }

    @RequestMapping("/user")
    public String createUser(@ModelAttribute("user") User user) {
        // 处理逻辑
        return "userDetail";
    }

    // ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值