文章目录

  • 1. SpringMVC概述
  • 2. SpringMVC的开发步骤
    • 2.1 步骤讲解:
    • 2.2 SpringMVC的流程图示:
    • 2.3 SpringMVC的底层执行流程:
  • 3. SpringMVC的分析
    • 3.1 SpringMVC的组件分析:
    • 3.2 SpringMVC的注解分析:
      • 3.2.1 @RequestMapping
    • 3.3 spring-mvc.xml中配置其他组件
    • 3.4 以上总结
    • 3.5 不使用注解实现SpringMVC
    • 3.6 使不使用注解的配置区别:
  • 4. SpringMVC的请求与响应
    • 4.1 SpringMVC的数据响应
      • 4.1.1 页面跳转形式
        • 4.1.1.1 直接返回字符串
        • 4.1.1.2 通过ModelAndView对象返回
      • 4.1.2 回写数据形式
        • 4.1.2.1 直接返回字符串
          • 4.1.2.1.1 response.getWriter().print
          • 4.1.2.1.2 @ResponseBody方式
          • 4.1.2.1.3 json格式字符串
        • 4.1.2.2 返回对象或集合
    • 4.2 SpringMVC获取请求数据
      • 4.2.1 获取请求数据参数
        • 4.2.1.1 获取基本数据类型时:
        • 4.2.1.2 获取POJO类型参数时
        • 4.2.1.3 获取数组参数(不常用)
        • 4.2.1.4 获取集合参数
      • 4.2.2 开放静态资源的访问权限
      • 4.2.3 参数绑定注解@requestParam
      • 4.2.4 解决数据乱码问题
      • 4.2.5 Restful风格的参数
      • 4.2.6 自定义类型转换器
      • 4.2.7 获得请求头数据
        • 4.2.7.1 @RequestHeader
        • 4.2.7.2 @CookieValue
      • 4.2.8 文件上传
        • 4.2.8.1 单文件上传
        • 4.2.8.2 多文件上传
  • 5. 注解总结:

1. SpringMVC概述

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中

​ SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过完善简单的一套注解,让一个简单的 Java 类成为处理请求的控制器(Servlet),而无须实现任何接口(HTTPServlet)。同时它还支持 RESTful 编程风格的请求


​ 在我们写的Servlet中,有着很多的共有行为:获取请求数据,调用M(服务层)对数据进行分析,得到返回的响应数据,将响应数据交给V(视图)展示等都是Servlet的共有行为

​ 同时在Servlet中又有着一些特有行为,例如校验表单数据等…

​ 因此我们可以抽取,将共有行为抽取出来,在需要执行特有行为时再让共有行为的类去调用特有行为的类

​ 而框架一般就会帮我们去封装这些共有行为来简化我们的开发,因此SpringMVC就帮我们实现了这些共有行为的封装(采用Servlet实现,也称为前端控制器,也是SpringMVC的核心)

​ 简单粗暴的说,就是使用SpringMVC框架之后,我们可以不用写Servlet也能实现之前该有的效果,只需要使用SpringMVC提供的注解与创建一些POJO进行开发即可

2. SpringMVC的开发步骤

2.1 步骤讲解:

  1. 导入SpringMVC的核心jar包,以及Spring-web,servlet,JSP等的jar包:
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.1.9.RELEASE</version>
</dependency>
<!-- servlet坐标 -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>
<!-- jsp坐标 -->
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.2.1</version><scope>provided</scope></dependency>
  1. 配置SpringMVC核心控制器(上面说的前端控制器)DispatcherServlet,让所有的请求都先来找这个核心控制器,例如将这个核心控制器的资源路径配置为"/",这样子所有的请求都会经过这个Servlet

    或者是配置为*.xxx,使得对特定请求走这个Servlet

<!-- 在web.xml配置前端控制器 -->
<!-- DispatcherServlet类不是我们自己写的,使用xml配置 -->
<servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 接着加载spring-mvc.xml进内存 --><!-- 表示初始化时会加载这个参数对应的值(配置文件) --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><!-- 让他与tomcat一块启动 --><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
  1. 在controller包下编写Controller(POJO)类和视图页面

  2. 根据IOC思想,使用DI依赖注入(注解或者xml)将Controller类配置到Spring容器中(可以使用@Controller注解)

    配置完的Controller类示例:

package com.ahua.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class UserController {@RequestMapping("/show")public String show(){System.out.println("Spring MVC 启动成功啦");return "a.jsp";}
}
  1. 如果使用注解,还需要配置组件扫描,如果是xml配置,则此时我们可以在resources目录创建一个SpringMVC的配置文件:spring-mvc.xml(分模块,与之前的spring配置文件分开)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 注意,由于spring和springMVC在扫描时我们会让他们各自扫描各自的组件,因此我们这里的设置是只让他扫描controller包下的类 --><context:component-scan base-package="com.ahua.controller"/></beans>
  1. 接着启动服务器,在虚拟目录后增加/show即可测试效果

