SpringMVC的架构有什么优势?——控制器(一)

2023-11-08

前言

在这里插入图片描述
「作者主页」雪碧有白泡泡
「个人网站」雪碧的个人网站
「推荐专栏」

java一站式服务
React从入门到精通
前端炫酷代码分享
从0到英雄,vue成神之路
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
数据流通的精妙之道
后端进阶之路

请添加图片描述

在这里插入图片描述

控制器(Controller)

控制器是Spring MVC中最重要的组件之一,它处理来自客户端的请求并返回响应。控制器通常使用注解或XML配置方式将请求映射到处理方法上。
控制器(Controller)是Spring MVC中最重要的组件之一,它负责接收来自客户端的请求并执行相应的业务逻辑,并将结果返回给客户端。Spring MVC框架提供了多种方式来实现控制器,其中最常用的方式是使用注解或XML配置方式将请求映射到处理方法上。

以下是Spring MVC控制器的核心概念和相应的Java代码示例:

1. 控制器(Controller):

控制器负责接收来自客户端的请求,并调用相应的服务层方法来处理请求。在Spring MVC中,控制器通常使用@Controller注解来定义。

@Controller
public class UserController {
    @Autowired
    private UserService userService;
 
    @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    public ModelAndView getUser(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("user", user);
        modelAndView.setViewName("user");
        return modelAndView;
    }
}

在上面的示例中,@Controller注解告诉Spring这是一个控制器类。@RequestMapping注解告诉Spring将请求映射到getUser()方法上。该方法通过调用userService的getUserById()方法来获取用户信息,并将结果添加到ModelAndView对象中,然后将返回的视图名称设置为"user"。

2. 请求映射(Request Mapping):

请求映射指定将HTTP请求映射到处理程序方法的方式。在Spring MVC中,可以使用@RequestMapping注解进行请求映射。

@Controller
public class UserController {
    @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    public ModelAndView getUser(@PathVariable("id") Long id) {
        // 处理GET请求
    }
 
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public String addUser(HttpServletRequest request) {
        // 处理POST请求
    }
}

在上面的示例中,@RequestMapping注解告诉Spring将GET请求映射到getUser()方法上,并将请求参数id作为PathVariable传递给getUser()方法。同样地,@RequestMapping注解也告诉Spring将POST请求映射到addUser()方法上,并使用HttpServletRequest对象获取请求参数。

3. 参数绑定(Request Parameters Binding):

参数绑定指定如何将HTTP请求参数绑定到控制器处理方法的参数上。在Spring MVC中,有多种方式可以进行参数绑定,包括@RequestParam、@PathVariable和@ModelAttribute等注解。

@Controller
public class UserController {
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public ModelAndView getUsers(@RequestParam(value = "page", defaultValue = "1") int page,
                                  @RequestParam(value = "size", defaultValue = "10") int size) {
        List<User> users = userService.getUsers(page, size);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("users", users);
        modelAndView.setViewName("users");
        return modelAndView;
    }
 
    @RequestMapping(value = "/users/{id}", method = RequestMethod.PUT)
    public void updateUser(@RequestBody User user, @PathVariable("id") Long id) {
        userService.updateUser(id, user);
    }
}

在上面的示例中,@RequestParam注解告诉Spring将请求参数映射到getUsers()方法的page和size参数上。@RequestBody注解告诉Spring将HTTP请求正文中的数据绑定到User对象上。

4. 视图解析器(View Resolver):

视图解析器负责将逻辑视图名称解析为实际的视图实现。在Spring MVC中,可以使用InternalResourceViewResolver或其他自定义的视图解析器来解析视图。

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

在上面的示例中,我们配置了一个InternalResourceViewResolver作为视图解析器,并将前缀设置为"/WEB-INF/views/“,后缀设置为”.jsp"。

以上就是Spring MVC控制器的核心概念和相应Java代码示例的详细解释。

5. 数据绑定(Data Binding):

