SpringMVC框架

第一章 SpringMVC 概述

1.1 SpringMVC 基本说明

SpringMVC是基于spring的, 是spring中的一个模块,做web开发使用的。 springmvc 叫做spring web mvc

说明他是spring的核心技术, 做web开发,springmvc内部是使用mvc架构模式。

SpringMVC 是一个容器, 管理对象的,使用IoC核心技术。 springmvc管理界面层中的控制器对象。

SpringMVC底层也是Servlet。 以Servlet为核心, 接收请求,处理请求。 显示处理结果给用户。

处理用户的请求:

用户发起请求----SpringMVC—Spring—MyBatis–mysql数据库

1.2 SpringMVC中的核心Servlet – DispatcherServlet

DispatcherServlet 是框架一个Servlet对象。 负责接收请求, 响应处理结果。

DispatcherServlet 他的父类是HttpServlet

DispatcherServlet 也叫做前端控制器( front controller)。

SpringMVC是管理控制器对象, 原来没有SpringMVC之前使用 Servlet作为控制器对象使用。现在通过SpringMVC容器创建一种叫做控制器的对象,代替Servlet行驶控制器的角色。功能。

SpringMVC 主要使用注解的方式, 创建控制器对象, 处理请求。

<servlet><servlet-name>myweb</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--自定义配置文件的位置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--表示服务器tomcat创建对象的顺序, 是个整数值, 大于等于0.数值越小,创建对象的时间越早。--><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>myweb</servlet-name><!--url-pattern 作用: 把一些请求交给指定的servlet处理使用中央调度器(DispatcherServlet)1. 使用扩展名方式, 格式 *.xxx ,  xxx是自定义的扩展名。例如  *.do , *.action, *.mvc 等等. 不能使用*.jsphttp://localhost:8080/myweb/some.dohttp://localhost:8080/myweb/user/list/queryUser.dohttp://localhost:8080/myweb/user/list/list.do2. 使用斜杠 "/"--><url-pattern>*.do</url-pattern></servlet-mapping>

1.3 springmvc请求的处理过程

简单的处理过程:

用户发起请求some.do—>Tomcat接收了请求—DispatcherServlet–分配MyController(doSome()返回mv对象)–mv显示给用户了。

省略tomcat

用户some.do--------------DispatcherServlet--------------MyController

如果使用servlet处理请求

用户发起请求--------------------没有其他对象------------------------Servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Qy9dlpI-1635822245044)(images/image-20201027155932057.png)]

1.4 复习

用户发起some.do—DispatcherServlet(Servlet接收请求)—转给MyController

public class DispatcherServlet extends HttpServlet{

​ public void service(HttpServletRequest request, HttpServletResponse response){

​ if(“some.do”.equals(request.getURI())){

​ //从容器中获取MyController

​ MyController c = ctx.getBean(“some”));

​ c.doSome();

​ } e lse if( “other.do”.equals(request.getURI())){

​ OtherController c = ctx.getBean(“other”));

​ c.doOther();

​ }

​ }

}

1.5 web开发中配置文件的说明

  1. web.xml 部署描述符文件 , 给服务器(tomcat)。

    作用:服务器在启动的时候,读取web.xml ,根据文件中的声明创建各种对象,

    ​ 根据文件中的声明 知道 请求和servlet等对象的关系。

  2. 框架的配置文件, springmvc的配置文件

    作用:声明框架创建的项目中的各种对象, 主要是创建Controller对象的

配置文件的加载顺序和功能

  1. tomcat服务器启动, 读取web.xml. 根据web.xml文件中的说明,创建对象。

    <servlet><servlet-name>myweb</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--自定义配置文件的位置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--表示服务器tomcat创建对象的顺序, 是个整数值, 大于等于0.数值越小,创建对象的时间越早。--><load-on-startup>1</load-on-startup></servlet>
    

    创建DispatcherServlet他的对象, 会执行init()方法。 在init()方法中会执行 springmvc容器对象创建

    WebApplicationContext ctx = new ClassPathXmlApplicationContext(“classpath:springmvc.xml”)

  2. springmvc框架, new ClassPathXmlApplicationContext()读取springmvc的配置文件。

     <context:component-scan base-package="com.bjpowernode.controller" /><!--声明视图解析器:帮助处理视图--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--前缀:指定视图文件的路径--><property name="prefix" value="/WEB-INF/view/" /><!--后缀:视图文件的扩展名--><property name="suffix" value=".jsp" /></bean>
    

    使用组件扫描器base-package=“com.bjpowernode.controller” ,遍历controller包中的所有类,MyController类, 找到这个类中的@Controller, @RequestMapping注解, 就能创建MyContoller对象。

    知道some.do的请求是执行doSome()方法

    以上 1, 2. 都是项目启动的过程, 没有执行任何的用户请求。

  3. 用户发起请求some.do----DispatcherServlet

    DispatcherServlet里面有 WebApplicationContext 。 WebApplicationContext 里面有MyController对象。

    请求some.do ,DispatcherServlet 就知道是 MyController处理的。

1.6 SpringMVC内部的执行流程