2.2 SpringMVC的流程图示:

在这里插入图片描述

图中绿色部分就是springMVC的前端控制器

2.3 SpringMVC的底层执行流程:

面试可能会问:

  1. 用户的请求先被发送至前端控制器DispatcherServlet,而实际上DispatcherServlet的作用主要是调用SpringMVC提供的组件,这些组件才是实现对应功能的
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器,HandlerMapping负责解析请求数据
  3. HandlerMapping处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成),返回处理器执行链HandlerExecutionChain(因为在达到Controller之前可能先经过很多个Servlet)给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器
  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
  11. DispatcherServlet响应用户

流程图:

在这里插入图片描述

3. SpringMVC的分析

3.1 SpringMVC的组件分析:

1. 前端控制器:DispatcherServlet:

​ 用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合

2. 处理器映射器:HandlerMapping

​ HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等

3. 处理器适配器:HandlerAdapter

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行

4. 处理器:Handler

​ 它就是我们开发中要编写的具体业务控制器(Controller类)。由 DispatcherServlet 把用户请求转发到 Handler,由Handler 对具体的用户请求进行处理

5. 视图解析器:View Resolver

​ View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户

6. 视图:View

​ SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面

3.2 SpringMVC的注解分析:

3.2.1 @RequestMapping

作用:

​ 用于建立请求 URL 和处理请求方法之间的对应关系

​ 方法return “xxx.jsp"时会默认从当前资源所在地址寻找到这个jsp然后跳转,例如只配置了方法上的RequestMapping,则此时会从"http://localhost:8080/虚拟目录/” 下寻找资源,如果配置了类上的RequestMapping,例如为"/User",则此时会从"http://localhost:8080/虚拟目录/User/" 下寻找资源,此时就找不到这个jsp了

​ 如果方法return "/xxx.jsp"时,代表会从当前web项目(webapp)下寻找这个jsp资源,此时上面找不到jsp资源的问题就解决了(可以理解为给服务器端用的地址与给客户端用的地址的区别)

位置:

  • 类上,请求URL 的第一级访问目录此处不写的话,就相当于应用的根目录(虚拟目录)
  • 方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径

主要属性:

  • value:用于指定请求的URL。它和path属性的作用是一样的
  • path
  • method:用于指定请求的方式,采用提供给我们的参数赋值,例如:
@RequestMapping(value="/user", method=RequestMethod.POST)
// 注意:由于使用url进行访问默认会是get,因此如果设置为post会报错
  • params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样,属性值是一个数组({})

    示例:

    params = {“username”},表示请求参数必须有username(即必须为http…/…?username=xxx)

    params = {“id!-1”},表示请求参数中id不能是-1

3.3 spring-mvc.xml中配置其他组件

视图解析器:

​ 可以配置转发与重定向的前缀,看源码理解下先

​ SpringMVC有默认组件配置,默认组件都是DispatcherServlet.properties配置文件中配置的,该配置文件地址:

org/springframework/web/servlet/DispatcherServlet.properties,该文件中配置了默认的视图解析器,如下:

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

​ 翻看该解析器源码,可以看到该解析器的默认设置,如下:

REDIRECT_URL_PREFIX = "redirect:"  // 重定向前缀
FORWARD_URL_PREFIX = "forward:"   // 转发前缀(默认值)
prefix = "";   // 视图名称前缀
suffix = "";   //视图名称后缀

​ 我们可以通过属性注入的方式修改视图的的前后缀:

<!--配置内部资源视图解析器--> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property>
</bean>

在springMVC中(spring-webmvc)的web.servlet包下的DispatcherServlet.properties配置文件中配置了相关组件:

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolverorg.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolverorg.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterorg.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolverorg.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslatororg.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolverorg.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

3.4 以上总结

SpringMVC的相关组件

  • 前端控制器:DispatcherServlet

  • 处理器映射器:HandlerMapping

  • 处理器适配器:HandlerAdapter

  • 处理器:Handler

  • 视图解析器:View Resolver

  • 视图:View

SpringMVC的注解和配置

  • 请求映射注解:@RequestMapping

  • 视图解析器配置:

REDIRECT_URL_PREFIX = "redirect:"
FORWARD_URL_PREFIX = "forward:"
prefix = "";
suffix = "";

3.5 不使用注解实现SpringMVC

  1. 完成上述配置之后,在spring-mvc.xml中添加 处理映射器与处理器适配器的配置:
<!-- 处理器映射器: -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 处理器适配器: -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  1. 编写我们要操作业务得到Controller类 ,该类实现Controller接口,重写handleRequest方法
  2. 将自己的类交给SpringIOC容器,注册bean
<!--Handler-->
<bean id="/hello" class="com.ahua.controller.HelloController"/>

Controller接口源码:

//实现该接口的类获得控制器功能
public interface Controller {//处理请求且返回ModelAndView对象ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

缺点:

​ 一个控制器中只能有一个方法,如果要多个方法则需要定义多个Controller,较麻烦

3.6 使不使用注解的配置区别:

