🤵♂️ 个人主页:@rain雨雨编程
😄微信公众号:rain雨雨编程
✍🏻作者简介:持续分享机器学习,爬虫,数据分析
🐋 希望大家多多支持,我们一起进步!
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
SpringMVC 框架介绍
SpringMVC 是 Spring 框架的一个模块,它实现了基于 Java 的 MVC(Model-View-Controller)设计模式,用于构建 Web 应用程序。以下是 SpringMVC 的核心概念和工作流程:
-
请求处理:浏览器发送 HTTP 请求到后端服务器,这些请求由 SpringMVC 的前端控制器(DispatcherServlet)接收。
-
Servlet 分离:传统的 Servlet 模式中,一个 Servlet 只能处理一个请求,这限制了并发处理能力。SpringMVC 通过引入控制器(Controller)层,允许一个控制器处理多个请求。
-
分层架构:SpringMVC 提倡将应用程序分为三层:
-
Web 层(Controller):处理 HTTP 请求,调用服务层,并返回视图或数据。
-
Service 层:包含业务逻辑,处理应用程序的核心功能。
-
DAO 层:数据访问对象层,负责与数据库交互,执行 CRUD 操作。
-
-
MVC 设计模式:SpringMVC 实现了 MVC 设计模式,其中:
-
Controller:接收请求,调用服务层,返回 Model 和 View。
-
Service:处理业务逻辑,调用 DAO 层。
-
DAO:执行数据操作,返回结果给 Service。
-
Model:应用程序的数据。
-
View:用户界面,展示 Model 数据。
-
-
异步调用:随着互联网的发展,同步调用的性能瓶颈促使异步调用成为趋势。在异步调用中,后端不需要返回传统的视图,而是将数据转换为 JSON 格式返回给前端。 SpringMVC 的职责:
-
控制器如何接收请求和数据。
-
如何将请求和数据转发给业务层(Service)。
-
如何将请求和数据转发给业务层(Service)。
-
如何将响应数据转换为
JSON
格式并返回给前端。
在Spring框架中,@RequestBody
、@ResponseBody
、HttpEntity
和ResponseEntity
都是用于处理HTTP请求和响应的注解和类,它们在RESTful服务开发中扮演着重要的角色。下面我将简要区分它们:
核心注解
@Controller
-
作用:标识一个类作为Spring MVC的控制器,负责处理Web请求。
-
使用场景:用于定义处理HTTP请求的类,这些类通常包含处理特定URL请求的方法。
- 示例:
@Controller public class UserController { // ... }
@RequestMapping
-
作用:用于映射Web请求到控制器的处理方法上。
-
使用场景:可以用于类或方法上,用于定义URL路径与控制器方法之间的映射关系。
- 示例:
@RequestMapping("/users") public class UserController { // ... }
@PathVariable
-
作用:用于从URL路径中提取变量,并将其绑定到控制器方法的参数上。
-
使用场景:用于处理包含变量的URL路径,如根据用户ID获取用户信息。
- 示例:
@GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { // ... }
SpringMVC处理请求数据
@RequestParam注解
在SpringMVC中,@RequestParam注解是一个强大的工具,它允许开发者更灵活地处理HTTP请求中的参数。
作用
@RequestParam
注解用于将请求参数映射到处理方法的参数上。当请求参数的名称与方法参数的名称不一致时,这个注解尤为重要。
使用场景
-
参数名不一致:当HTTP请求中的参数名与方法参数名不同时,使用
@RequestParam
来指定请求参数的名称。 -
可选参数:标记方法参数为可选,即使请求中没有提供该参数,方法也能正常执行。
-
默认值:为方法参数提供默认值,当请求中没有提供该参数时,方法参数将使用默认值。
示例
private static final String SUCCESS = "success";
@RequestMapping("/param1")
public static String test(@RequestParam("stu") String stud){
System.out.println("stu===>" + stud);
return SUCCESS;
}
在这个例子中,如果请求的URL是/param1?stu=MoonshotAI
,那么控制台将输出stu===>MoonshotAI
。
属性概览
属性名 | 类型 | 作用 | 默认值 |
---|---|---|---|
value | String | 设置需要入参的参数名 | 无 |
name | String | 与value属性作用一致,设置需要入参的参数名 | 无 |
required | Boolean | 设置当前参数是否必须入参 | true |
defaultValue | String | 当装配数值为null时,指定当前defaultValue默认值 | 无 |
属性详解
-
required
-
类型:
Boolean
- 作用:指定参数是否必须提供。
-
true
(默认值):如果请求中没有提供该参数,将返回400错误,提示缺少必需的参数。 -
false
:如果请求中没有提供该参数,该参数将被设置为null
。
-
-
-
defaultValue
-
类型:
String
-
作用:当请求中没有提供该参数,且
required
属性设置为false
时,该参数将使用defaultValue
指定的默认值。
-
另一个示例
private static final String SUCCESS = "success";
@RequestMapping("/param1")
public static String test(@RequestParam(value = "stu", required = false, defaultValue = "Unknown") String stud){
System.out.println("stu===>" + stud);
return SUCCESS;
}
在这个例子中,如果请求的URL是/param1
(没有提供stu
参数),控制台将输出stu===>Unknown
,因为defaultValue
被设置为"Unknown"
。
通过使用@RequestParam
注解,SpringMVC提供了一种灵活且强大的方式来处理HTTP请求参数,使得开发者能够更精确地控制参数的接收和处理。
@RequestHeader 注解详解
@RequestHeader
注解在SpringMVC中用于将HTTP请求头中的信息映射到处理方法的参数上。
作用
@RequestHeader
注解允许开发者访问HTTP请求头中的值,并将这些值作为参数传递给控制器的方法。
使用场景
-
访问请求头信息:当需要根据请求头中的信息(如
User-Agent
、Accept
、Authorization
等)来处理请求时。
示例
@RequestMapping("/headerInfo")
public static String headerInfo(@RequestHeader("User-Agent") String userAgent){
System.out.println("User-Agent===>" + userAgent);
return SUCCESS;
}
在这个例子中,User-Agent
请求头的值将被打印出来。
属性概览
属性名 | 类型 | 作用 | 默认值 |
---|---|---|---|
value | String | 设置需要获取的请求头的名称 | 无 |
name | String | 与value属性作用一致,设置需要获取的请求头的名称 | 无 |
required | Boolean | 设置当前请求头是否必须存在 | true |
defaultValue | String | 当请求头不存在时,指定默认值 | 无 |
属性详解
-
required
-
类型:
Boolean
- 作用:指定请求头是否必须存在。
-
true
(默认值):如果请求头不存在,将抛出异常。 -
false
:如果请求头不存在,该参数将被设置为null
。
-
-
-
defaultValue
-
类型:
String
-
作用:当请求头不存在,且
required
属性设置为false
时,该参数将使用defaultValue
指定的默认值。
-
@CookieValue 注解详解
@CookieValue
注解在SpringMVC中用于将HTTP请求中的Cookie信息映射到处理方法的参数上。
作用
@CookieValue
注解允许开发者访问Cookie中的值,并将这些值作为参数传递给控制器的方法。
使用场景
-
访问Cookie信息:当需要根据Cookie中的信息(如用户会话、偏好设置等)来处理请求时。
示例
@RequestMapping("/cookieInfo")
public static String cookieInfo(@CookieValue("sessionId") String sessionId){
System.out.println("Session ID===>" + sessionId);
return SUCCESS;
}
在这个例子中,名为sessionId
的Cookie的值将被打印出来。
属性概览
属性名 | 类型 | 作用 | 默认值 |
---|---|---|---|
value | String | 设置需要获取的Cookie的名称 | 无 |
name | String | 与value属性作用一致,设置需要获取的Cookie的名称 | 无 |
required | Boolean | 设置当前Cookie是否必须存在 | true |
defaultValue | String | 当Cookie不存在时,指定默认值 | 无 |
属性详解
-
required
-
类型:
Boolean
- 作用:指定Cookie是否必须存在。
-
true
(默认值):如果Cookie不存在,将抛出异常。 -
false
:如果Cookie不存在,该参数将被设置为null
。
-
-
-
defaultValue
-
类型:
String
-
作用:当Cookie不存在,且
required
属性设置为false
时,该参数将使用defaultValue
指定的默认值。
-
通过使用@RequestHeader
和@CookieValue
注解,SpringMVC提供了一种灵活且强大的方式来处理HTTP请求的头部信息和Cookie,使得开发者能够更精确地控制请求的接收和处理。
SpringMVC处理响应数据
ModelAndView 使用
在SpringMVC中,ModelAndView
是一个非常重要的类,它用于在控制器中处理模型数据和视图的返回。
1. 使用ModelAndView
对象作为方法返回值类型 ModelAndView
允许开发者在同一个对象中设置模型数据和视图名称,从而简化了视图的渲染过程。
2. 设置视图名称 通过ModelAndView
的setViewName
方法,可以指定要渲染的视图名称。
3. 设置共享数据 使用ModelAndView
的addObject
方法,可以向模型中添加属性,这些属性可以在视图中通过表达式语言(EL)访问。
示例代码
@Controller
public class TestResponse {
@RequestMapping("/response")
public ModelAndView test(){
ModelAndView mv = new ModelAndView();
// 设置视图的名字
mv.setViewName("Response_success");
// 设置共享的数据
mv.addObject("stu", "liu");
return mv;
}
}
在Thymeleaf模板中,可以通过th:text
属性来显示模型中的stu
属性:
<h1 th:text="${stu}">1</h1>
Model、ModelMap、Map 处理响应数据
1. 使用 Model
传递数据
Model
接口允许开发者添加模型属性,这些属性可以在视图中访问。
@Controller
public class ModelExampleController {
@RequestMapping("/modelExample")
public String modelExample(Model model) {
model.addAttribute("message", "Hello, Model!");
return "exampleView"; // 返回视图名称
}
}
在视图(例如Thymeleaf模板)中,你可以这样访问传递的数据:
<p th:text="${message}"></p>
2. 使用 ModelMap
传递数据
ModelMap
是Map<String, Object>
的实现,它提供了一种更灵活的方式来添加模型属性。
@Controller
public class ModelMapExampleController {
@RequestMapping("/modelMapExample")
public String modelMapExample(ModelMap modelMap) {
modelMap.addAttribute("message", "Hello, ModelMap!");
return "exampleView"; // 返回视图名称
}
}
在视图(例如Thymeleaf模板)中,你可以这样访问传递的数据:
<p th:text="${message}"></p>
3. 使用 Map
传递数据
直接使用Map<String, Object>
作为方法参数,可以添加模型属性,但这种方式可能不如Model或ModelMap直观。
@Controller
public class MapExampleController {
@RequestMapping("/mapExample")
public String mapExample(Map<String, Object> map) {
map.put("message", "Hello, Map!");
return "exampleView"; // 返回视图名称
}
}
在视图(例如Thymeleaf模板)中,你可以这样访问传递的数据:
<p th:text="${message}"></p>
总结
ModelAndView
提供了一种集成的方式来处理模型数据和视图返回,而Model
、ModelMap
和Map
则提供了更灵活的方式来处理模型数据。选择哪种方式取决于具体的应用场景和个人偏好。
SpringMVC消息转换器
@ResponseBody
ResponseBody注解介绍
-
作用:用于将方法的返回值自动转换为JSON、XML等格式,并写入HTTP响应体中。
-
使用场景:通常用于返回数据给客户端,如查询资源时。
- 示例:
@GetMapping("/users/{id}") @ResponseBody public User getUser(@PathVariable Long id) { // ... }
使用消息转换器处理json数据格式
在Spring MVC中,使用消息转换器处理JSON数据格式通常涉及以下步骤:
1. 添加Jackson依赖
确保你的项目中包含了Jackson库的依赖。如果你使用Maven,可以在pom.xml
中添加以下依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version> <!-- 使用最新版本 -->
</dependency>
2. 启用注解驱动
在你的Spring MVC配置类或XML配置文件中,启用注解驱动,这将自动注册MappingJackson2HttpMessageConverter
:
Java配置类
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// 可以添加其他配置,但注解驱动已自动注册了MappingJackson2HttpMessageConverter
}
XML配置文件
<mvc:annotation-driven />
3. 自定义消息转换器(可选)
如果需要自定义MappingJackson2HttpMessageConverter
的配置,如日期格式、null值处理等,可以在配置类中覆盖configureMessageConverters
方法:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jsonConverter.getObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
jsonConverter.setObjectMapper(objectMapper);
converters.add(jsonConverter);
}
}
4. 使用@ResponseBody
注解
在你的控制器方法上使用@ResponseBody
注解,这样Spring MVC会使用消息转换器将返回值转换为JSON格式:
@Controller
public class SomeController {
@ResponseBody
@RequestMapping("/someEndpoint")
public SomeObject getSomeData() {
SomeObject data = new SomeObject();
// 设置data的属性
return data;
}
}
5. 配置视图解析器(如果需要视图渲染)
如果你的应用中同时使用了视图渲染和JSON数据返回,你可能需要配置视图解析器以避免视图解析器与消息转换器冲突:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
// 其他配置...
}
6. 测试JSON数据格式
一旦配置完成,你可以通过发送HTTP请求到你的Spring MVC应用程序来测试JSON数据格式是否按预期工作。
通过这些步骤,你可以在Spring MVC应用程序中成功配置和使用消息转换器来处理JSON数据格式。这使得你的应用能够以JSON格式发送和接收数据,满足RESTful服务的需求。
@RequestBody
-
作用:用于将HTTP请求体中的原始数据(如JSON、XML等)绑定到方法的参数上。
-
使用场景:通常用于接收客户端发送的请求数据,如创建或更新资源时。
- 示例:
@PostMapping("/users") public ResponseEntity<User> createUser(@RequestBody User user) { // ... }
HttpEntity
-
作用:代表一个HTTP请求或响应实体,可以包含HTTP头信息、HTTP状态码以及请求或响应体。
-
使用场景:用于构建复杂的HTTP请求,或者在客户端接收到的响应中获取完整的HTTP信息。
- 示例:
RestTemplate restTemplate = new RestTemplate(); HttpEntity<String> entity = new HttpEntity<>("body", headers); ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
ResponseEntity
-
作用:是
HttpEntity
的子类,专门用于表示HTTP响应。 -
使用场景:用于在服务器端构建HTTP响应,可以设置响应体、HTTP头信息和HTTP状态码。
- 示例:
@GetMapping("/users/{id}") public ResponseEntity<User> getUser(@PathVariable Long id) { User user = userService.findById(id); return new ResponseEntity<>(user, HttpStatus.OK); }
总结
-
@RequestBody
和@ResponseBody
是注解,分别用于请求和响应的数据绑定。 -
HttpEntity
和ResponseEntity
是类,用于构建和表示HTTP请求和响应实体。 -
ResponseEntity
可以看作是HttpEntity
的特化,专注于响应,并且可以方便地设置状态码。 -
在Spring MVC中,
@ResponseBody
可以与@RestController
注解结合使用,后者是一个组合注解,包含了@Controller
和@ResponseBody
,用于简化RESTful服务的开发。
其他注解
@ExceptionHandler
-
作用:用于定义全局异常处理方法,捕获并处理控制器中的异常。
-
使用场景:用于统一处理Web应用程序中的异常。
- 示例:
@ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { // ... }
@RestController
-
作用:是
@Controller
和@ResponseBody
的组合,用于创建RESTful风格的Web服务。 -
使用场景:用于定义RESTful API的控制器。
- 示例:
@RestController public class UserController { // ... }
Rest风格
REST(Representational State Transfer,表现层状态转换)是一种软件架构风格,广泛应用于Web服务的设计中,特别是RESTful Web服务。以下是REST风格的主要内容和实践步骤:
5.1 REST简介
REST的特点:
-
一种基于HTTP协议的架构风格。
-
通过HTTP方法(GET, POST, PUT, DELETE)对资源进行操作。
REST与传统风格的对比:
-
传统风格:URL与操作紧密相关,如
http://localhost/user/getById?id=1
。 -
REST风格:URL简洁,操作通过HTTP方法区分,如
http://localhost/user/1
。
REST的优点:
-
隐藏资源的访问行为,提高安全性。
-
书写简化,易于理解和维护。
5.2 REST风格操作
REST风格中HTTP方法的使用:
-
GET:用于查询资源,如
http://localhost/users
获取所有用户信息。 -
POST:用于新增资源,如
http://localhost/users
添加新用户。 -
PUT:用于修改资源,如
http://localhost/users/1
更新特定用户信息。 -
DELETE:用于删除资源,如
http://localhost/users/1
删除特定用户。
注意事项:
-
REST是一种风格,不是严格的规范,但遵循约定可以提高代码的可读性和可维护性。
-
资源名称通常使用复数形式,如
users
、books
,表示资源集合。
5.3 RESTful开发
RESTful的概念:
-
根据REST风格对资源进行访问称为RESTful。
开发实践:
-
在开发中,通常遵循REST风格来设计和访问后台服务。
-
RESTful开发强调资源的表示和状态的转换,而不是具体的操作过程。
5.4 REST风格的优势
降低开发复杂性:
-
通过统一的接口和资源表示,简化了客户端和服务器端的交互。
提高系统的可伸缩性:
-
RESTful服务可以独立于客户端进行扩展和优化。
结论:
REST风格提供了一种清晰、简洁的方式来设计Web服务,使得资源的访问和操作更加直观和安全。在现代Web开发中,遵循REST风格进行RESTful开发已成为一种最佳实践。
SpringMVC 视图及视图解析器
在SpringMVC框架中,视图(View)和视图解析器(ViewResolver)是处理用户界面渲染的关键组件。以下是对这两个概念的详细总结:
视图解析器对象【ViewResolver】
概述: 视图解析器是ViewResolver
接口的具体实现,它的作用是将控制器返回的逻辑视图名解析为实际的视图对象。
作用:
-
解析视图:将ModelAndView对象中的逻辑视图名解析为实际的视图对象。
-
视图定位:根据配置的规则,将视图名转换为实际的视图实现,如JSP、Thymeleaf模板等。
工作流程:
-
控制器方法执行完毕后,会返回一个视图名(逻辑视图名)。
-
视图解析器根据这个视图名,结合其配置的前缀、后缀等规则,解析出实际的视图实现。
-
视图解析器将解析后的视图对象返回给SpringMVC,由其进行视图渲染。
视图对象【View】
概述: 视图对象是View
接口的具体实现,它负责将模型数据渲染成用户界面。
作用:
-
数据展示:将模型(Model)中的数据展示给用户。
-
视图渲染:根据视图类型(如JSP、Thymeleaf等),将模型数据填充到视图模板中,生成最终的HTML页面。
工作流程:
-
视图解析器解析出视图对象后,SpringMVC将模型数据传递给视图对象。
-
视图对象根据模型数据和视图模板,进行视图渲染。
-
渲染完成后,视图对象将生成的HTML页面返回给用户。
视图解析器的配置
在SpringMVC中,可以通过Java配置或XML配置来设置视图解析器:
Java配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
}
XML配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
总结
在SpringMVC中,视图解析器和视图对象共同工作,实现了控制器与用户界面的解耦。视图解析器负责将逻辑视图名解析为实际的视图对象,而视图对象则负责将模型数据渲染成用户界面。这种设计不仅提高了代码的可维护性,也使得视图的渲染过程更加灵活和可配置。通过合理配置视图解析器,可以轻松地集成不同的视图技术,如JSP、Thymeleaf等,以满足不同的开发需求。
SpringMVC 视图控制器、重定向及静态资源加载
在SpringMVC中,视图控制器、重定向和静态资源加载是构建Web应用时常见的需求。
视图控制器
概述:视图控制器用于处理不涉及复杂业务逻辑的页面跳转。
语法:<mvc:view-controller>
-
作用:为特定的URL映射到一个HTML页面,避免了为每个页面跳转创建控制器类。
配置步骤:
-
在Spring MVC配置文件中添加
<mvc:view-controller>
标签,指定URL和视图名称。 -
添加
<mvc:annotation-driven>
标签,启用注解驱动,以解决视图控制器可能引起的其他请求路径失效问题。
示例:
<mvc:view-controller path="/home" view-name="homePage"/>
<mvc:annotation-driven/>
重定向
概述:重定向用于将用户从一个URL引导到另一个URL。
语法:return "redirect:/xxx.html";
-
作用:在控制器方法中返回一个重定向字符串,实现页面跳转。
示例:
@RequestMapping("/oldUrl")
public String redirect() {
return "redirect:/newUrl";
}
加载静态资源
概述:静态资源包括HTML、CSS、JS等文件,通常由服务器的DefaultServlet处理。
配置:
-
在Tomcat的
web.xml
中,DefaultServlet被配置为处理/
路径的请求,这可能导致与DispatcherServlet的路径冲突。
问题:
-
DispatcherServlet和DefaultServlet的URL配置冲突,导致DefaultServlet无法加载静态资源。
解决方案:
-
在Spring MVC配置中添加
<mvc:default-servlet-handler/>
标签,允许DefaultServlet处理静态资源。 -
确保
<mvc:annotation-driven>
标签也被添加,以避免影响Spring MVC控制器的正常使用。
示例:
<!-- 解决静态资源加载问题 -->
<mvc:default-servlet-handler/>
<!-- 确保注解驱动正常工作 -->
<mvc:annotation-driven/>
文章持续跟新,可以微信搜一搜公众号 [ rain雨雨编程 ],第一时间阅读,涉及数据分析,机器学习,Java编程,爬虫,实战项目等。