springmvc内部请求的处理过程:

  1. 用户发起请求给DispatcherServlet

  2. DispatcherServlet把请求(request)交给了 处理器映射器。

    处理器映射器: springmvc框架中的对象, 需要实现HandlerMapping接口。

    映射器作用: 从springmvc容器中,获取控制器对象(MyController),把找到的控制器和拦截器对象都放到 处理器执行链对象中,保存,并返回给中央调度器。(MyController controller = ApplicationContext.getBean())

  3. DispatcherServlet把获取到的处理器执行链中的控制器对象,交给了处理器适配器

    处理器适配器:是springmvc框架中的对象, 实现HandlerAdapter接口。

    适配器作用: 执行控制器的方法, 也就是执行MyController.doSome()方法。得到结果ModelAndView

  4. DispatcherServlet把控制器执行结果mv交给了 视图解析器

    视图解析器: springmvc中的对象,需要实现ViewResolver接口。

    视图解析器作用: 处理视图的, 组成视图的完整路径。 能创建View类型的对象

  5. DispatcherServlet调用View类的方法, 把Model中的数据放入到request作用域。 执行request.setAttribute(), 对视图执行forward()转发行为, request.getRequestDispather("/show.jsp").forward(request,response)

第二章 SpringMVC 注解式开发

2.1 @RequestMapping注解的使用。

属性: value 请求的uri地址。

位置: 1) 在方法的上面, 必须的。 2)在类的上面作为模块名称

@RequestMapping(value ="/some.do")
public ModelAndView doSome(){

属性 method 请求的方式, 使用RequestMehtod类的枚举,表示请求方式

@RequestMapping(value ="/other.do",method = RequestMethod.POST)
public ModelAndView doOther(){

2.2 接收请求中的参数

对应HttpServletRequest, HttpServletResponse, HttpSession 只需要在控制器方法的形参列表中,定义就可以了。框架会给参数赋值, 在控制器方法内部可以直接使用 request,response,session参数。

400 : http status , 表示客户端异常。 主要是发生在用户提交参数过程中。

接收请求中的参数: 逐个接收, 对象接收

2.2.1 逐个接收

逐个接收: 请求中的参数名和控制器方法的形参名一样。按照名称对象接收参数

<p>逐个接收请求参数</p>
<form action="receive-property.do" method="post">姓名:<input type="text" name="name"> <br/>年龄:<input type="text" name="age"> <br/><input type="submit" value="提交参数">
</form>

Controller接收参数

@RequestMapping(value ="/receive-property.do")
public ModelAndView doPropertyParam(String name, Integer age) {} 

接收参数的问题:

  1. 参数最好使用包装类型。 例如Integer ,能接收空值情况, 接收的是null
  2. 框架可以使用String到int ,long, float, double等类型转换。
  3. post请求中有乱码的问题, 使用字符集过滤器。

2.2.2 CharacterEncodingFilter使用:

在web.xml 声明过滤器<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!--给过滤器属性赋值--><init-param><!--项目使用的字符编码--><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param><!--强制请求(request)对象使用encoding的编码方式--><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><!--强制应答(response)对象使用encoding的编码方式--><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><!--强制所有请求,先经过过滤器处理--><url-pattern>/*</url-pattern></filter-mapping>

2.2.3 请求中参数名和形参名不一样,使用@RequestParam

/** * 逐个接收请求参数, 请求中参数名和形参名不一样 * @RequestParam : 解决名称不一样的问题 *       属性: value 请求中的参数名称 *              required : boolean类型的,默认是true *                    true:请求中必须有此参数,没有报错。 *                    false:请求中可以没有此参数。 *       位置: 在形参定义的前面 */@RequestMapping(value ="/receive-param.do")public ModelAndView doReceiveParam(    @RequestParam(value = "rname",required = false) String name,    @RequestParam(value = "rage",required = false) Integer age) { }

2.2.4 对象接收

对象接收: 在控制器方法的形参是java对象, 使用java对象的属性接收请求中参数值。

要求: java对象的属性名和请求中参数名一样。

例子:

 */public class Student {    // 属性名和请求中参数名一样    private String name;    private Integer age;    // set| get方法} @RequestMapping("/receive-object.do") public ModelAndView doReceiveObject(Student student){    System.out.println("MyController的方法doReceiveObject="+student);    ModelAndView mv = new ModelAndView();    mv.addObject("myname", student.getName());    mv.addObject("myage", student.getAge());    mv.setViewName("show");    return mv;}

2.3 控制器方法的返回值

控制器方法的返回值表示本次请求的处理结果,返回值有ModelAndView, String, void , Object

请求的处理结果包含: 数据和视图。

2.3.1 ModelAndView 数据和视图

请求的结果有数据和视图,使用ModelAndView最方便

数据:存放request作用域。

视图:执行forward转发操作

2.3.2 String 视图

框架对返回值是String,执行的是forward转发操作。

视图可以表示为完整视图路径, 或者视图的逻辑名称

@RequestMapping(value ="/return-string-view.do")public String doReturnStringView1(HttpServletRequest request,String name, Integer age) {        System.out.println("执行了MyController的doReturnStringView1方法name=");              //返回结果,forward,转发到show.jsp        //逻辑名称, 需要配置视图解析器        return "show";}@RequestMapping(value ="/return-string-view2.do")public String doReturnStringView2(HttpServletRequest request,String name, Integer age) {    System.out.println("执行了MyController的doReturnStringView2方法name=");    //完整视图路径,不能使用视图解析器    return "/WEB-INF/view/show.jsp";}

2.3.3 void 没有数据和视图

void: 没有数据和视图, 可以使用HttpServletResponse对象输出数据,响应ajax请求。

2.3.4 Object

返回Student 表示数据,还是视图。 所以控制器方法返回对象Object, 用来响应ajax请求。

返回对象Object ,可以是List, Student , Map ,String ,Integer… 这些都是数据, 而ajax请求需要的旧是数据。 在ajax请求中,一般需要从服务器返回的是json格式的数据, 经常要处理java对象到json的转换。而且还需要输出数据响应ajax请求。 框架提供了处理 java对象到json转换, 还是数据输出工作。

2.3.4.1 HttpMessageConverter 消息转换器

HttpMessageConverter 接口,作用是 1)实现请求的数据转为java对象, 2) 把控制器方法返回的对象转为json,xml,text,二进制等不同格式的数据。

public interface HttpMessageConverter<T> {   /**      作用: 检查clazz这个类型的对象,能否转为 mediaType表示的数据格式            如果能转为mediaType表示的类型, 返回true, 返回true调用read()    */   boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);   /**      作用: 接收请求中的数据,把数据转为 clazz表示的对象    */   T read(Class<? extends T> clazz, HttpInputMessage inputMessage)         throws IOException, HttpMessageNotReadableException;               /**      作用:检查clazz这种数据类型,能否转为mediaType表示的数据格式    */   boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);   /**      作用: 把t对象,按照contentType说明的格式,把对象转为json或者xml    */   void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)         throws IOException, HttpMessageNotWritableException;}

