Spring MVC框架:构建Web应用程序的基础

发布时间: 2023-12-19 21:13:19 阅读量: 33 订阅数: 42
DOCX

使用Spring MVC构建Web应用程序1

# 1. 简介 ## 1.1 什么是Spring MVC框架 Spring MVC框架是Spring Framework的一部分,用于构建基于Java的Web应用程序。它提供了一种基于MVC(Model-View-Controller)设计模式的方式来构建Web应用程序,使开发者能够更好地分离关注点、提高代码的可维护性和可扩展性。 ## 1.2 Spring MVC框架的优点和特点 Spring MVC框架具有灵活、松耦合、可定制、扩展性强等特点。它还提供了强大的错误处理机制、请求映射、数据绑定等功能,使得开发者能够专注于业务逻辑的实现,而不必过多考虑与HTTP协议相关的细节。 ## 1.3 Spring MVC框架在Web应用程序中的作用 在Web应用程序中,Spring MVC框架可以帮助开发者处理HTTP请求和响应,实现页面跳转、数据展示、表单处理、文件上传等功能。同时,它的灵活性和可定制性也使得开发者可以根据具体需求进行相应的扩展和定制,满足不同的业务场景需求。 # 2. 基本概念 ### 2.1 MVC设计模式简介 MVC(Model-View-Controller)是一种被广泛应用于软件开发中的设计模式。它将应用程序的逻辑分为三个独立的组件:模型(Model)、视图(View)和控制器(Controller)。这种分离的架构使得代码更加模块化、可维护性更强,并且方便多人协作开发。 - **模型(Model)**:负责处理应用程序的数据以及数据相关的逻辑。它通常包含数据库操作、业务逻辑和数据校验等功能。 - **视图(View)**:负责展示数据给用户。它通常是一个用户界面,并且能够根据模型的变化来动态更新显示内容。 - **控制器(Controller)**:负责处理用户的请求以及对应的业务逻辑。它接收用户的输入并将其转发给模型进行处理,同时更新相关的视图展示。 MVC设计模式将应用程序的不同部分解耦,使得各个模块能够独立开发、测试和维护。它的优势在于提高代码的可复用性、可测试性、可维护性,并且便于项目的扩展和迭代。 ### 2.2 Spring MVC框架的核心组件 Spring MVC框架是基于MVC设计模式开发的Web框架,它为开发Web应用程序提供了一些核心的组件和功能。 - **前端控制器(Front Controller)**:DispatcherServlet是Spring MVC框架的前端控制器,负责接收所有的请求并将其分发给相应的控制器进行处理。它充当了整个请求处理流程中的中央调度器,简化了请求的处理方式。 - **处理器映射器(Handler Mapping)**:HandlerMapping负责将请求映射到对应的处理器(控制器),根据URL、请求方法、请求参数等信息来确定具体的处理器。Spring MVC提供了多种处理器映射器的实现,如AnnotationMethodHandlerMapping和RequestMappingHandlerMapping等。 - **处理器适配器(Handler Adapter)**:HandlerAdapter负责调用具体的处理器进行请求的处理,并且负责将处理结果封装为一个ModelAndView对象(包含视图模型和模型数据)。不同类型的处理器需要对应的适配器来进行处理,Spring MVC提供了多种处理器适配器的实现,如HttpRequestHandlerAdapter和RequestMappingHandlerAdapter等。 - **视图解析器(View Resolver)**:ViewResolver负责将处理结果的视图逻辑名称解析为具体的视图对象,通常是一个JSP页面或者其他模板引擎的模板。它为控制器返回的逻辑视图找到对应的物理视图,并进行渲染展示。 - **视图解析器(View Resolver)**:ViewResolver负责将处理结果的视图逻辑名称解析为具体的视图对象,通常是一个JSP页面或者其他模板引擎的模板。它为控制器返回的逻辑视图找到对应的物理视图,并进行渲染展示。 ### 2.3 请求和响应的处理流程 在Spring MVC框架中,请求和响应的处理流程通常包含以下几个步骤: 1. 客户端发送HTTP请求到服务器。 2. 前端控制器(DispatcherServlet)接收到请求,根据请求的URL和其他相关信息,将请求分发给对应的控制器进行处理。 3. 控制器根据请求的参数、路径等信息,执行相应的业务逻辑,并返回处理结果。 4. 前端控制器接收到处理结果,调用适配器(HandlerAdapter)对处理结果进行适配和封装。 5. 适配器将处理结果封装为一个ModelAndView对象,并返回给前端控制器。 6. 前端控制器调用视图解析器(View Resolver)解析逻辑视图名称,将其转换为物理视图对象。 7. 视图对象负责渲染、处理模型数据,并生成HTML等内容作为响应返回给客户端。 8. 客户端接收到响应,并进行展示。 这个过程中,前端控制器充当了整个请求-响应过程中的中央调度器,负责协调不同的组件完成具体的任务。通过这种方式,Spring MVC框架实现了请求和响应的流程控制,使得开发者能够方便地编写和管理Web应用程序,并提供了灵活的扩展和定制的能力。 # 3. 构建Spring MVC应用程序 在本章中,我们将详细介绍如何构建一个基本的Spring MVC应用程序。我们将从搭建开发环境开始,然后配置Spring MVC框架,创建控制器和视图,最后演示如何处理请求和响应。 #### 3.1 搭建开发环境 搭建Spring MVC开发环境的基本步骤包括安装Java开发工具包(JDK)、构建工具(如Maven或Gradle)和集成开发环境(IDE)(如IntelliJ IDEA、Eclipse)。开发人员可以根据自己的喜好选择合适的工具进行搭建。 #### 3.2 配置Spring MVC框架 Spring MVC的配置是通过配置文件或注解来实现的。在配置文件中,我们需要配置DispatcherServlet(前端控制器)、HandlerMapping(处理器映射)、HandlerAdapter(处理器适配器)等核心组件。而基于注解的配置,可以通过在Java类上使用@Controller、@RequestMapping等注解来实现。 ```java // 示例:基于Java配置的Spring MVC配置类 @Configuration @EnableWebMvc @ComponentScan(basePackages = "com.example") public class MvcConfig extends WebMvcConfigurerAdapter { // 配置视图解析器 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } } ``` #### 3.3 创建控制器和视图 在Spring MVC中,控制器负责处理请求并返回视图。开发人员可以创建多个控制器来处理不同的请求。视图则可以是JSP、Thymeleaf、FreeMarker等模板引擎生成的页面。 ```java // 示例:简单的控制器示例 @Controller public class HelloController { @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("message", "Hello, Spring MVC!"); return "hello"; } } ``` #### 3.4 处理请求和响应 处理请求和响应是Spring MVC应用程序的核心功能。请求参数的绑定与校验、表单处理与数据校验、文件上传和下载等都是常见的请求处理场景。而对于响应,则涉及到如何返回页面或数据给客户端。 ```java // 示例:请求参数的绑定与校验 @RequestMapping("/user") public String getUser(@RequestParam("id") int userId, Model model) { // 根据userId查询用户信息并返回 return "userDetail"; } ``` 在本章中,我们介绍了如何搭建开发环境、配置Spring MVC框架、创建控制器和视图,以及处理请求和响应的基本步骤。在下一章中,我们将进一步介绍Spring MVC框架的具体功能和高级特性。 # 4. 具体功能介绍 4.1 请求参数的绑定与校验 在Spring MVC框架中,我们可以通过注解的方式将请求参数绑定到方法的参数上,例如@PathVariable、@RequestParam等注解。同时,Spring MVC也提供了数据校验的支持,可以通过@Valid注解和Validator接口来对请求参数进行校验。 ```java @Controller @RequestMapping("/user") public class UserController { @GetMapping("/{id}") public String getUserInfo(@PathVariable("id") Long userId, Model model) { // 根据userId获取用户信息 User user = userService.getUserById(userId); model.addAttribute("user", user); return "user-info"; } @PostMapping("/create") public String createUser(@Valid @ModelAttribute("user") User user, BindingResult result) { if (result.hasErrors()) { // 校验出错处理 return "create-user"; } userService.createUser(user); return "redirect:/user/" + user.getId(); } } ``` 4.2 表单处理与数据校验 Spring MVC框架支持表单数据的处理和校验,可以通过@ModelAttribute注解将表单数据绑定到对象上,并结合数据校验注解(如@NotNull、@Size等)来对表单数据进行校验。 ```java @Controller public class FormController { @GetMapping("/register") public String showRegistrationForm(Model model) { model.addAttribute("user", new User()); return "register-form"; } @PostMapping("/register") public String processRegistration(@Valid @ModelAttribute("user") User user, BindingResult result) { if (result.hasErrors()) { // 校验出错处理 return "register-form"; } userService.registerUser(user); return "redirect:/login"; } } ``` 4.3 文件上传和下载 Spring MVC框架提供了MultipartFile类来处理文件上传,同时也支持文件下载功能。通过@RequestParam注解可以将上传的文件绑定到方法的参数上,方便进行文件处理。 ```java @Controller public class FileController { @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { // 处理文件上传逻辑 fileStorageService.storeFile(file); return "upload-success"; } @GetMapping("/download/{fileName:.+}") public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) { // 处理文件下载逻辑 Resource resource = fileStorageService.loadFileAsResource(fileName); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); } } ``` 4.4 异常处理和错误页面的展示 Spring MVC框架提供了@ControllerAdvice注解和@ExceptionHandler注解,可以用于统一处理特定类型的异常,并将其映射到相应的错误页面进行展示。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(UserNotFoundException.class) public String handleUserNotFound(UserNotFoundException ex, Model model) { model.addAttribute("error", ex.getMessage()); return "user-not-found"; } @ExceptionHandler(Exception.class) public String handleGlobalException(Exception ex, Model model) { model.addAttribute("error", "Internal Server Error"); return "error"; } } ``` 通过以上代码和注释的说明,可以很清楚地了解Spring MVC框架在具体功能方面的使用和实现。 # 5. 高级特性 在本章中,我们将深入介绍Spring MVC框架的一些高级特性,包括请求拦截器和过滤器、页面模板和视图解析、国际化和本地化支持,以及RESTful API设计和开发。这些特性可以帮助开发人员更好地处理复杂的业务逻辑和提供更灵活的Web应用程序。 #### 5.1 请求拦截器和过滤器 请求拦截器和过滤器可以用于在请求到达Controller之前或之后执行一些特定的逻辑处理。在Spring MVC框架中,我们可以通过实现HandlerInterceptor接口来创建请求拦截器,或者通过配置Filter来创建过滤器。这些拦截器和过滤器可以用于身份验证、日志记录、性能监控等方面,从而可以有效地重用代码和提高系统的可维护性。 ```java // 示例:创建一个请求拦截器 public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在此处进行身份验证等操作 return true; // 如果返回false,则请求将被拦截 } // 其他方法的实现省略 } ``` ```xml <!-- 示例:配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.example.AuthInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` #### 5.2 页面模板和视图解析 Spring MVC框架支持多种页面模板技术,包括JSP、Thymeleaf、Freemarker等。通过视图解析器(ViewResolver)的配置,我们可以灵活地选择适合项目的页面模板技术,并将视图与控制器解耦,使得项目更易于维护和扩展。 ```java // 示例:配置Thymeleaf作为页面模板 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); resolver.setCharacterEncoding("UTF-8"); registry.viewResolver(resolver); } } ``` #### 5.3 国际化和本地化支持 Spring MVC框架提供了国际化和本地化支持,可以帮助我们轻松地实现多语言的Web应用程序。通过配置MessageSource和LocaleResolver,我们可以在页面上显示不同语言的文本信息,并根据用户的偏好设置自动切换语言。 ```java // 示例:配置国际化资源文件和LocaleResolver @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } @Bean public LocaleResolver localeResolver() { AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver(); resolver.setDefaultLocale(Locale.US); return resolver; } ``` #### 5.4 RESTful API设计和开发 在当今的Web开发中,RESTful API已经成为一种流行的API设计风格。Spring MVC框架通过@RestController注解和@RequestMapping注解的结合,能够轻松地构建符合RESTful风格的API,并且提供了丰富的支持,包括内容协商、URI模板、HTTP方法的映射等。 ```java // 示例:创建RESTful API @RestController @RequestMapping("/api/users") public class UserController { @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { // 根据id查询用户信息并返回 } @PostMapping public User createUser(@RequestBody User user) { // 创建新用户并返回 } // 其他方法的实现省略 } ``` 通过学习这些高级特性,开发人员可以更加灵活地处理Web应用程序的复杂业务逻辑,并且提供更加优质的用户体验。 # 6. 最佳实践与扩展 在本章节中,我们将讨论一些关于Spring MVC框架的最佳实践以及如何进行扩展。 #### 6.1 编写可测试和可维护的代码 在开发Spring MVC应用程序时,我们需要关注代码的可测试性和可维护性。为了保证代码质量,我们可以采用以下最佳实践: - 使用依赖注入(DI):通过依赖注入,我们可以更容易地进行单元测试,同时也降低了代码的耦合性。 - 编写单元测试:编写单元测试可以帮助我们尽早发现代码中的bug,并且确保代码的稳定性。 - 使用Mockito等框架进行模拟测试:对于需要模拟外部依赖的场景,我们可以使用Mockito等框架进行模拟测试,提高测试覆盖率。 ```java // 示例代码 @RunWith(MockitoJUnitRunner.class) public class UserControllerTest { @InjectMocks private UserController userController; @Mock private UserService userService; @Test public void testGetUserById() { User expectedUser = new User("1", "John"); Mockito.when(userService.getUserById("1")).thenReturn(expectedUser); User actualUser = userController.getUserById("1"); assertEquals(expectedUser, actualUser); } } ``` #### 6.2 性能优化和缓存策略 在实际项目中,性能优化和缓存策略对于Web应用程序至关重要。在Spring MVC框架中,我们可以通过以下方式进行性能优化: - 使用缓存:Spring提供了对缓存的支持,我们可以通过使用@Cacheable注解来实现方法级别的缓存。 - 前端性能优化:合并、压缩JS和CSS文件,减少HTTP请求数量,使用CDN等方式来提升前端性能。 - 数据库优化:合理设计数据库表结构,增加索引,避免全表扫描等方式来提升数据库性能。 ```java // 示例代码 @Cacheable("userCache") public User getUserById(String userId) { // 查询数据库逻辑 } ``` #### 6.3 集成其他框架和技术 Spring MVC框架本身并不是一种全能的解决方案,我们通常需要与其他框架和技术进行集成,以满足项目的需求。常见的集成包括: - Spring Security:用于身份认证和访问控制。 - Spring Data:用于简化数据访问层的开发。 - Swagger:用于API文档的生成和管理。 - Thymeleaf:用于模板引擎。 ```java // 示例代码 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { // security配置内容 } ``` #### 6.4 Spring MVC框架的发展趋势 Spring MVC框架作为Java领域中使用广泛的Web框架之一,在不断地发展和演进中。未来,我们可以期待以下方面的发展: - 更加响应式的Web开发支持。 - 对Serverless架构的更好集成。 - 更加简化和智能化的配置和开发方式。 综上所述,通过遵循最佳实践、优化性能,集成其他框架和关注框架的发展趋势,我们可以更好地应用和扩展Spring MVC框架,构建出高质量的Web应用程序。
corwn 最低0.47元/天 解锁专栏
买1年送3月
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
专栏简介
《Spring框架核心技术》专栏是一本全面介绍Spring框架的技术指南。专栏从入门到精通,涵盖了Spring框架的多个核心技术和实践,包括快速搭建和运行第一个Spring应用程序、依赖注入的原理与实践、Bean的生命周期管理与托管、面向切面编程、数据库操作、事务管理、Web应用程序开发、RESTful服务开发、Spring Boot快速入门、Spring Security配置、JPA和Hibernate集成、WebFlux技术、微服务架构、缓存管理技术等。此外,还对Spring框架在WebSocket、消息队列、测试驱动开发(TDD)、国际化与本地化支持以及企业集成模式方面进行了全面介绍。无论是初学者还是有经验的开发人员,本专栏都将为您提供详实的教程和实用的技巧,帮助您掌握Spring框架的核心技术,构建可扩展的应用程序。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

