Spring 构建 Web 应用

本贴最后更新于 3086 天前,其中的信息可能已经时异事殊

 

 

  • Spring MVC 中,请求会首先通过一个单实例的前端控制器--DispatcherServlet,它的任务是查询处理器映射(handler mapping),并将请求发送给 Spring MVC 控制器(controller)

  • 经过逻辑处理产生的信息被称作模型(model)。控制器获取用户提交的信息,将逻辑处理后得到的模型数据打包,并标示出用于渲染输入的视图名,发送到 DispatcherServlet。良好的控制器本身只处理很少甚至不处理工作,而将业务逻辑委托给一个或多个服务对象。

  • DispatcherServlet 使用视图解析器(view resolver) 将视图名匹配为特定的视图实现,交付模型数据。视图使用模型数据渲染输出,通过相应对象传递给客户端。

  • 借助 Servlet3 规范和 Spring3.1 的功能增强,可以使用 Java 将 DispatcherServlet 配置在 Servlet 容器中,而不使用 web.xml。

  • 扩展 AbstractAnnotationConfigDispatcherServletInitializer 的任意类会自动配置 DispatcherServlet 和 Spring 应用上下文。

  • 扩展类的 getServletMappings() 方法将一个或多个路径映射到 DispatcherServlet 上。/表示它会是应用的默认 Servlet,处理进入应用的所有请求。

  • DispatcherServlet 启动时会创建 Spring 应用上下文。扩展类的 getServletConfigClasses() 方法定义 DispatcherServlet 加载的应用上下文时,加载在方法中添加的配置类的 bean(包含 web 组件的 bean,如控制器、视图解析器等)。

  • DispatcherServlet 加载包含 web 组件的 bean,而 ContextLoaderListener 要加载应用中的其他 bean。如驱动应用后端的中间层和数据层组件。

  • 扩展类的 getServletConfigClasses() 方法通过返回带有 @Configuration 注解的类(WebConfig)来定义 DispatcherServlet 应用上下文中的 bean,扩展类的 getRootConfigClasses() 方法通过返回带有 @Configuration 注解的类(RootConfig)来配置 ContextLoaderListener 创建的应用上下文中的 bean。

  • 通过 AbstractAnnotationConfigDispatcherServletInitializer 来配置 DispatcherServlet 是传统 web.xml 方式的替代方案,只能部署到支持 Servlet3.0 的服务器中,如 Tomcat7 或更高的版本。

  • 在 Spring 的 xml 配置中,可以使用 <mvc:annotation-driven> 启动注解驱动的 Spring MVC。

  • 在 Java 配置中,可以使用 @EnableWebMvc 注解修饰类来启动 Spring MVC。

  • WebConfig 扩展 WebMvcConfigurerAdapter 类并重写 configureDefaultServletHandling() 方法,调用 DefaultServletHandlerConfigurerenable() 方法,要求 DispatcherServlet 将静态资源的请求转发到 Servlet 容器的默认 Servlet 上,而不使用 DispatcherServlet 本身处理此类请求。

  • 在 Spring MVC 中,控制器只是在方法上添加 @RequestMapping 注解的类,注解声明了所要处理的请求。方法返回 String 类型的视图名称。

  • @Controller 注解基于 @Component 注解,目的是实现组件扫描。

  • 将路径转移到类级别的 @RequestMapping 上可以定义类级别的请求处理,方法上的 @RequestMapping 注解会对类级别的注解进行补充。

  • @RequestMapping 注解的 value 属性可以接受一个 String 数组,用来映射到多个路径的请求。

  • @RequestMapping 注解修饰的方法中,可以添加 Model 类型的参数。调用 Model 的 addAttribute ()方法,将数据存入 Model 中。Model 实际上是一个 Map,会传递给视图,从而渲染到客户端。

  • 如未指定 addAttribute()key,模型 key 会根据数据类型推断出。如未返回视图名(直接返回了数据),逻辑视图的名称会根据请求路径推断。

  • Spring MVC 允许多种方式将客户端中的数据传递到控制器中处理,包括:查询参数(Query Parameter)表单参数(Form Parameter)路径变量(Path Variable)

  • @RequestParam 注解用来修饰方法中的参数,用来获取请求参数。利用注解的 defaultValue 属性,可以在未获取到请求参数时指定默认值。因请求参数都是 String 类型,所以指定的默认值需要转换为 String 类型。

  • 在理想情况下,要识别资源应该通过 URL 路径进行标示,而不是查询参数。Spring MVC 允许在 @RequestMapping 的路径中添加占位符(用{}括起来),在方法中使用 @PathVariable 获取路径变量。如 @PathVariable 未指定 value 值,会假设占位符名称与方法参数名相同

  • <form> 表单未指定 action 时,会默认提交到展示时的 URL 路径上。

  • @RequestMapping 修饰的方法中,可以添加自定义类型的对象作为参数。对象的属性会使用请求中同名的参数进行填充。

  • InternalResourceViewResolver 会识别控制器方法返回字符串中的 redirect:forward: 确定要将其解析为 重定向/前往 规则。

  • 从 Spring3.0开始,Spring MVC 提供了对 Java 校验 API 的支持,而不需要特殊配置。

  • 在获取请求参数的自定义类中,使用校验参数的注解,如 @NotNull@size(min=5, max=25)等修饰属性,并在控制器方法参数前使用 @Valid 注解开启校验功能。在控制器方法中添加 Errors 类型的参数,即可在方法中使用它的 hasErrors() 方法获得校验结果。需要注意的一点,Errors 参数要紧跟在带有 @Valid 注解的参数后面。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3200 引用 • 8215 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Word
    13 引用 • 41 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖 • 1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 740 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 10 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 204 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 265 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖 • 1 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 508 关注
  • abitmean

    有点意思就行了

    36 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 2 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    159 引用 • 1031 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 57 关注
  • 导航

    各种网址链接、内容导航。

    44 引用 • 177 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 342 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 118 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 518 回帖
  • 安全

    安全永远都不是一个小问题。

    203 引用 • 818 回帖 • 2 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 668 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 318 回帖 • 253 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 92 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 409 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 592 关注