MediaType:媒体类型,表示互联网中数据的格式。例如application/json, text/html, image/gif

HttpMessageConverter 接口的实现类:MappingJackson2HttpMessageConverter : 用jackson工具库的ObjectMapper把java对象转为json数据格式StringHttpMessageConverter : 把字符串类型的数据,进行格式转换和编码

怎么使用实现类:

框架根据控制器方法的返回类型, 自动查找使用的实现类。

@RequestMapping("/receive-object.do")public Student doReceiveObject(String name,Integer age){    System.out.println("MyController的方法doReceiveObject=");    Student student = new Student();    student.setName("lisi");    student.setAge(20);    return student;}

默认情况下: springmvc使用了HttpMessageConveter接口的4个实现类。包括了StringHttpMessageConverter.

需要在springmvc的配置文件,加入注解驱动的标签 mvc:annotation-driven. 加入这个标签后, springmvc项目启动后,会创建HttpMessageConveter接口的7个实现类对象,包括StringHttpMessageConverter 和 MappingJackson2HttpMessageConverter。

2.3.4.2 @ResponseBody

@ResponseBody注解的作用,就是把student转换后的json通过HttpServletResponse对象输出给浏览器。

//输出json,响应ajaxresponse.setContentType("application/json;charset=utf-8");PrintWriter pw  = response.getWriter();pw.println(json);pw.flush();pw.close();@ResponseBody注解作用就上面的代码的实现

2.3.4.3 控制器方法返回对象转为json的步骤

1)pom.xml加入jackson依赖,springmvc框架,默认处理json就是使用jackson

2)在springmvc的配置文件中,加入注解驱动的标签mvc:annotation-dirven

  1. 在控制器方法的上面加入@ResponseBody注解,表示返回值数据,输出到浏览器。

2.4 静态资源处理

访问地址:

当web.xml中DispatcherServlet的url-pattern是 *.do

http://localhost:8080/ch05_url_pattern/index.jsp tomcat

http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js tomcat

http://localhost:8080/ch05_url_pattern/images/p1.jpg tomcat

http://localhost:8080/ch05_url_pattern/html/test.html tomcat

http://localhost:8080/ch05_url_pattern/some.do DispatcherServlet(springmvc框架)

2.4.1 tomcat的default servlet

tomcat安装目录/conf/web.xml

 <servlet>        <servlet-name>default</servlet-name>        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>        <init-param>            <param-name>debug</param-name>            <param-value>0</param-value>        </init-param>        <init-param>            <param-name>listings</param-name>            <param-value>false</param-value>        </init-param>        <load-on-startup>1</load-on-startup></servlet><servlet-mapping>        <servlet-name>default</servlet-name>        <url-pattern>/</url-pattern></servlet-mapping>default 叫做默认servlet ,作用:1.它提供静态资源的处理2.它处理所有未映射到其他请求的请求处理

2.4.2 中央调度器设置 “/”

http://localhost:8080/ch05_url_pattern/index.jsp tomcat 成功访问

http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js 404 没有对应的控制器对象

http://localhost:8080/ch05_url_pattern/images/p1.jpg 404 没有对应的控制器对象

http://localhost:8080/ch05_url_pattern/html/test.html 404 没有对应的控制器对象