  1. 使用注解时不需要实现Controller类,可以直接返回字符串

  2. 使用springMVC必须配置的三大件:

    处理器映射器、处理器适配器、视图解析器

    通常,我们只需要手动配置视图解析器,而处理器映射器处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置

4. SpringMVC的请求与响应

4.1 SpringMVC的数据响应

SpringMVC的数据响应方式

分为俩种:

1) 页面跳转

  • 直接返回字符串

  • 通过ModelAndView对象返回

2) 回写数据(相当于response.getWriter.writer())

  • 直接返回字符串

  • 返回对象或集合

4.1.1 页面跳转形式

4.1.1.1 直接返回字符串

这种方式会将返回的字符串与视图解析器的前后缀拼接后跳转,即前面使用的方式,直接跳转到对应的jsp中

默认情况下为转发,此时会自动加上视图解析器配置内容

当显式的加上forward:表示转发时,需要写上全路径

当需要重定向时需要加上"redirect:全路径.jsp"

4.1.1.2 通过ModelAndView对象返回

ModelAndView对象是SpringMVC提供的对象,ModelAndView对象返回后会被ViewReslover视图解析器解析后返回具体View,接着DispatcherServlet会根据View进行渲染视图(即将模型数据填充至视图中),最后DispatcherServlet响应用户

ModelAndView对象的获取:

1)直接创建:

ModelAndView modelAndView = new ModelAndView();

2)在方法上加上ModelAndView对象的形参,此时SpringMVC框架会为你直接注入一个ModelAndView对象


ModelAndView对象的设置:

我们可以给ModelAndView对象设置视图名称来使视图解析器找到对应的视图:

// 重定向,redirect:
modelAndView.setViewName("redirect:/WEB-INF/views/index.jsp"); 
// 转发,forward:可省略forward:与全路径
modelAndView.setViewName("forward:/WEB-INF/views/index.jsp"); 

示例:

package com.ahua.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class UserController {@RequestMapping("/show")public ModelAndView show(){ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("a.jsp");return modelAndView;}
}

也可以通过addObject(attributeName,attributeValue)方法来设置模型数据,同时也可以在方法参数中加上一个Model对象参数,通过Model对象的addObject(attributeName,attributeValue)方法来设置模型数据


Controller类中的方法加response形参:

由于我们可以在Controller类中的方法加形参,springMVC框架会帮我们注入,因此当我们写的Controller需要request对象或者response对象或者session对象时都可以在形参中加上HTTPServletRequest等对象,SpringMVC框架会将Tomcat创建的request对象注入到参数中

但这种方式不常用,因为我们用框架的目的就是解耦,让需要使用request对象与response对象的地方由框架帮我们实现

总结:

当需要返回数据的时候,我们一般使用ModelAndView(例如查询),当不需要返回模型数据,直接通过返回字符串跳转页面即可(增删)

4.1.2 回写数据形式

4.1.2.1 直接返回字符串

Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“xxx”) 即可,那么在Controller中想直接回写字符串该怎样呢?

4.1.2.1.1 response.getWriter().print

通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void,并且此时直接将打印的数据展示在页面上:

@Controller
@RequestMapping("/test")
public class UserController {@RequestMapping("/show2")public void show2(HttpServletResponse response) throws IOException {response.getWriter().println("Hello");}
}
4.1.2.1.2 @ResponseBody方式

将需要回写的字符串直接在方法中返回,但此时需要通过**@ResponseBody**注解告知SpringMVC框架,方法返回的字符串不是页面跳转而是直接在http响应体中返回(效果与在页面中println一致)

@Controller
@RequestMapping("/test")
public class UserController {@RequestMapping("/show3")@ResponseBodypublic String show3() {return "Hello";}
}
4.1.2.1.3 json格式字符串

在异步项目中,客户端与服务器端往往要进行json格式字符串交互,此时我们可以手动拼接json字符串返回:

@RequestMapping("/show4")
@ResponseBody
public String show4() throws IOException {return "{\"name\":\"zhangsan\",\"age\":18}"; 
}

上述方式手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用json转换工具jackson进行转换,步骤:

  1. 导入jackson坐标
<!--jackson--> 
<dependency> <groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId> <version>2.9.0</version>
</dependency>
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version>
</dependency> 
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version>
</dependency>
  1. 通过jackson转换json格式字符串,回写字符串:
@RequestMapping("/show5")
@ResponseBody
public String show5() throws IOException {User user = new User();user.setUsername("zhangsan");user.setAge(20);ObjectMapper objectMapper = new ObjectMapper();String s = objectMapper.writeValueAsString(user);return s;
}

4.1.2.2 返回对象或集合

以上返回JSON的代码还是有一点的复杂,重复读代码影响美感,不够优雅

因此SpringMVC还提供了返回对象或者集合的方式,会自动帮助我们将对象或集合转为JSON字符串并回写