数据绑定是将表单参数绑定到Java对象属性上的过程。在Spring MVC中,可以使用@ModelAttribute注解实现数据绑定。

@Controller
public class UserController {
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public String addUser(@ModelAttribute("user") User user) {
        userService.addUser(user);
        return "redirect:/users";
    }
}

在上面的示例中,@ModelAttribute注解告诉Spring将表单参数映射到User对象上,并将User对象添加到Model中。在JSP视图中,我们可以使用el表达式访问User对象的属性值。

6. 表单验证(Form Validation):

表单验证是确保表单数据符合预期格式并能够通过验证规则的过程。在Spring MVC中,我们可以使用Spring的Validator接口来实现表单验证。

@Controller
public class UserController {
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public String addUser(@Valid @ModelAttribute("user") User user, BindingResult result) {
        if (result.hasErrors()) {
            return "addUser";
        }
        userService.addUser(user);
        return "redirect:/users";
    }
}

在上面的示例中,@Valid注解告诉Spring启用表单验证,并将验证结果保存在BindingResult对象中。如果表单验证失败,则返回"addUser"视图;否则,调用userService的addUser()方法来添加新用户。

7. 异常处理(Exception Handling):

异常处理是处理应用程序中可能发生的异常情况的过程。在Spring MVC中,我们可以使用@ControllerAdvice注解定义全局异常处理器。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = {IOException.class, SQLException.class})
    public ModelAndView handleException(Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("error", ex.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

在上面的示例中,@ControllerAdvice注解告诉Spring这是一个全局异常处理器类。@ExceptionHandler注解告诉Spring该方法处理IOException和SQLException异常。如果应用程序抛出这些异常,则Spring将调用handleException()方法,并将异常信息添加到ModelAndView对象中,然后返回"error"视图。

通过以上的介绍,我们可以看出,Spring MVC控制器包含了多个重要的组件,包括控制器、请求映射、参数绑定、视图解析器、数据绑定、表单验证和异常处理等。只有深入理解这些概念,并熟练掌握相应的Java代码技巧,才能够在实际开发中灵活运用Spring MVC框架,构建高效、可靠、易于维护的Web应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC的架构有什么优势?——控制器(一) 的相关文章

  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • 关于idea导入gradle工程,出现sync failed的问题

    在 精通Spring MVC4 这本书中 作者通篇采用gradle来作为项目构建工具 当我们下载下来随书源码后 想导入到idea中 发现idea控制台正在syncing 在第三步configure时一直出错 有时候依赖下载不下来 你到mav
  • c编译时的错误:程序中有游离的‘\240’‘\302’‘\XXX 时解决方案

    偶尔从网上看到不错的源码 想研究下 不幸编译时遇到 错误 程序中有游离的 240 302 之类的错误 大量的源码不可能再全部重敲一遍 经过一番研究 终于让我找到简单的解决方案 还是本着让后人少走弯路的想法 分享下 首先 编译器提示的 xxx
  • 西门子S7协议格式解析

    文章目录 简介
  • 基于FPGA的超声波测距

    文章目录 一 项目框架 二 超声波测距模块 三 串口模块 1 串口发送模块 2 串口发送控制模块 四 蜂鸣器模块 五 vga显示模块 1 vga协议驱动代码 2 vga数据控制模块 六 数码管 1 数码管段选控制 2 数码管位选 七 顶层文
  • Vue与ElementUI的v-loading控件

    Vue与Element的v loading控件 在需要添加loading动画的组件中加入v loading xxx xxx为true时表示加载 false时关闭加载 默认样式如下 如果要修改样式或者添加文字 则使用element loadi
  • qt调用图片并自适应界面大小显示

    一 前言 记录qt使用图片打开 查看和关闭等操作 实现点击按键 打开选择的指定位置图片 有缩放显示 并可以点击放大按键放大图片 放大后图片自适应电脑窗口大小 大于窗口尺寸会根据最大宽和高缩放 小于窗口尺寸就按原比例居中显示出来 二 环境 w
  • chromedriver不在路径的解决办法

    from selenium import webdriver driver webdriver Chrome 错误信息 WebDriverException Message chromedriver executable needs to
  • BUUCTF-Secret File

    Secret 意为秘密 可知我们需要在网页中寻找到隐藏的flag文件 启动环境打开靶机 直接查看源码 发现一个文件 打开后点击 secret 但是会直接跳转到 end php 并且提示查阅结束 说明页面跳转过快 需要手动抓放包来查看 经过拦
  • 微信 Android 模块化架构重构实践(上)

    转自 https cloud tencent com developer article 1005631 作者 carlguo 微信Android架构历史 微信Android诞生之初 用的是常见的分层结构设计 这种架构简单 清晰并一直沿袭至
  • 解决mysql链接时报错Authentication plugin ‘caching_sha2_password‘ cannot be loaded的问题

    1 打开命令提示符 2 输入 cd C Program Files MySQL MySQL Server 8 0 bin 3 进入到C Program Files MySQL MySQL Server 8 0 bin gt 目录之后 键入
  • NLP学习(二)中文分词技术

    运行平台 Windows Python版本 Python3 x IDE PyCharm 一 前言 这篇内容主要是讲解的中文分词 词是一个完整语义的最小单位 分词技术是词性标注 命名实体识别 关键词提取等技术的基础 本篇博文会主要介绍基于规则
  • Windows中账户没有登录的情况下程序开机自启动

    windows打开任务计划程序 开始菜单 所有程序 管理工具 任务计划程序 打开后点击右边创建任务 在常规界面填写启动名称描述等信息 安全选项勾选不管用户是否登录都要运行 我这里为了保险起见还勾选了使用最高权限 在触发器界面选择新建 开始任
  • c++运算符

    运算符 作用 用于执行代码的运算 1 算术运算符 下表显示了 C 支持的算术运算符 假设变量 A 的值为 10 变量 B 的值为 20 则 运算符 描述 实例 把两个操作数相加 A B 将得到 30 从第一个操作数中减去第二个操作数 A B
  • 程序员学数据库那些事儿

    最近有人问 是问 不是请教 我数据库怎么学 要学哪些 以下我谈一些个人想法 其实我的数据库知识不是很扎实 真心的 当年我学这个东西时某个大神告诉我 学会sql server 走遍天下都不怕 事实上 这几年如果只会sqlserver根本到哪都
  • C++ 构造函数和析构函数是否可以继承?

    先看一个例子 cpp view plain copy include
  • 架构师需要了解的Paxos原理、历程及实战

    架构师需要了解的Paxos原理 历程及实战 数据库高可用性难题 数据库的数据一致和持续可用对电子商务和互联网金融的意义不言而喻 而这些业务在使用数据库时 无论 MySQL 还是 Oracle 都会面临一个艰难的取舍 就是如何处理主备库之间的
  • linux下部署redis

    基础知识 1 Redis的数据类型 字符串 列表 lists 集合 sets 有序集合 sorts sets 哈希表 hashs 2 Redis和memcache相比的独特之处 1 redis可以用来做存储 storge 而memcache
  • Java必懂之命名规范

    定义规范的目的是为了使项目的代码样式统一 使程序有良好的可读性 在此我从网上查找了一篇写得比较好的文章 来让大家学习 顺便自己复习一下 有时候自己写的类名不符合规范 Eclipse会出现黄色叹号 就是表示你的命名不规范 然而 规范不是规定
  • 微信小程序image图片自适应宽度比例显示的方法

    我们都知道微信小程序的组件image是用来显示图片的 它有一下几个属性 1 src 图片资源地址2 mode 图片裁剪 缩放的模式3 binderror 当错误发生时 发布到 AppService 的事件名 事件对象event detail
  • SpringMVC的架构有什么优势?——控制器(一)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架