http://localhost:8080/ch05_url_pattern/some.do 200 MyController

    使用斜杠 "/" . 导致中央调度器称为了默认的default servlet。    需要处理静态资源和其他的未映射的请求。  默认中央调度器没有处理    静态资源的控制器对象, 所以静态资源都是 404 。 some.do这个请求    有MyController对象, 所以能访问。    如果项目中 , 中央调度器设置了“/” , 动态资源能访问,静态资源不能访问。    需要处理静态资源的访问工作。

2.4.3 第一种方式处理静态资源

在springmvc的配置文件加入 mvc:default-servlet-handler标签, springmvc框架会在项目运行时,加入DefaultServletHttpRequestHandler对象,让这个对象处理静态资源的访问。

<!--声明注解驱动    default-servlet-handler和@RequestMapping使用有冲突--><mvc:annotation-driven /><!--声明静态资源的第一种处理方式    创建DefaultServletHttpRequestHandler处理静态资源。    DefaultServletHttpRequestHandler把接收的静态资源的地址,转发给了tomcat的default    优点:      解决方式简单    缺点:      依赖tomcat服务器提供的能力。--><mvc:default-servlet-handler />

2.4.4 第二种静态资源的处理方式

在springmvc配置文件中加入一个 mvc:resources标签, 框架会创建ResourceHttpRequestHandler控制器对象, 使用这个对象处理静态资源的访问。 不依赖tomcat服务器。 推荐使用的。

 <!--声明注解驱动        resources和@RequestMapping使用有冲突    -->    <mvc:annotation-driven />    <!--声明静态资源的第二种处理方式        mapping: 访问静态资源的uri地址, 可以使用通配符(**)。                  ** : 表示任意的目录和目录和资源名称        location: 静态资源在项目中的位置, 不要使用/WEB-INF目录    -->    <mvc:resources mapping="/images/**" location="/images/" />    <mvc:resources mapping="/html/**" location="/html/" />    <mvc:resources mapping="/js/**" location="/js/" />    <!--一句话设置静态资源-->    <!--<mvc:resources mapping="/static/**" location="/static/" />-->

第三章 SSM 整合

3.1 SSM 整合思路

SSM思路: SpringMVC+ Spring + MyBatis(IBatis), 所以有人叫做SSI整合。 SSM整合是使用三个框架的优势功能。三个框架对应的三层架构的三层。 SpringMVC是视图层, Spring是业务层, MyBatis持久层。

SSM 整合,需要把对象交给容器管理, 让容器去创建项目中要使用的java对象。 现在有两个容器。

第一个是Spring容器: Spring容器是管理service 和 dao等对象的。 是业务层对象的容器。

第二个是SpringMVC容器:管理控制器对象的。 是视图层对象。

SSM整合就是把对象交给容器管理。 两个容器共存。 各自负责管理不同的对象。 把对象声明到配置文件中,让两个容器创建对象。 spring创建service,dao; springmvc创建controller。

3.2 容器的创建

Spring容器创建: 在web.xml声明了监听器ContextLoaderListener , 这个功能框架写好了。功能是创建spring的容器对象 WebApplicationContext. 在创建WebApplicationContext对象时,读取spring的配置文件, 读取文件的时候,遇到bean标签或者注解,就能创建service ,dao等对象, 放到容器中。

SpringMVC容器: 在web.xml声明了中央调度器DispatcherServlet。 在这个servlet的init()方法中, 创建了容器对象 WebApplicationContext, 在创建WebApplicationContext对象,读取springmvc的配置文件, 读取文件的时候,遇到@Controller注解,创建控制器controller对象,放到容器中。

内存中, 创建对象

WebApplicationContext spring = new WebApplicationContext(); //spring–map(service, dao)

WebApplicationContext springmvc = new WebApplicationContext(); //springmvc–map(controller)

SpringMVC容器和Spring容器的关系: 设计上SpringMVC容器对象是 Spring容器的子容器。

Spring是父容器。 SpringMVC子容器。 相当于java中的继承关系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eQfp2WD-1635822245045)(images/image-20201030110134886.png)]

3.3 SSM整合开发步骤

  1. 使用的student2表(id,name,age)

  2. 创建maven web项目

  3. 修改pom.xml加入依赖: spring ,springmvc,mybatis, mybatis-spring, mysql驱动,druid, jackson

  4. 写web.xml : 声明容器对象

    1)声明spring的监听器ContextLoaderListener: 创建spring的容器对象, 创建service ,dao对象

    2)声明springmvc的中央调度器DispatherServlet : 创建springmvc容器对象, 创建controller对象

    3)声明字符集的过滤器 CharacterEncodingFilter , 解决post请求乱码的问题

  5. 创建程序中的包, dao ,service, controller, entity

  6. 写spring,springmvc, mybatis配置文件

  7. 写java代码, 实体类, dao接口和mapper文件, service类,controller类。 使用注解声明对象和赋值

  8. 创建视图文件, 各种jsp

3.4 相对路径

在页面中,有路径的问题, 访问路径有 "/"开头的, 还有没有 “/”。

<a href="test/some.do">没有斜杠开头</a><a href="/test/some.do">有斜杠开头</a><a href="http://www.baidu.com">有协议开头的地址</a>

地址的区别,现在看的都是在页面中的地址。

1)有协议开头的例如http://www.baidu.com , 称为绝对地址。 地址是唯一的,你能够直接访问