需要先在在spring-mvc.xml中为处理器适配器配置消息转换参数,告诉他使用jackson进行对象或集合的转换,覆盖默认的处理器适配器(在处理器适配器类中有一个messageConverters参数,用于接收信息的转换器集合)

先看一下其中的方法源码:

private List<HttpMessageConverter<?>> messageConverters;
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {this.messageConverters = messageConverters;
}

接下来是我们需要配置的代码:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean></list></property>
</bean>

接着还是需要在方法上加@ResponseBody注解,表示不直接跳转而是返回数据

此时我们返回JSON数据的代码就可以写的很简单了:

@RequestMapping("/show6")
@ResponseBody
public User show6() throws IOException {User user = new User();user.setUsername("zhangsan");user.setAge(20);return user;
}

以上在配置文件中的配置较为繁琐,因此SpringMVC提供了返回对象的注解开发:

此时需要在spring-mvc.xml中配置注解驱动:

<!--mvc的注解驱动,需要先导入mvc的命名空间--> 
<mvc:annotation-driven/>

在 SpringMVC 的各个组件中,处理器映射器处理器适配器视图解析器称为 SpringMVC 的三大组件。

使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter( 处 理 适 配 器 ),可以在spring-mvc.xml中使用<mvc:annotation-driven>替代处理器和适配器的配置

同时使用<mvc:annotation-driven>默认底层就会集成jackson进行对象或集合到json格式字符串的转换

4.2 SpringMVC获取请求数据

4.2.1 获取请求数据参数

在客户端请求参数的格式是:name=value&name=value……

SpringMVC可以接收如下类型的参数:

基本类型参数

POJO类型参数

数组类型参数

集合类型参数

在SpringMVC中获得参数只需要在Controller中的业务方法的参数名称与请求参数的名称一致即可,SpringMVC会将参数值自动映射匹配

4.2.1.1 获取基本数据类型时:

示例:在客户端请求参数中有这样的参数:username=zhangsan&age=12

则此时要获取请求参数,只需要业务方法中的参数名称为username与age即可

@RequestMapping("/show9")
@ResponseBody
public void show9(String username,int age)

4.2.1.2 获取POJO类型参数时

假设在代码中有这样一个POJO类:

public class User {private String username;private int age;// getter方法与setter方法...
}

此时在客户端请求参数中还是这样的参数:username=zhangsan&age=12

则此时我们获取请求参数可以将业务方法中的参数写为POJO类,SpringMVC会帮我们自动注入:

@RequestMapping("/show10")
@ResponseBody
public void show10(User user)

4.2.1.3 获取数组参数(不常用)

当在前端表单中填写复选框时,就会出现使用数组或者集合接收参数的情况

示例:在客户端请求参数中有这样的参数:str=a&str=b&str=c

此时的业务方法获取参数写法:

@RequestMapping("/show11")
@ResponseBody
public void show11(String[] str)

4.2.1.4 获取集合参数

想要获取集合参数,与上面直接参数名字一致就会自动注入不同,有以下俩种方法获取:

  1. 将集合参数包装到一个POJO中才可以获取,这个POJO我们通常称为Vo类:

    前端代码示例:

<form action="${pageContext.request.contextPath}/show12" method="post"> <!-- userList[0]表明是第几个list --><input type="text" name="userList[0].username"><br><input type="text" name="userList[0].age"><br> <input type="text" name="userList[1].username"><br> <input type="text" name="userList[1].age"><br> <input type="submit" value="提交"><br>
</form>

VO代码示例:

import java.util.List;public class VO {private List<User> userList;public List<User> getUserList() {return userList;}public void setUserList(List<User> userList) {this.userList = userList;}@Overridepublic String toString() {return "VO{" +"userList=" + userList +'}';}
}

此时的业务方法:

@RequestMapping("/show12")
@ResponseBody
public void show12(VO vo)
  1. 当使用异步Ajax通信时,我们一般使用json数据进行交互,此时我们只需要指定contentType为json形式,并且在方法形参位置使用一个注解:@RequestBody就可以实现直接接收集合数据而无需使用POJO进行包装

    前端代码(使用JQ)示例:

<script>//模拟数据var userList = new Array();userList.push({username: "zhangsan",age: "20"});userList.push({username: "lisi",age: "20"});$.ajax({type: "POST",url: "/itheima_springmvc1/quick13",data: JSON.stringify(userList),contentType : 'application/json;charset=utf-8'});
</script>

业务方法示例:

@RequestMapping("/show13")
@ResponseBody
public void show13(@RequestBody List<User> userList)

4.2.2 开放静态资源的访问权限

注意:在上面的前端代码中我们使用了JQ,但如果直接运行上面代码会发现运行并不成功,通过抓包我们可以发现,原因是jq的文件并没有被成功加载

这是为什么呢?