【Web开发动态】:用TeeChart构建交互式图表的绝招

![【Web开发动态】:用TeeChart构建交互式图表的绝招](https://docs.devexpress.com/AspNet/images/aspxdataview-databinding-schema122370.png) # 摘要 TeeChart图表库作为一款功能强大的图表工具,在Web开发中被广泛应用于数据可视化。本文首先介绍TeeChart的基础知识和在多种场景下的使用方法,接着深入探讨交互式图表设计的理论和实践,强调用户交互设计的重要性。文章还涉及TeeChart在Web开发中的高级应用,如定制化图表设计、性能优化和跨平台兼容性处理,以及应用案例分析和用户体验优化。最后

【AI案例】:A*算法如何巧妙破解8数码问题?专家深度解析

# 摘要 A*算法作为一种高效且广泛应用于路径规划和搜索问题的启发式算法,尤其在解决8数码问题上表现出色。本文从算法原理出发,详细介绍了A*算法的基础理论、数学模型以及复杂度分析,并深入探讨了其在8数码问题中的具体应用。通过案例演示和性能评估,展现了算法在实际问题中的求解过程和效率。此外,文中还探讨了A*算法的优化策略和在其他领域的扩展应用,并对未来研究方向进行了展望。本文不仅为研究者提供了A*算法的理论和实践指导,而且对AI领域的进一步研究产生了积极的启发作用。 # 关键字 A*算法;8数码问题;启发式搜索;算法优化;路径规划;人工智能 参考资源链接:[A*算法解决8数码问题详解及实验报

打造智能健康监测设备:MAX30100与Wear OS的完美结合

![MAX30100心率血氧中文参考手册](http://c.51hei.com/d/forum/202105/11/170312pfgqjqncn55c5ygh.png) # 摘要 随着科技的发展,智能健康监测设备在个人健康管理领域得到了广泛应用。本文从智能健康监测设备的原理和应用出发,深入探讨了MAX30100传感器的技术规格、数据采集处理,以及其在可穿戴设备中的集成和应用。同时,文章介绍了Wear OS平台的开发环境、基础和高级技术,并展示了如何将MAX30100传感器与Wear OS有效集成。文中还分析了智能健康监测设备行业的发展趋势,提供了成功的案例研究,并对MAX30100与We

ThinkServer RD650终极指南:全面解析与优化秘籍

![ThinkServer RD650终极指南:全面解析与优化秘籍](https://lenovopress.lenovo.com/assets/images/LP0923/ThinkSystem%20SR670%20front-left.jpg) # 摘要 本文详细介绍了ThinkServer RD650服务器的架构特点、硬件升级与性能优化、系统管理、软件部署与优化,以及高可用性解决方案。针对硬件层面,本文探讨了CPU和内存升级策略、存储和网络性能优化方法,以及冷却与电源管理的改进措施。在系统管理方面,涵盖了BIOS和固件管理、远程管理和监控、以及维护与故障排除的最佳实践。软件部署章节则着

CATIA粗略度参数优化秘籍:掌握高度参数设置与优化

![CATIA粗略度参数优化秘籍:掌握高度参数设置与优化](https://avatars.dzeninfra.ru/get-zen_doc/1716636/pub_5e301e0a10e48f03b9e28e00_5e301ebaaae5af326295e1c9/scale_1200) # 摘要 本文概述了CATIA粗略度参数优化的过程与应用,强调了参数的基础知识及其在工业设计中的重要性。文章首先阐释了粗略度参数的定义、设计作用以及与制造工艺的关系,接着对不同标准下的参数进行分类和对比。通过实际操作的步骤介绍,文章分析了参数设置中常见的问题,并提出了优化策略和技巧。案例分析部分展示了如何将

【台达VFD-B变频器节能运行模式】:绿色能源应用的黄金法则

# 摘要 本文全面介绍了台达VFD-B变频器的概述、节能运行理论基础、节能设置与操作实践以及未来绿色能源应用前景。首先概述了台达VFD-B变频器的基本信息,随后探讨了节能运行的理论基础,包括能效比(EER)和节能原理,负载类型对节能效果的影响以及技术参数的解读。在实际应用方面,详细介绍了节能模式的设置流程、操作中的节能案例分析和变频器的维护与故障诊断。最后,探讨了台达VFD-B变频器在节能运行模式实践中的编程技巧、网络功能应用以及节能效果的长期跟踪与评估。文章还展望了绿色能源政策下的变频器发展,未来技术趋势以及推广节能运行模式的策略建议,旨在为实现高效节能提供参考。 # 关键字 台达VFD-

【ASM高可用性设计】:盈高业务连续性的关键技巧

![【ASM高可用性设计】:盈高业务连续性的关键技巧](https://www.axis-solutions.fr/wp-content/uploads/2022/05/schema-RDS-serveur-machines-virtuelles-et-acces-sessions-1024x560.png) # 摘要 本文深入探讨了ASM(异步状态机)高可用性设计的理论基础和实施技术。首先介绍了高可用性架构的基础知识,阐述了可用性的定义、度量标准、设计原则,以及系统监控与故障预测的重要性。随后,文章详细解析了ASM高可用性组件的功能和关键技术的实施,包括负载均衡、数据复制、分布式存储、虚拟

【高级接口分析】:计算机组成原理中的硬件软件优化策略(接口性能分析)

![【高级接口分析】:计算机组成原理中的硬件软件优化策略(接口性能分析)](https://media.geeksforgeeks.org/wp-content/uploads/20240110162115/What-is-Network-Latency-(1).jpg) # 摘要 本论文全面探讨了计算机组成原理、接口性能的衡量指标及其优化策略,包括接口类型、硬件优化以及软件优化等多个方面。文章从硬件接口的物理层、协议层和系统层出发,提出了针对接口性能的具体优化方法。同时,在软件方面,详细论述了接口驱动性能优化、接口通信协议的软件实现以及系统软件与接口性能的协同优化策略。此外,论文通过案例分

STM32的ADC应用:实现精确模拟信号数字化转换

![学好STM32经典项目](https://mischianti.org/wp-content/uploads/2022/07/STM32-power-saving-wake-up-from-external-source-1024x552.jpg.webp) # 摘要 本论文深入探讨了STM32微控制器中模拟数字转换器(ADC)的各个方面,包括硬件接口、配置、软件编程以及应用案例分析。文章首先概述了STM32 ADC的基本概念和硬件模块,随后详细介绍了其硬件接口的配置、初始化流程,以及软件编程接口的使用。文中还阐述了如何将STM32 ADC应用于不同场合,例如温度传感器数据采集、声音信号