2)没有协议开头的,例如 test/some.do , /test/some.do 称为相对地址。 相对地址单独使用不能表示某个资源,不能访问。 相对地址必须有参考地址在一起,才能表示一个资源的完整地址,才能访问。

参考地址: 有“ /" 和没有”/“ 参考地址不同的。

1)没有斜杠开头的地址, 参考地址:当前资源的访问路径

​ 当前访问的地址: http://localhost:8080/ch07_path/index.jsp

​ 资源名称: index.jsp

​ 资源路径: http://localhost:8080/ch07_path

​ 在index.jsp 有 访问地址 a href=“test/some.do”

​ 点击some.do后, 地址变成 http://localhost:8080/ch07_path/test/some.do

此时:http://localhost:8080/ch07_path/test/some.do资源名称:some.do资源路径:http://localhost:8080/ch07_path/test/在去点击 test/some.do 地址:http://localhost:8080/ch07_path/test/test/some.do

没有斜杠开头的地址: 参考地址 + 当前的相对地址 组合在一起是最后的访问地址

解决方式:

1)使用${pageContext.request.contextPath}。 表示访问项目的路径(上下文件 context path)<a href="${pageContext.request.contextPath}/test/some.do">发起请求test/some.do</a>优点:好理解缺点:每个链接地址,都需要加el表达式2)固定当前页面中的 没有“/”开头地址的 参考地址使用html中base标签<%    String basePath = request.getScheme() + "://" + request.getServerName()            +":"+request.getServerPort()+request.getContextPath()+"/";%><head>    <title>浏览学生</title>    <base href="<%=basePath%>"> </head>
  1. 有斜杠开头的地址

a href="/test/some.do"

现在访问的的 http://localhost:8080/ch07_path/index.jsp在index.jsp中有  /test/some.do.点击/test/some.do,地址变成 http://localhost:8080/test/some.do有斜杠开头的地址,参考地址是 服务器地址, 也就是从协议开始到端口号的位置 http://localhost:8080地址组成:http://localhost:8080/test/some.do地址缺少项目访问路径, ch07_path. 

解决问题的方式:在你的路径前面加入 el表达式 ${pageContext.request.contextPath}

<p>有/开头的地址</p><a href="${pageContext.request.contextPath}/test/some.do">/test/some.do</a>

第四章 SpringMVC 核心技术。

4.1 转发和重定向

forward:视图完整路径

redirect:视图完整路径

mv.setViewName("forward:/hello.jsp");mv.setViewName("redirect:/other.jsp");

4.2 异常处理

框架使用的是集中的异常处理。 把各个Controller中抛出的异常集中到一个地方处理。 处理异常的叫做异常处理器。

框架中使用两个注解完成异常的集中处理。 这样每个controller不用单独处理异常了。注解是:

1)@ExceptionHandler : 放在方法的上面,表示此方法可以处理某个类型的异常。 当异常发生时,执行这个方法。

  1. @ControllerAdvice: 放在类的上面, 表示这个类中有异常的处理方法。 相当于aop中的@Aspect.

​ @ControllerAdvice看做是 控制器增强, 就是给Controller类增加异常(切面)的处理功能.

4.3 拦截器

拦截器:是springmvc框架中的一种对象, 需要实现接口HandlerInterceptor. 拦截用户的请求。 拦截到controller的请求。

作用:拦截用户的请求, 可以预先对请求做处理。 根据处理结果, 决定是否执行controller 。 也可以把多个controller中共用的功能定义到拦截器。

特点:

  1. 拦截器可以分为系统拦截器和自定义拦截器。
  2. 一个项目可以多个拦截器。0,或多个自定义拦截器。
  3. 拦截器侧重拦截用户的请求。
  4. 拦截器是在请求处理之前先执行的。

拦截器的定义:

1)创建类实现拦截器接口HandlerInterceptor,实现接口中的方法(3个)

2)在springmvc配置文件中,声明拦截器对象,并指定拦截的uri地址

4.3.1 第一个拦截器