这其实是因为我们在配置DispatcherServlet前端控制器时,配置了"/",表示任何请求路径都会通过这个前端控制器,DispatcherServlet会对所有资源都进行过滤,但是因此他将我们导入script文件的路径以为成是@RequestMapping配置的路径,即动态资源了,而我们并没有配置与编写相关路径的代码,因此找不到资源并报错

因此我们需要在spring-mvc.xml中进行相关配置,开放资源的访问权限(一般就是静态资源)

开放资源的访问权限有以下俩种方式:

1). 通过mvc:resources标签,其中参数mapping映射表示你访问资源时写的路径(代码中写的路径),location表示这个资源会去哪个目录找(实际目录)

<!-- 开放对js文件的访问 -->
<mvc:resources mapping="/js/**" location="/js/"/>
<!-- 开放图片的访问 -->
<mvc:resources mapping="/image/**" location="/image/"/>

2). 第二种方式相对更加简单,使用<mvc:default-servlet-handler/>标签即可, 这个标签表示当找不到对应地址(requestmapping)后会交给原始的容器(tomcat)寻找资源,即在前端控制器筛一遍之后如果找不到资源,则会通过tomcat原始的方法寻找资源

<mvc:default-servlet-handler/>

4.2.3 参数绑定注解@requestParam

上面说的SpringMVC框架自动注入参数只能在请求参数名与方法参数名一致时使用,那么名字不一致时怎么办呢?

这个时候就需要用到参数绑定注解@requestParam了,该注解作用就是当请求的参数名称与Controller的业务方法参数名称不一致时,可以通过@RequestParam注解显示的绑定方法参数对应的请求参数

其中有三个常用参数:

  1. value:与请求参数名称绑定, 填入请求参数名

  2. required:表示指定的请求参数在请求中是否必须包括,默认是true,则此时提交时如果没有此参数会报错

  3. defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

示例:

@RequestMapping("/show14")
@ResponseBody
public void show14(@RequestParam(value="name",required = false,defaultValue = "lisi") String username) {System.out.println(username);
}

4.2.4 解决数据乱码问题

只需要在web.xml设置一个Spring提供的过滤器来进行编码的过滤即可:

<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- 告诉他使用哪种方式进行编码,其中encoding是CharacterEncodingFilter中的一个成员变量 --><init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping> <filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

CharacterEncodingFilter.java源码:

package org.springframework.web.filter;import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;public class CharacterEncodingFilter extends OncePerRequestFilter {@Nullableprivate String encoding;private boolean forceRequestEncoding;private boolean forceResponseEncoding;public CharacterEncodingFilter() {this.forceRequestEncoding = false;this.forceResponseEncoding = false;}public CharacterEncodingFilter(String encoding) {this(encoding, false);}public CharacterEncodingFilter(String encoding, boolean forceEncoding) {this(encoding, forceEncoding, forceEncoding);}public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) {this.forceRequestEncoding = false;this.forceResponseEncoding = false;Assert.hasLength(encoding, "Encoding must not be empty");this.encoding = encoding;this.forceRequestEncoding = forceRequestEncoding;this.forceResponseEncoding = forceResponseEncoding;}public void setEncoding(@Nullable String encoding) {this.encoding = encoding;}@Nullablepublic String getEncoding() {return this.encoding;}public void setForceEncoding(boolean forceEncoding) {this.forceRequestEncoding = forceEncoding;this.forceResponseEncoding = forceEncoding;}public void setForceRequestEncoding(boolean forceRequestEncoding) {this.forceRequestEncoding = forceRequestEncoding;}public boolean isForceRequestEncoding() {return this.forceRequestEncoding;}public void setForceResponseEncoding(boolean forceResponseEncoding) {this.forceResponseEncoding = forceResponseEncoding;}public boolean isForceResponseEncoding() {return this.forceResponseEncoding;}protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String encoding = this.getEncoding();if (encoding != null) {if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) {request.setCharacterEncoding(encoding);}if (this.isForceResponseEncoding()) {response.setCharacterEncoding(encoding);}}filterChain.doFilter(request, response);}
}

4.2.5 Restful风格的参数

Restful是一种软件架构风格设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

Restful风格的请求是使用**“url+请求方式”**表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:

  1. GET:用于获取资源

  2. POST:用于新建资源

  3. PUT:用于更新资源

  4. DELETE:用于删除资源

例如:

  • /user/1 GET : 得到 id = 1 的 user

  • /user/1 DELETE: 删除 id = 1 的 user

  • /user/1 PUT: 更新 id = 1 的 user

  • /user POST: 新增 user

也就是说写请求参数的时候不再使用?,而是通过/将请求参数拼到url中,此时的@RequestMapping注解中末尾需要加上"/{name}"来表示占位符获取url中的参数

而在方法参数中使用@PathVariable注解进行占位符的匹配获取工作, 类似于@RequestParam注解, 但不同的是用于占位符的参数匹配

示例:

