Spring MVC基础介绍

Spring MVC模式的基本概念

Spring MVC模式是一种基于Java的Web应用程序开发框架,它将Web层分为模型(M),视图(V)和控制器(C)三层,支持使用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框架的工作流程:

image.png

三、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";
    }

    // ...
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353