public class MyInterceptor implements HandlerInterceptor {    /**     *  preHandle: 预先处理请求的方法。     *  参数:     *     Object handler : 被拦截的控制器对象(MyController)     *  返回值: boolean     *   true: 请求是正确的,可以被controller处理的。     *     =====MyInterceptor拦截器的preHandle====     *     执行了MyController的doSome方法     *     =====MyInterceptor拦截器的postHandle====     *     =====MyInterceptor拦截器的afterCompletion====     *   false: 请求不能被处理, 控制器方法不会执行。 请求到此截止。     *     =====MyInterceptor拦截器的preHandle====     * 特点:     *  1. 预处理方法他的执行时间: 在控制器方法之前先执行的。     *  2. 可以对请求做处理, 可以做登录的检查, 权限的判断, 统计数据等等。     *  3. 决定请求是否执行。     */    @Override    public boolean preHandle(HttpServletRequest request,                             HttpServletResponse response,                             Object handler) throws Exception {        System.out.println("=====MyInterceptor拦截器的preHandle====");        return true;    }    /**     * postHandle: 后处理方法     * 参数:     *  Object handler : 被拦截的控制器对象(MyController)     *  ModelAndView mv: 控制器方法的返回值(请求的执行结果)     *     * 特点:     *  1. 在控制器方法之后执行的。     *  2. 能获取到控制器方法的执行结果。 可以修改原来的执行结果。     *     可以修改数据, 也可以修改视图     *  3. 可以做对请求的二次处理。     */    @Override    public void postHandle(HttpServletRequest request,                           HttpServletResponse response,                           Object handler,                           ModelAndView mv) throws Exception {        System.out.println("=====MyInterceptor拦截器的postHandle====");    }    /**     * afterCompletion: 最后执行的方法     * 参数:     *   Object handler : 被拦截的控制器对象(MyController)     *   Exception ex: 异常对象     *     * 特点:     *  1. 在请求处理完成后执行的,     *     请求处理完成的标志是 视图处理完成,对视图执行forward操作后。     *     *  2. 可以做程序最后要做的工作, 释放内存, 清理临时变量。     *     *  3. 方法的执行条件:     *     1)当前的拦截器他的preHandle()方法必须执行。     *     2)preHandle()必须返回true。     */    @Override    public void afterCompletion(HttpServletRequest request,                                HttpServletResponse response,                                Object handler,                                Exception ex) throws Exception {        System.out.println("=====MyInterceptor拦截器的afterCompletion====");    }}

配置文件

<!--声明拦截器--><mvc:interceptors>    <!--声明第一个拦截器-->    <mvc:interceptor>        <!--指定拦截器的拦截地址            path:拦截的uri地址,使用 ** 通配符。                  例如: path="/user/**"                  http://localhost:8080/user/listUser.do                  http://localhost:8080/user/query/queryUser.do        -->        <mvc:mapping path="/**"/>        <!--指定使用的拦截器-->        <bean class="com.bjpowernode.handler.MyInterceptor"/>    </mvc:interceptor></mvc:interceptors>

当你的preHandle返回true, 执行结果:

=====MyInterceptor拦截器的preHandle====执行了MyController的doSome方法=====MyInterceptor拦截器的postHandle=========MyInterceptor拦截器的afterCompletion====请求的执行顺序: 用户some.do---preHandle---doSome---postHandle--afterComplietion

当 preHandle返回 false

=====MyInterceptor拦截器的preHandle====

4.3.2 多个拦截器

使用两个拦截器, 主要看拦截器的执行顺序,以及按个方法控制请求的执行

1)两个拦截器,第一个preHandle=true, 第二个拦截器preHandle=true

=====MyInterceptor111111拦截器的preHandle=========MyInterceptor222222拦截器的preHandle====执行了MyController的doSome方法=====MyInterceptor222222拦截器的postHandle=========MyInterceptor111111拦截器的postHandle=========MyInterceptor222222拦截器的afterCompletion=========MyInterceptor111111拦截器的afterCompletion====

请求的执行顺序:

用户some.do—拦截器1的preHandle----拦截器2preHandle—控制器doSome—拦截器2postHandle—拦截器1的postHandle—拦截器2的afterCompletion—拦截器1的afterCompletion。

2)两个拦截器,第一个preHandle=true, 第二个拦截器preHandle=false

=====MyInterceptor111111拦截器的preHandle=========MyInterceptor222222拦截器的preHandle=========MyInterceptor111111拦截器的afterCompletion====

3)两个拦截器,第一个preHandle=false, 第二个拦截器preHandle=true|false

=====MyInterceptor111111拦截器的preHandle====

为什么要使用多个拦截器 ?

  1. 把验证功能分散到独立的拦截器。 每个拦截器做单一的验证处理。
  2. 组合多个拦截器。

总结:

多个拦截器, 串在一个链条上的。 多个拦截器和一个控制器对象在一个链条上 ,框架中使用HandlerExecutionChain(处理器执行链),表示这个执行链条

public class HandlerExecutionChain {       private final Object handler;  // 存放控制器对象的,MyController    @Nullable    private HandlerInterceptor[] interceptors; // 存放多个拦截器对象的。MyInterceptor 1, 2    @Nullable    private List<HandlerInterceptor> interceptorList;}

拦截器怎么实现 1,2, 2,1的执行顺序, 遍历HandlerInterceptor[] interceptors 数组

HandlerInterceptor[] interceptors = { MyInterceptor1, MyInterceptor2};//循环调用方法 1-2for(int i=0;i<interceptors.length;i++){      HandlerInterceptor  obj= interceptors[i];      obj.preHandle();}MyController.doSome();// 2-1for(int i=interceptors.length-1 ;i>=0;i--){      HandlerInterceptor  obj= interceptors[i];      obj.postHandle();}

4.3.3 拦截器和过滤器的对比

1)拦截器是springmvc框架中的对象。 过滤器是servlet中的对象。

2)拦截器对象是框架容器创建的, 过滤器对象是tomcat创建的对象。

  1. 拦截器是侧重对请求做判断的,处理的, 可以截断请求。 过滤器是侧重对request,response对象的属性,参数设置值的。 例如request.setCharacterEncoding(“utf-8”)

  2. 拦截器的他执行时间有三个, 控制器方法之前, 之后, 请求完成后。 过滤器是在请求之前。