@RequestMapping("/show18/{name}")
@ResponseBody
public void show18(@PathVariable(value = "name",required = true) String username){System.out.println(username);
}

目前了解即可

4.2.6 自定义类型转换器

SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的数值字符串会自动转换成int型进行参数设置

但不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器

自定义类型转换器步骤:

  1. 定义转换器类实现Converter接口,以日期转换示例:
public class DateConverter implements Converter<String,Date>{@Overridepublic Date convert(String source) {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");try {Date date = format.parse(source);return date;} catch (ParseException e) {e.printStackTrace();}return null;} 
}

其中Converter需要俩个泛型,第一个是转换前数据类型,第二个是转换后数据类型

  1. 在配置文件spring-mvc.xml中声明转换器
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"><list><bean class="com.ahua.converter.DateConverter"/></list></property>
</bean>
  1. 在spring-mvc.xml的<annotation-driven>中引用转换器
<mvc:annotation-driven conversion-service="converterService"/>

但实际上SpringMVC提供的类型转换器一般已经够用了,不太需要我们自定义类型转换器

4.2.7 获得请求头数据

4.2.7.1 @RequestHeader

方法参数中使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name), 该参数与上面的@RequestParam同样类似,可以绑定参数

@RequestHeader注解的属性如下:

  1. value:请求头的名称

  2. required:是否必须携带此请求头

示例:

@RequestMapping("/show19")
@ResponseBody
public void show19(@RequestHeader(value = "Host",required = false) String headerValue){System.out.println(headerValue);
}

4.2.7.2 @CookieValue

虽然cookie也是一种请求头,但由于比较特殊,所以还另外提供了一个注解用于获取cookie的值

方法参数中使用@CookieValue可以获得指定Cookie的值

@CookieValue注解的属性如下:

  1. value:指定cookie的名称

  2. required:是否必须携带此cookie

示例:

@RequestMapping("/show20")
@ResponseBody
public void show20(@CookieValue(value = "JSESSIONID",required = false) String jsessionid){System.out.println(jsessionid);
}

4.2.8 文件上传

上传文件其实就是客户端将文件封装发给服务器,所以其实也是一种请求数据,也可以使用SpringMVC进行获取

文件上传中客户端的三要素:

  1. 表单项type=“file”

  2. 表单的提交方式是post

  3. 表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”

示例:

<form action="${pageContext.request.contextPath}/show23" method="post" enctype="multipart/form-data">名称:<input type="text" name="name"><br>文件:<input type="file" name="file"><br> <input type="submit" value="提交"><br>
</form>

文件上传原理:

​ 当form表单修改为多部分表单时,request.getParameter()等方法将失效,因为这些方法都是获得URL编码方式的表单提交

​ 例如当enctype=“application/x-www-form-urlencoded”时,form表单的正文内容格式是:

key=value&key=value&key=value

​ 此时getParameter()等方法就可以获取数据

​ 而当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成多部分形式:

在这里插入图片描述

SpringMVC封装了解析这些数据的小插件,我们使用这个插件就能完成文件数据的获取,因此我们需要导入fileupload与io坐标

4.2.8.1 单文件上传

步骤:

  1. 导入fileupload和io坐标
<dependency> <groupId>commons-fileupload</groupId> 		<artifactId>commons-fileupload</artifactId> <version>1.2.2</version>
</dependency> 
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version>
</dependency>
  1. 配置文件上传解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--上传文件总大小--> <property name="maxUploadSize" value="5242800"/><!--上传单个文件的大小--><property name="maxUploadSizePerFile" value="5242800"/><!--上传文件的编码类型--> <property name="defaultEncoding" value="UTF-8"/>
</bean>
  1. 编写文件上传代码

    示例:

@RequestMapping("/show23")
@ResponseBody
public void show23(String name,MultipartFile uploadFile) throws IOException {//获得文件名称String originalFilename = uploadFile.getOriginalFilename();//保存文件uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));
}

4.2.8.2 多文件上传

多文件上传,只需要将页面修改为多个文件上传项(即多个文件name属性一致),并将方法参数MultipartFile类型修改为MultipartFile[]即可

示例:

前端代码:

<form action="${pageContext.request.contextPath}/show24" method="post" enctype="multipart/form-data">名称:<input type="text" name="name"><br>文件1:<input type="file" name="uploadFiles"><br>文件2:<input type="file" name="uploadFiles"><br>文件3:<input type="file" name="uploadFiles"><br> <input type="submit" value="提交"><br>
</form>

后端代码:

@RequestMapping("/show24")
@ResponseBody
public void show24(String name,MultipartFile[] uploadFiles) throws IOException {for (MultipartFile uploadFile : uploadFiles){String originalFilename = uploadFile.getOriginalFilename();uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));} 
}

5. 注解总结:

基础七注解

使用在类或方法上:

@Controller(“id”) : 使用在web层类上用于实例化Bean

@RequestMapping(“url”): 用于建立请求 URL 和处理请求方法之间的对应关系

@ResponseBoby : 告知SpringMVC框架,方法返回的字符串不是页面跳转而是直接在http响应体中返回

使用在方法参数中(都有value与required参数):

@RequestParam(“name”) : 与请求参数名绑定, 还有一个defaultValue参数

@PathVariable() : 与Restful风格的参数占位符绑定

@RequestHeader : 与请求头名绑定

@CookieValue : 与cookie名绑定获取cookie

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 全网最详细的ensp模拟器安装教程

    ENSP–华为官方推出用以进行华为网络学习练习实验&#xff0c;实际工程的理论验证以及考试认证的工具&#xff0c; 是每位华为网络工程师必备的学习和练习工具。ENSP虽然是个很好用的学习工具&#xff0c;但是其安装却不是那么轻松&#xff0c;很多同学就在模拟器的安装过程遇到…...

    2024/4/18 10:29:23
  2. 并查集的C++代码实现

    并查集的C代码实现并查集的初始化操作并查集的查找操作并查集的合并操作并查集的应用范围判断图的连通分量数和连通性判断图是否有环实现Kruskal算法去年408的大纲发生比较大的变化&#xff0c;其中就包括之前从大纲中删除的并查集&#xff0c;没错&#xff0c;它又回来了。后来…...

    2024/4/28 0:44:54
  3. 前端 Docker 镜像体积优化

    本文来自于【阿里云官方镜像站&#xff1a;https://developer.aliyun.com/mirror/?utm_contentg_1000307095 】 原文链接&#xff1a;https://developer.aliyun.com/article/744497?spma2c6h.12873581.0.0.484f7e46JZ6t8J 一、为什么要用 Docker 对于前端日常开发而言&…...

    2024/4/28 0:32:04
  4. 计算机毕业设计java+ssm的大学生健康平台(源码+系统+mysql数据库+Lw文档)

    项目介绍 随着时代的发展&#xff0c;大学生的数量与日预增但是相对的也出现了很多心理问题&#xff0c;大学生因为各类心理引发的社会问题已经受到了很多人的关注&#xff0c;所以如何更好的培养大学生正确的心理健康问题是现在很多大学多面临的一个重要的问题。 本大学生健…...

    2024/4/13 6:24:29
  5. 网页前端第七次培训(JS的内置对象,对象,事件)

    一.内置对象 String charAt(idx) 返回指定位置处的字符 indexOf(Chr) 返回指定字符串的位置&#xff0c;从左到右&#xff0c;找不到返回-1 substr(m,n) 返回给定字符串中从m位置开始&#xff0c;取n个字符&#xff0c;如果参数n省略&#xff0c;则意味着取到字符串末尾 s…...

    2024/4/13 6:24:19
  6. 配置交叉编译工具链和环境变量

    设置交叉编译工具链 交叉编译工具链用来在Ubuntu主机上编译应用程序&#xff0c;而这些应用程序是在ARM等其他平台上运行。 设置交叉编译工具主要是设置PATH&#xff0c; ARCH和CROSS_COMPILE三个环境变量&#xff0c;下面介绍具体设置方法。 设置这3个环境变量有多种方法&…...

    2024/4/16 19:01:00
  7. 2.3、IPMP,PMP,PRINCE2

    IPMA&#xff1a;&#xff08;International Project Management Association&#xff09;国际项目管理协会&#xff1b; ICB&#xff1a;&#xff08;IPMA Competence Baseline&#xff09;国际项目管理资质标准&#xff0c;IPMA建立的知识体系 ICB知识与经验&#xff1a; 核…...

    2024/4/13 6:24:09
  8. 网页前端第八次培训笔记

    1.学习资料 【优极限】 HTMLCSSJavaScriptjQuery前端必学教程&#xff0c;小白教学&#xff0c;前端基础全套完成版_哔哩哔哩_bilibili 2.表单的获取以及下拉框 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></tit…...

    2024/4/28 3:18:10
  9. JS内置对象对象JS事件

    2.基础语法 2.10.内置对象 Arguments 只在函数内部定义&#xff0c;保存了函数的实参 Array 数组对象 Date 日期对象&#xff0c;用来创建和获取日期 Math 数学对象 String 字符串对象&#xff0c;提供对字符串的一系列操作 2.10.1.String charAt(idx) 返回指定位置处的字符…...

    2024/4/18 8:32:00
  10. 用nodejs搭建web服务器

    转自&#xff1a;微点阅读 https://www.weidianyuedu.com/content/0217495368846.html Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。Node.js 的包管理器 npm&#xff0c;是全球最…...

    2024/4/27 21:46:32
  11. 秒杀系统02——商品模块展示技术难点

    秒杀系统——商品模块展示技术难点 商品详情页 商品详情页是展示商品详细信息的一个页面&#xff0c;承载在网站的大部分流量和订单的入口。京东商城目前有通用版、全球购、闪购、易车、惠买车、服装、拼购、今日抄底等许多套模板。各套模板的元数据是一样的&#xff0c;只是…...

    2024/4/20 14:06:24
  12. python-datetime模块基本使用

    import datetime as dt该模块主要有5个类&#xff0c; datetime类&#xff1a;显示日期和时间 date类&#xff1a;显示日期 time类&#xff1a;显示时间 timedelta类&#xff1a;用于日期时间对象的计算 timezone类&#xff1a;用于时区的调整 对于类而言&#xff0c;在类中的…...

    2024/4/19 13:16:22
  13. DSNT与SCN

    DSNT与SCN 1. DSNT2、SCN1. DSNT 地址:anibali/dsntnn: PyTorch implementation of DSNT (github.com) 比起主流的预测heatmap再使用argmax获得最大响应点的方法,作者提出用soft-argmax方法,直接从featuremap计算得到近似的最大响应点,从而模型可以直接对坐标值进行回归预…...

    2024/4/13 6:25:29
  14. 《Python深度学习》读书笔记:第2章 神经网络的数学基础

    目录 第2章 神经网络的数学基础 2.1 初识神经网络 2.2 神经网络的数据表示 2.2.1 标量&#xff08;0D张量&#xff09; 2.2.2 向量&#xff08;1D张量&#xff09; 2.2.3 矩阵&#xff08;2D张量&#xff09; 2.2.4 3D张量与更高维张量 2.2.5 关键属性 2.2.6 在Numpy中…...

    2024/4/8 18:57:27
  15. 医疗影像分割

    1.U-Net 看了好几个帖子这个讲的比较贴&#xff01;&#xff01; 介绍内容&#xff1a;医学影像常用图像格式&#xff1a; &#xff08;1&#xff09;DICOM &#xff08;2&#xff09;MHD/RAW &#xff08;3&#xff09;NRRD 1.1 U-Net的架构 U-Net的U形结构如下图所示。网…...

    2024/4/20 4:40:46
  16. Java 继承 修饰符

    文章目录1.继承1.1继承的实现1. 继承的概念2. 实现继承的格式1.2继承的好处和弊端1. 好处2. 弊端3. 继承的应用场景&#xff1a;2. 继承中的成员访问特点2.1继承中变量的访问特点2.2 super 关键字1. this 和 super 关键字&#xff1a;2. this 和 super的使用2.3 继承中构造方法…...

    2024/4/13 6:25:29
  17. DAY 19冲击蓝桥杯——Python实例100之26-30

    文章目录Q11.1 题目1.2 思路1.3 代码Q22.1 题目2.2 思路2.3 代码Q33.1 题目3.2 思路3.3 代码Q44.1 题目4.2 思路4.3 代码Q55.1 题目5.2 思路5.3 代码Q1 1.1 题目 利用递归方法求5!。 1.2 思路 递归公式&#xff1a;fnfn_1*4! 1.3 代码 def fact(j):sum 0if j 0:sum 1e…...

    2024/4/16 19:02:48
  18. 11.图论

    1.基础知识 对于图来说比较重要的就是图的深度遍历和图的广度遍历&#xff0c;下面是这两种遍历的基本思想 1.深度遍历&#xff1a; 这里可以用深度搜索遍历的原因是&#xff0c;深度优先搜索使用的数据结构是栈。我们先将出度为 0 的节点放入&#xff0c;而出度为 0 的节点…...

    2024/4/20 17:43:05
  19. Python基础(五) - 面向对象编程

    python完全采用了面向对象的思想&#xff0c;是真正面向对象的编程语言&#xff0c;支持面向对象的基本操作&#xff0c;例如&#xff1a;继承、多态、封装。 python中一切皆对象。python支持面向对象、面向过程、函数式编程等多种编程范式。 目录面向对象和面向过程的区别类的…...

    2024/4/13 6:25:24
  20. 10.动态规划

    1.动态规划模板 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 1.1 动态规划和回溯的区别 什么时候用动态规划&#xff0c;什么时候用回溯&#xff1a; 如果一个题的答案是一个值&a…...

    2024/4/19 7:46:02

最新文章

  1. 江开2024年春《计算机组成原理 060214》第4次计分作业参考答案

    答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1某计算机字长32位&#xff0c;其存储容量为4GB&am…...

    2024/4/28 4:22:11
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. LeetCode-46. 全排列【数组 回溯】

    LeetCode-46. 全排列【数组 回溯】 题目描述&#xff1a;解题思路一&#xff1a;回溯。回溯三部曲解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案…...

    2024/4/26 19:51:44
  4. Windows 2008虚拟机安装、安装VM Tools、快照和链接克隆、添加硬盘修改格式为GPT

    一、安装vmware workstation软件 VMware workstation的安装介质&#xff0c;获取路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1AUAw_--yjZAUPbsR7StOJQ 提取码&#xff1a;umz1 所在目录&#xff1a;\vmware\VMware workstation 15.1.0 1.找到百度网盘中vmwa…...

    2024/4/24 23:48:40
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57