5)拦截器是拦截对controller,动态资源请求的 。 过滤器可以过滤所有请求动态的和静态的。

6)拦截器和过滤器一起执行的, 先执行的过滤器,后面是 中央调度器 , 后面才是拦截器, 再后面是控制器方法

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

相关文章

  1. 全球抗病毒药物耐药性市场研究及投资分析报告

    全球抗病毒药物耐药性市场研究及投资分析报告 【报告篇幅】&#xff1a;118 【报告图表数】&#xff1a;156 本文研究全球及中国市场抗病毒药物耐药性现状及未来发展趋势&#xff0c;侧重分析全球及中国市场的主要企业&#xff0c;同时对比北美、欧洲、中国、日本、东南亚、印度…...

    2024/4/15 10:30:39
  2. F5 Kube-OVN 联合方案加速 PaaS 与基础架构的融合

    Kube-OVN线上一周年大会&#xff0c;F5林静分享《PaaS和基础架构的融合》话题&#xff0c;指出PaaS需要和企业很多已有基础设施融合&#xff0c;尤其网络的融合贯穿PaaS整个生命周期&#xff0c;可以说网络需求与挑战在这个周期中并存。基于F5与Kube-OVN的联合解决方案&#xf…...

    2024/4/15 10:30:39
  3. 钉钉用户破5亿,携手蓝凌助1900万组织释放数字生产力

    10月13日&#xff0c;钉钉未来组织大会上&#xff0c;钉钉总裁叶军提出了新的年度趋势关键词“数字生产力”。蓝凌表示将与钉钉携手帮助更多企业与组织释放数字生产力。 用户破5亿&#xff0c;钉钉将成数字时代新生产力工具 截至2021年8月31日&#xff0c;钉钉用户数破5亿&…...

    2024/4/23 2:20:18
  4. 对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】

    转载请注明出处&#xff1a;http://blog.csdn.net/Righthek 谢谢&#xff01; 对于一般的CAN模块&#xff0c;进行初始化时&#xff0c;最关键的是以下两步&#xff1a; 1、 配置CAN的位时序&#xff1b; 2、 配置CAN的消息报文&#xff1b; 下面&#xff0c;我们来详细分析…...

    2024/5/3 15:15:56
  5. Hadoop集群搭建(3台)

    vi /etc/hostname #修改本机名字 (hadoop1.localdomain) vi /etc/sysconfig/network-scripts/ifcfg-__ #设置ip&#xff08;ifcfg的型号可用cd /etc/sysconfig/network-scripts…...

    2024/4/18 6:17:55
  6. NSIS制作Qt自定义界面安装包(二):使用自定义Qt安装界面

    使用自定义Qt安装界面 思路&#xff1a; NSIS支持自定义界面插件&#xff0c;编译自定义界面插件嵌入NSIS中即可。使用NSIS-UI-Plugin开源NSIS UI插件框架&#xff0c;使用Qt作为界面库。 下载开源代码NSIS-UI-Plugin Github地址&#xff1a;GitHub - sway913/NSIS-UI-Plugi…...

    2024/4/28 13:42:58
  7. c++学习笔记(3)

    前面列举了几个简单的例子&#xff0c;在这里就说一下&#xff0c;结构稍微多一点的 目录 1.打印五组24678 2.打印下列数字 3&#xff0c;判断是否结婚 4&#xff0c;打印乘法表 5&#xff0c;打印正三角 1.打印五组24678 第一种方法就相对简单一些&#xff0c;直接输出2…...

    2024/4/27 22:05:58
  8. MVC架構前端向后臺controller action傳遞參數(一)

    MVC中有多種方式從前端向后臺 controller action 方法傳遞參數值。 一、使用AJAX與后臺交互 1. 利用FormData對象 栗子&#xff1a;前端&#xff1a; function GetAttendanceList() { var qData new FormData();qData.append("practiceDt", $("#practiceDat…...

    2024/4/28 1:23:51
  9. 安装python以及一些命令和软件

    安装python就去官网下载你想要的包&#xff0c;然后下载好点击安装就可以&#xff0c;记得把python添加到路径中的选项选上。 pip命令&#xff1a; pip install ** 是安装某个包 python -m pip install --upgrade pip 升级pip命令&#xff0c;大多数时候需要升级一下pip命令&a…...

    2024/4/28 2:11:03
  10. 计算类-计算面积

    三角形面积计算 鞋带公式&#xff08;shoelace&#xff09; Shoelace公式&#xff0c;也叫高斯面积公式&#xff0c;是一种数学算法&#xff0c;可求确定区域的一个简单多边形的面积。 利用多边形&#xff08;n边形&#xff09;面积计算公式&#xff1a; S|(x1 * y2 x2 * y3 …...

    2024/4/28 2:55:10
  11. kafka服务端设置用户和密码登录及springboot访问实现

    一、背景&#xff1a;做物联网项目&#xff0c;需要用MQ做消息队列做缓冲&#xff0c;选择了使用kafka&#xff0c;部署在公网环境&#xff0c;部署kafka后没有设置登录验证&#xff0c;刚刚部署就被恶意扫描到&#xff0c;向kafka里面push超过1G的文件&#xff0c;直接导致kaf…...

    2024/4/29 0:18:58
  12. 大数据调度实践-oozie

    文章目录概述EL常量命令操作hueworkflow定时任务概述 什么是oozie Oozie是操作Hadoop job的工作流调度系统 Oozie工作流由一些有向无环图&#xff08;DAG&#xff09;的action组成 Oozie的定时器coordinator由时间或者时间和数据同时触发 Oozie的action可以是hadoop生态系的任…...

    2024/4/28 15:52:59
  13. 关于uniapp微信小程序上使用uCharts图表不随着页面滚动的问题

    我的一个页面有多个图表&#xff0c;还有v-if控制显示的两个地图&#xff0c;一开始页面滚动时&#xff0c;部分图表会固定住不随着页面滚动。 自己查了一些资料&#xff0c;也问了一些人&#xff0c;折腾了几天都没有检查出问题&#xff0c;突然想到canvas2d这个属性&#xff…...

    2024/4/28 6:41:46
  14. elementui TaBle表格表头添加icon,以及hover上去的提示文字

    render-header render-header在官方文档中的介绍是这样的&#xff1a; HMLT部分 <el-table-column prop"" show-overflow-tooltip label"待发放奖品项数" :render-header"renderTip" align"center" ></el-table-column>…...

    2024/4/28 19:49:46
  15. C# 实现读取电子秤数据-通过websocket发送数据给本地网页

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.IO; using System.Net;// websocket using Fleck;// 读取json using Newtonsoft.Json; using Newtonsoft.Json.…...

    2024/4/28 8:54:54
  16. MySQL修改表结构操作

    添加字段&#xff1a; alter table bs_label_info add column data_source_id bigint(11) default null comment 数据源id after data_type; 删除字段&#xff1a; alter tabel bs_label_info drop column data_source; 添加索引&#xff1a; alter table bs_label_info a…...

    2024/4/28 18:55:40
  17. bamvo视觉里程计编译报错‘cv::imshow(cv::String const, cv::_InputArray const)’未定义的引用

    缺少库导致报错&#xff0c;在CMakeLists.txt中&#xff0c;加上 find_package( OpenCV 3 REQUIRED ) #缺少库&#xff0c;导致报错 完整的CMakeLists.txt文件如下&#xff1a; cmake_minimum_required(VERSION 2.8.3) project(bamvo)find_package(catkin REQUIRED COMPONEN…...

    2024/4/28 7:15:47
  18. 全球小肠细菌过度生长 (SIBO) 诊断市场研究及投资分析报告

    全球小肠细菌过度生长 (SIBO) 诊断市场研究及投资分析报告 【报告篇幅】&#xff1a;116 【报告图表数】&#xff1a;155 本文研究全球及中国市场小肠细菌过度生长 (SIBO) 诊断现状及未来发展趋势&#xff0c;侧重分析全球及中国市场的主要企业&#xff0c;同时对比北美、欧洲、…...

    2024/4/27 21:46:11
  19. Redis设置密码

    Redis设置密码 设置密码有两种方式。 1. 命令行设置密码。 运行cmd切换到redis根目录&#xff0c;先启动服务端 >redis-server.exe另开一个cmd切换到redis根目录&#xff0c;启动客户端 >redis-cli.exe -h 127.0.0.1 -p 6379客户端使用config get requirepass命令查…...

    2024/4/27 22:52:20
  20. PointNet++代码的实现

    代码主要由两部分组成&#xff0c;pointnet_util.py封装着一些重要的函数组件&#xff0c;pointnet2.py用来搭建模型。 1. 功能函数文件 1、square_distance函数 该函数主要用来在ball query过程中确定每一个点距离采样点的距离。函数输入是两组点&#xff0c;N为第一组点的个…...

    2024/4/28 5:02:52

最新文章

  1. RabbitMQ入门教学(浅入浅出)

    进程间通信 互联网的通讯时网络的基础&#xff0c;一般情况下互联网的资源数据对储存在中心服务器上&#xff0c;一般情况下个体对个体的访问仅限于局域网下&#xff0c;在公网即可完成资源的访问&#xff0c;如各种网站资源&#xff0c;下载资源&#xff0c;种子等。网络通讯…...

    2024/5/3 17:16:53
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用

    数据结构 我们知道MySQL的存储引擎Innodb默认底层是使用B树的变种来存储数据的 下面我们来复习一下B树存储 B树存储 哈希存储的区别 哈希存储,只能使用等值查询 B树与B树存储 我们知道B树实际上就是B树的变种 那么为啥使用B树而不是使用B树呢? 我们知道效率的高低主要取决于…...

    2024/5/2 2:42:20
  4. [Flutter]导入singular_flutter_sdk后运行到Android报错

    问题&#xff1a; 接入归因之前&#xff0c;flutter项目一起正常。接入归因之后&#xff0c;iOS正常Android有问题。 dependencies: # Singular归因singular_flutter_sdk: ^1.3.3 针对 Flutter 的 Singular SDK 集成指南 https://support.singular.net/hc/zh-cn/articles/…...

    2024/4/30 20:13:57
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/5/2 9:28:15
  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/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

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

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

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

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

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

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

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

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

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

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

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/4/30 9:42:49
  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