SpringMVC

  • 回顾原生Servlet 获取请求参数
    • 通过 Servlet API 获取
      • 案例
    • 通过控制器方法的形参获取请求参数
      • 设置字符编码格式
        • CharacterEncodingFilter 部分源码
      • 案例
        • 无同名请求参数
        • 有同名请求参数
    • @RequestParam 注解获取请求参数
      • 案例
    • @RequestHeader 注解
      • 案例
    • @CookieValue
      • 案例
    • 通过 POJO 获取请求参数
      • 案例
  • 域对象共享数据
    • 使用 ServletAPI 向 request 域对象共享数据
    • 使用ModelAndView向request域对象共享数据
    • 使用 Model 向 request 域对象共享数据
    • 使用 Map 向 request 域对象共享数据
    • 使用 ModelMap 向 request 域对象共享数据
    • Model、ModelMap、Map的关系
    • 使用 ServletAPI 向 session 域共享数据
    • 使用ServletAPI向application域共享数据
  • 四大作用域说明
    • application 作用域
    • session 作用域
      • 了解
      • 删除 session 的三种方式
      • 注意
    • request 作用域
    • page 作用域
  • SpringMVC 的视图
    • ThymeleafView
      • 案例
      • 原理分析
    • 转发视图
      • 案例
      • 原理分析
    • 重定向视图
      • 案例
      • 原理分析
    • 转发与重定向(理解)
      • 转发
      • 重定向
    • SpringMVC 视图控制器(view-controller)
    • SpringMVC 视图解析器(InternalResourceViewResolver)

回顾原生Servlet 获取请求参数

通过 Servlet API 获取

  • 将 HttpServletRequest 作为控制器方法的形参,此时 HttpServletRequest 类型的参数表示封装了当前请求的请求报文的对象。

    一个 HTTP 请求报文由请求行(request line)、请求头部(header)、空行和请求数据 4 个部分组成

案例

  • 创建 test_param.html 页面用来测试获取请求参数的效果

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试请求参数</title>
    </head>
    <body><h1>测试请求参数</h1><a th:href="@{/testServletAPI(name='tom', age=18)}">测试使用ServletAPI获取请求参数</a><br/>
    </body>
    </html>
    
  • 创建 Controller,并编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;/*** @ClassName ParamController* @Description: 测试获取请求参数的功能* @Author Laoyang* @Date 2022/1/7 11:13*/
    @Controller
    public class ParamController {/*** 跳转至 test_param 页面*/@RequestMapping("/param")public String doTestParam() {return "test_param";}/*** 通过 ServletAPI 获取请求参数* 形参位置的 request 表示当前请求(通过它可以获取到当前请求中的数据)* > 实际开发中 request 用的比较少,一般都是用注解获取*/@RequestMapping("/testServletAPI")public String testServletAPI(HttpServletRequest request){String name = request.getParameter("name");String age = request.getParameter("age");System.out.println(name + "--->" + age);    // tom--->18return "success";}
    }
  • 启动Tomcat测试效果

    • 浏览器效果

      在这里插入图片描述

    • 控制台效果

      在这里插入图片描述

通过控制器方法的形参获取请求参数

  • 在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在 DispatcherServlet 中就会将请求参数赋值给相应的形参

设置字符编码格式

  • 为什么要设置?

    如果我们不设置字符编码的话,那么表单提交中文数据之后,就会导致乱码,所以这里先设置对应的字符编码,这样就不用担心后面的测试会出现乱码的问题了。

在 web.xml 文件中设置字符编码

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 设置字符编码格式 --><filter><filter-name>encoding-filter</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><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encoding-filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

Ps:虽然我这里只写了设置字符编码的代码,但是之前的配置也是要加上的(比如注册前端控制器那些配置),我这里为了简洁,就不全部展示出来了。

CharacterEncodingFilter 部分源码

public class CharacterEncodingFilter extends OncePerRequestFilter {// 字符编码格式@Nullableprivate String encoding;// 是否强制使用手动设置的编码格式private boolean forceRequestEncoding = false;private boolean forceResponseEncoding = false;public void setForceEncoding(boolean forceEncoding) {this.forceRequestEncoding = forceEncoding;this.forceResponseEncoding = forceEncoding;}@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String encoding = getEncoding();if (encoding != null) {// 如果 forceRequestEncoding 不为false 或者还没有设置 request 的字符编码,那么就设置request的字符编码if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {request.setCharacterEncoding(encoding);}// 如果 forceResponseEncoding 不为false,就设置 response 的字符编码if (isForceResponseEncoding()) {response.setCharacterEncoding(encoding);}}// 如果 encoding 没有配置,则使用默认的编码格式filterChain.doFilter(request, response);}
}

案例

无同名请求参数

  • 在 test_param.html 页面编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试请求参数</title>
    </head>
    <body><h1>测试请求参数</h1><!-- 通过控制器方法的形参获取请求参数 --><a th:href="@{/parameter(name='tom', age=18)}">通过控制器方法的形参获取请求参数</a><br/>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Arrays;
    import java.util.List;@Controller
    public class ParamController {/*** 通过控制器方法的形参获取请求参数(无重名属性写法)* 如果没有重名的请求参数传过来,那么只需要将传过来的请求参数名和控制器方法中的参数名保持一致即可*/@RequestMapping("/parameter")public String doParameter(String name, Integer age) {System.out.println(name + "--->" + age);    // tom--->18return "success";}
    }
    
  • 启动Tomcat查看效果

    在这里插入图片描述

    控制台打印:admin--->12345--->篮球,足球

有同名请求参数

  • 在 test_param.html 页面编写表单

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试请求参数</title>
    </head>
    <body><h1>测试请求参数</h1><form method="get" th:action="@{/parameter2}">用户名:<input name="username" type="text"><br/>密码:<input name="password" type="text"><br/>爱好:<input name="hobby" type="checkbox" value="篮球">篮球<input name="hobby" type="checkbox" value="足球">足球<input name="hobby" type="checkbox" value="羽毛球">羽毛球<br/><input type="submit" value="提交测试"></form>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Arrays;
    import java.util.List;@Controller
    public class ParamController {/*** 通过控制器方法的形参获取请求参数(无重名属性写法)* 如果有多个重名的请求参数传过来(比如表单中的复选框),则可以使用下面的几种方式接收:* 1、可以使用请求参数名与控制参数名相同的方式进行接收(String hobby),多个值之间默认会使用逗号分隔(a,b,c)* 2、可以使用一个数组进行接收(String[] hobby)* > 大家可根据自己的需求进行使用*/@RequestMapping("/parameter2")public String doParameter2(String username, String password, String[] hobby) {// System.out.println(username + "--->" + password + "--->" + hobby);System.out.println(username + "--->" + password);System.out.println(Arrays.toString(hobby));return "success";}
    }
    
  • 启动Tomcat查看效果

    在这里插入图片描述

    效果和无同名参数是一样的,都可以获取到对应的请求参数

@RequestParam 注解获取请求参数

  • @RequestParam 是将请求参数和控制器方法的形参创建映射关系

  • @RequestParam 注解一共有三个属性

    • value:指定为形参赋值的请求参数的参数名

    • required:设置是否必须传输此请求参数,默认值为 true

      若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue 属性,则页面报错 400:Required String parameter 'xxx' is not present;若设置为 false,则当前请求不是必须传输 value 所指定的请求参数,若没有传输,则注解所标识的形参的值为 null

    • defaultValue:不管 required 属性值为 true 或 false,当 value 所指定的请求参数没有传输或传输的值为 “”(空字符串)时,则使用默认值为形参赋值

案例

  • 在 test_param.html 页面编写表单

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试请求参数</title>
    </head>
    <body><h1>测试请求参数</h1><!-- 使用注解方式获取请求参数 --><form method="get" th:action="@{/parameter3}"><!-- 用户名设置为 user_name,这样后端的 username 形参就接收不到了这个时候就需要使用 @RequestParam 注解进行获取 -->用户名:<input name="user_name" type="text"><br/>密码:<input name="password" type="text"><br/>爱好:<input name="hobby" type="checkbox" value="篮球">篮球<input name="hobby" type="checkbox" value="足球">足球<input name="hobby" type="checkbox" value="羽毛球">羽毛球<br/><input type="submit" value="提交测试"></form>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Arrays;
    import java.util.List;@Controller
    public class ParamController {@RequestMapping("/parameter3")public String doParameter3(String username,String password,String[] hobby) {
    //        System.out.println(username + "--->" + password + "--->" + hobby);System.out.println(username + "--->" + password);System.out.println(Arrays.toString(hobby));return "success";}
    }
    

    为了能够让大家看到更好的效果,我这里先不加 @RequestParam 注解

  • 启动Tomcat查看效果

    在这里插入图片描述

    浏览器中的效果基本没什么问题,但是控制台中打印的效果就是:null--->12345--->篮球,足球

    虽然浏览器发送请求的时候带了 user_name,但是控制器方法中并没有可以接收这个值的参数,所以最后得到的值就是 null

  • 使用 @RequestParam 注解获取请求参数

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Arrays;
    import java.util.List;@Controller
    public class ParamController {/*** 使用 @RequestParam 注解获取请求参数* 参数说明:* name:请求参数名称* value:请求参数名称(这个参数用的比 name 要多,但是效果是一样的)* required:默认为true,表示是否必须传输 value或name 对应的请求参数* (比如这里对应的请求参数为 user_name,如果我们在请求映射的时候发现请求参数中并没有 user_name 这个值,那么就会报 400)* defaultValue:默认值,如果没有传输 value或name 对应的请求参数,则会使用我们设置的默认值*                      如果传输了对应的请求参数,则使用传输过来的值*                      该属性会将 required 值设置为 false*/@RequestMapping("/parameter3")public String doParameter3(@RequestParam(value = "user_name", defaultValue = "haha") String username,String password,String[] hobby) {
    //        System.out.println(username + "--->" + password + "--->" + hobby);System.out.println(username + "--->" + password);System.out.println(Arrays.toString(hobby));return "success";}
    }
    

    大家可以结合注释中的属性说明,进行设置,然后测试对应的效果,我这里就不一 一展示了

  • 再次测试

    在这里插入图片描述

    控制台打印admin--->123456--->篮球,足球(具体打印的数据就是这些,只是格式不同罢了,大家不要太较真),因为我们还设置了默认值,所以如果在表单提交的时候 user_name 为空,那么最后打印的就是 haha--->123456--->篮球,足球,有兴趣的话可以测试一下

@RequestHeader 注解

  • @RequestHeader 是将请求头信息和控制器方法的形参创建映射关系
  • @RequestHeader 注解一共有三个属性:value、required、defaultValue,用法同 @RequestParam

案例

  • 在 test_param.html 页面编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试请求参数</title>
    </head>
    <body><h1>测试请求参数</h1><!-- 使用 @RequestHeader 注解获取请求头信息 --><a th:href="@{/header}">测试@RequestHeader注解获取请求头信息</a><br/>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestHeader;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import javax.servlet.http.HttpServletRequest;
    import java.util.*;@Controller
    public class ParamController {/*** 使用 @RequestHeader 注解获取请求头信息* 可以使用 Map 获取到所有的请求头信息,也可以只获取请求头信息中某一个参数* > @RequestHeader 注解的属性和 @RequestParam 注解的一样,所以这里就不多说了*/@RequestMapping("/header")public String doHeader(@RequestHeader("Host") String host, @RequestHeader Map<String, String> headers) {for (Map.Entry<String, String> map : headers.entrySet()) {System.out.println(map.getKey() + ":" + map.getValue());}System.out.println("host:" + host);return "success";}
    }
    
  • 启动Tomcat查看效果

    • 浏览器就是页面跳转成功的效果
    • 主要还是看控制台打印,大家也可以直接把 Map 设置为返回值,然后把获取的请求头存进 Map 中然后进行返回,这样就可以看到在页面中看到获取到的请求头数据了(也可以直接使用 F12 进行查看)

@CookieValue

  • @CookieValue 是将 cookie 数据和控制器方法的形参创建映射关系
  • @CookieValue 注解一共有三个属性:value、required、defaultValue,用法同 @RequestParam

案例

  • 在 test_param.html 页面编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试请求参数</title>
    </head>
    <body><h1>测试请求参数</h1><!-- 使用 @CookieValue 注解获取 Cookie 信息 --><a th:href="@{/cookie}">测试@CookieValue注解获取请求头信息</a><br/>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.CookieValue;
    import org.springframework.web.bind.annotation.RequestHeader;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.*;@Controller
    public class ParamController {/*** 使用 @CookieValue 注解获取 Cookie 信息* > 注意:每个人的 cookie 可能不太一样,具体可在浏览器 F12 中进行查看*/@RequestMapping("/cookie")public String doCookie(@CookieValue("JSESSIONID") String jsessionid) {System.out.println("---->" + jsessionid);return "success";}
    }
    
  • 启动Tomcat查看效果

    • 主要看控制台的打印效果,所以这里就不截图了,大家可自行查看

通过 POJO 获取请求参数

可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。

案例

  • 编写对应实体类

    package com.laoyang.mvc.pojo;public class User {private String username;private String password;private String sex;private Integer age;private String email;public User() {}public User(String username, String password, String sex, Integer age, String email) {this.username = username;this.password = password;this.sex = sex;this.age = age;this.email = email;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", sex='" + sex + '\'' +", age=" + age +", email='" + email + '\'' +'}';}
    }
    
  • 在 test_param.html 页面编写表单

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试请求参数</title>
    </head>
    <body><h1>测试请求参数</h1><!-- 通过 POJO 获取请求参数 --><form th:action="@{/doUser}" method="post">用户名:<input type="text" name="username"><br/>密码:<input type="password" name="password"><br/>性别:<input type="radio" name="sex" value=""><input type="radio" name="sex" value=""><br/>年龄:<input type="text" name="age"><br/>邮箱:<input type="text" name="email"><br/><input type="submit" value="测试pojo获取参数"></form>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import com.laoyang.mvc.pojo.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.CookieValue;
    import org.springframework.web.bind.annotation.RequestHeader;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.*;@Controller
    public class ParamController {/*** 通过 POJO 获取请求参数* 在需要传输多个请求参数的时候最好就是用这种方式* 如果全部写在控制器方法的形参中会显得非常冗余,而且也比较麻烦*/@RequestMapping("/doUser")public String doPojo(User user) {System.out.println(user);return "success";}
    }
    
  • 启动Tomcat查看效果

    此时在浏览器输入完对于的表单数据后,控制器方法中就可以正常拿到对应的参数值,并进行打印(记得一定要配置好编码格式!)

域对象共享数据

  • 为了整洁,创建一个新的工程来进行演示,和之前一样的东西:web.xmlspring-mvc.xmlpom.xml

  • HelloController:

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;@Controller
    public class TestController {/*** 跳转至首页*/@RequestMapping("/")public String doIndex() {return "index";}
    }
    
  • index.html:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1>
    </body>
    </html>
    

使用 ServletAPI 向 request 域对象共享数据

  • 在 index.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1><!-- 使用 ServletAPI 向 request 域对象共享数据 -->
    <a th:href="@{/doServletAPI}">使用ServletAPI向request域对象共享数据</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;@Controller
    public class ScopeController {/*** 使用ServletAPI向request域对象共享数据*/@RequestMapping("/doServletAPI")public String doRequest(HttpServletRequest request) {request.setAttribute("name", "我是张三!");return "success";}
    }
    
  • 创建 success.html 页面,并获取域对象

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试多种获取域对象的方式</title>
    </head>
    <body><h1>测试多种获取域对象的方式</h1><p th:text="${name}"></p></body>
    </html>
    
  • 启动Tomcat查看效果

    在这里插入图片描述

使用ModelAndView向request域对象共享数据

  • 在 index.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1>
    <!-- 使用 ModelAndView 向 request 域对象共享数据 -->
    <a th:href="@{/doModelAndView}">使用ModelAndView向request域对象共享数据</a><br/>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Map;@Controller
    public class ScopeController {/*** 使用 ModelAndView 向 request 域对象共享数据*/@RequestMapping("/doModelAndView")public ModelAndView doModelAndView() {ModelAndView modelAndView = new ModelAndView();// 处理模型数据,即向请求域 request 共享数据modelAndView.addObject("modelAndView", "Hello, ModelAndView");// 设置视图名称(也就是页面名称)modelAndView.setViewName("success");return modelAndView;}
    }
    
  • 在 success.html 页面获取域对象

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试多种获取域对象的方式</title>
    </head>
    <body><h1>测试多种获取域对象的方式</h1>
    <!-- 使用 ModelAndView 方式共享的数据 -->
    <p th:text="${modelAndView}"></p></body>
    </html>
    
  • 启动Tomcat查看效果

    在这里插入图片描述

使用 Model 向 request 域对象共享数据

  • 在 index.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1><!-- 使用 Model 向 request 域对象共享数据 -->
    <a th:href="@{/doModel}">使用Model向request域对象共享数据</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Map;@Controller
    public class ScopeController {/*** 使用 Model 向 request 域对象共享数据*/@RequestMapping("/doModel")public String doModel(Model model) {model.addAttribute("model", "代码人,代码魂!");return "success";}
    }
    
  • 在 success.html 页面获取域对象

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试多种获取域对象的方式</title>
    </head>
    <body><h1>测试多种获取域对象的方式</h1><!-- 使用 Model 方式共享的数据 -->
    <p th:text="${model}"></p></body>
    </html>
    
  • 启动Tomcat查看效果

    在这里插入图片描述

使用 Map 向 request 域对象共享数据

  • 在 index.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1><!-- 使用 Map 向 request 域对象共享数据 -->
    <a th:href="@{/doMap}">使用Map向request域对象共享数据</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Map;@Controller
    public class ScopeController {/*** 使用 Map 向 request 域对象共享数据*/@RequestMapping("/doMap")public String doMap(Map<String, Object> map) {// map 中添加的每一个数据就是一个共享数据map.put("map", "代码小白!");return "success";}
    }
    
  • 在 success.html 页面获取域对象

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试多种获取域对象的方式</title>
    </head>
    <body><h1>测试多种获取域对象的方式</h1><!-- 使用 ModelMap 方式共享的数据 -->
    <p th:text="${modelMap}"></p>
    </body>
    </html>
    
  • 启动Tomcat查看效果

    在这里插入图片描述

使用 ModelMap 向 request 域对象共享数据

  • 在 index.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1><!-- 使用 ModelMap 向 request 域对象共享数据 -->
    <a th:href="@{/doModelMap}">使用ModelMap向request域对象共享数据</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Map;@Controller
    public class ScopeController {/*** 使用 ModelMap 向 request 域对象共享数据*/@RequestMapping("/doModelMap")public String doModelMap(ModelMap modelMap) {modelMap.addAttribute("modelMap", "2022必没bug!!!");return "success";}
    }
    
  • 在 success.html 页面获取域对象

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试多种获取域对象的方式</title>
    </head>
    <body><h1>测试多种获取域对象的方式</h1>
    <!-- 使用 ModelMap 方式共享的数据 -->
    <p th:text="${modelMap}"></p>
    </body>
    </html>
    
  • 启动Tomcat查看效果

    在这里插入图片描述

Model、ModelMap、Map的关系

一共有五种共享方式:

  • 第一种:使用 ServletAPI(不建议使用)
  • 第二种:使用 ModelAndView
  • 第三种:使用 Model
  • 第四种:使用 Map
  • 第五种:使用 ModelMap

Model、Map、ModelMap 的关系:

BindingAwareModelMap 以及父级的部分源码:
public class BindingAwareModelMap extends ExtendedModelMap {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class ModelMap extends LinkedHashMap<String, Object> {}这三个方式都是通过 BindingAwareModelMap 类进行实例化的:
因为 BindingAwareModelMap 继承了 ExtendedModelMap,而 ExtendedModelMap 继承了 ModelMap,所以BindingAwareModelMap 可以对 ModelMap 进行实例化
因为 BindingAwareModelMap 继承了 ExtendedModelMap,而 ExtendedModelMap 实现了 Model,所以BindingAwareModelMap 可以对 Model 进行实例化
因为 BindingAwareModelMap 继承了 ExtendedModelMap,而 ExtendedModelMap 继承了 ModelMap,而 ModelMap 又继承了 LinkedHashMap,所以可以对 Map 进行实例化

使用 ServletAPI 向 session 域共享数据

  • 在 index.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1>
    <!-- 使用 ServletAPI 向 session 域共享数据 -->
    <a th:href="@{/doSession}">使用ServletAPI向session域共享数据</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.Map;@Controller
    public class ScopeController {/*** 使用ServletAPI向 Session 域共享数据*/@RequestMapping("/doSession")public String doSession(HttpSession session) {session.setAttribute("servletApi", "这是session数据~");return "success";}
    }
    
  • 在 success.html 页面获取 session 域对象

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试多种获取域对象的方式</title>
    </head>
    <body><h1>测试多种获取域对象的方式</h1>
    <!-- 使用 ServletAPI 向 Session域共享的数据 -->
    <p th:text="${session.servletApi}"></p></body>
    </html>
    

    注意:在页面获取 session 数据的时候需要使用 “session.属性” 才可以获取到对应的值

  • 启动Tomcat查看效果

    在这里插入图片描述

使用ServletAPI向application域共享数据

  • 在 index.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>首页</h1>
    <!-- 使用 ServletAPI 向 application 域共享数据 -->
    <a th:href="@{/doApplication}">使用ServletAPI向application域共享数据</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.Map;@Controller
    public class ScopeController {/*** 使用ServletAPI向 application 域共享数据*/@RequestMapping("/doApplication")public String doApplication(HttpSession session) {ServletContext application = session.getServletContext();application.setAttribute("applicationScope", "这是application的数据哦!");return "success";}
    }
    
  • 在 success.html 页面获取 application 域对象

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head><meta charset="UTF-8"><title>测试多种获取域对象的方式</title>
    </head>
    <body><h1>测试多种获取域对象的方式</h1>
    <!-- 使用 ServletAPI 向 application域共享的数据 -->
    <p th:text="${application.applicationScope}"></p>
    </body>
    </html>
    

    调用的方式和 session 的差不多,也是需要使用“”对应的域对象.对应的属性” 才能获取到对应的值

  • 启动Tomcat查看效果

    在这里插入图片描述

四大作用域说明

application 作用域

  • 如果把变量放到 application 里,就说明它的作用域是 application。

  • 有效范围:application 的有效范围是整个应用;整个应用是指从应用启动,到应用结束。我们没有说 “从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。

    application 作用域里的变量,它们的存活时间是最长的,如果不手动删除,它们就可以一直使用

  • Object getAttribute(String name) //从application中获取信息;

  • void setAttribute(String name,Object value) //向application作用域中设置信息。

session 作用域

  • 如果把变量放到 session 里,就说明它的作用域是session(session 存放在服务器端的内存中)。
  • 有效范围:它的有效范围是当前会话;所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。
  • Object HttpSession.getAttribute(String name) //从session中获取信息。
  • void HttpSession.setAttribute(String name,Object value)//向session中保存信息。
  • HttpSessionHttpServletRequest.getSessio() //获取当前请求所在的session的对象。

了解

  • session 从浏览器发出第一个 HTTP 请求即可认为会话开始。但结束就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断

    如果一定的时间内客户端没有反应,则认为会话结束。

  • Tomcat 的默认值为 120 分钟,但这个值也可以通过 HttpSession的setMaxInactiveInterval() 方法来设置:

    void setMaxInactiveInterval(int interval)

  • 如果想主动让会话结束,例如用户单击 “注销” 按钮的时候,可以使用 HttpSession 的 invalidate() 方法,用于强制结束当前 session

删除 session 的三种方式

  • Session 超时:超时指的是连续一定时间服务器没有收到该 Session 所对应客户端的请求,并且这个时间超过了服务器设置的 Session 超时的最大时间。
  • 程序调用 HttpSession.invalidate()
  • 服务器关闭或服务停止

注意

  1. 访问 *.html 的静态资源因为不会被编译为 Servlet,也就不涉及 session 的问题了。
  2. 当 JSP 页面没有显式禁止 session 的时候,在打开浏览器第一次请求该 jsp 的时候,服务器会自动为其创建一个 session,并赋予它一个 sessionID,发送给客户端的浏览器。
  3. 由于 session 会消耗内存资源,因此,如果不打算使用 session,应该在所有的 JSP 中关闭它。
  4. session 不会应该浏览器的关闭而删除,只能通过上面说的三种方式删除。

request 作用域

  • request 里的变量可以跨越 forward 前后的两页,但是只要刷新页面,它们就重新计算了。

  • 请求转发servlet. getRequestDispatcher("new.jsp").forward(req,resp);

注意

  1. 转发是服务器行为,而重定向是客户端行为。
  2. 无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个 Servlet 的地址。

page 作用域

  • page 对象的作用范围仅限于用户请求的当前页面
  • request 和 page 的生命周期都是短暂的,它们之间的区别:一个 request 可以包含多个 page 页(include,forward 及 filter)。

更多可看这位大佬写的博客:https://m.php.cn/article/418934.html

SpringMVC 的视图

  • SpringMVC 中的视图是 View 接口,视图的作用:渲染数据,将模型 Model 中的数据展示给用户 SpringMVC 视图的种类很多,默认有转发视图和重定向视图
  • 当工程引入 jstl 的依赖,转发视图会自动转换为 JstlView
  • 若使用的视图技术为 Thymeleaf,在 SpringMVC 的配置文件中配置了 Thymeleaf 的视图解析器,由此视图解析器解析之后所得到的是 ThymeleafView

ThymeleafView

当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被 SpringMVC 配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转。

案例

  • 创建 view.html 页面,并编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>视图测试</title>
    </head>
    <body>
    <h1>SpringMVC视图</h1>
    <a th:href="@{/doThymeleafView}">测试ThymeleafView</a><br/>
    </body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;@Controller
    public class ViewController {/*** 跳转至视图测试页面*/@RequestMapping("/doView")public String doView() {return "view";}/*** 默认(无前缀)* ThymeleafView 视图对象*/@RequestMapping("/doThymeleafView")public String doThymeleafView() {return "success";}
    }
    
  • 启动Tomcat查看效果

    • 正常效果就是可以正常访问到 view 页面和 success 页面,这里就不截图了(localhost:8080/springmvc/doView)
    • 实现原理可看下面的原理分析

原理分析

部分源码:

public class DispatcherServlet extends FrameworkServlet {protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mv = null;mv = ha.handle(processedRequest, response, mappedHandler.getHandler());// 处理ModelAndView封装的模型数据和视图信息processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}// 处理ModelAndView封装的模型数据和视图信息private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,@Nullable Exception exception) throws Exception {if (mv != null && !mv.wasCleared()) {// 如果视图不为空,则将该视图进行渲染render(mv, request, response);if (errorView) {WebUtils.clearErrorRequestAttributes(request);}}}// 渲染视图protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {// 本地化(就是本地的环境,由两个部分组成,一个是语言码,一个是国家码,比如 zh_CH 就表示“中文_中国”)Locale locale =(this.localeResolver != null ? this.localeResolver.resolveLocale(request) : request.getLocale());response.setLocale(locale);View view;// 获取视图名称String viewName = mv.getViewName();if (viewName != null) {/* 根据视图名称和ModelAndView中封装的模型数据获取到视图对象因为我们没有在控制器方法返回的时候设置前缀,所以这里创建的是一个ThymeleafView(视图对象)> 可简单理解为:当控制器方法中所设置的视图名称没有任何前缀时,得到的就是ThymeleafView视图对象*/view = resolveViewName(viewName, mv.getModelInternal(), locale, request);if (view == null) {throw new ServletException("Could not resolve view with name '" + mv.getViewName() +"' in servlet with name '" + getServletName() + "'");}}}
}

在这里插入图片描述

注意:以上只是部分源码解析,如果想要看到更加详细的,可以自行去源码中探索!

转发视图

  • SpringMVC 中默认的转发视图是 InternalResourceView

  • SpringMVC 中创建转发视图的情况

    当控制器方法中所设置的视图名称以 “forward:” 为前缀时,就会创建 InternalResourceView 视图,此时的视图名称不会被 SpringMVC 配置文件中所配置的视图解析器解析,而是会将前缀 “forward:” 去掉,剩余部分作为最终路径通过转发的方式实现跳转。

    例如"forward:/",“forward:/employee”

案例

  • 在 view.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>视图测试</title>
    </head>
    <body>
    <h1>SpringMVC视图</h1>
    <a th:href="@{/doForward}">测试InternalResourceView</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;@Controller
    public class ViewController {/*** 跳转至视图测试页面*/@RequestMapping("/doView")public String doView() {return "view";}/*** 默认(无前缀)* ThymeleafView 视图对象*/@RequestMapping("/doThymeleafView")public String doThymeleafView() {return "success";}/*** 转发视图(前缀为:“forward:”)* InternalResourceView 视图对象*/@RequestMapping("/doForward")public String doInternalResourceView() {/*1、使用 forward 为前缀时不能直接访问具体的页面(会报404),因为页面必须通过服务器进行访问>错误写法:return "forward:success";2、如果想要通过 forward 访问到具体页面,可以转发到一个跳转到某个页面的控制器方法(控制器方法设置的请求路径)中比如:forward:/doThymeleafView3、这里最终页面显示的地址是 /doForward,而不是 /doThymeleafView*/return "forward:/doThymeleafView";}
    }
    
  • 启动Tomcat查看效果

    • 正常效果就是可以正常访问到 view 页面和 success 页面,这里就不截图了

原理分析

  • 关键的一些源码还是刚才的那些,所以这里就不做记录了

在这里插入图片描述

重定向视图

  • SpringMVC 中默认的重定向视图是 RedirectView

  • 当控制器方法中所设置的视图名称以 “redirect:” 为前缀时,创建 RedirectView视图,此时的视图名称不会被 SpringMVC 配置文件中所配置的视图解析器解析,而是会将前缀 “redirect:” 去掉,剩余部分作为最终路径通过重定向的方式实现跳转。

    例如"redirect:/",“redirect:/employee”

案例

  • 在 view.html 中编写超链接

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head><meta charset="UTF-8"><title>视图测试</title>
    </head>
    <body>
    <h1>SpringMVC视图</h1>
    <a th:href="@{/doRedirect}">测试RedirectView</a><br/></body>
    </html>
    
  • 编写对应控制器方法

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;@Controller
    public class ViewController {/*** 跳转至视图测试页面*/@RequestMapping("/doView")public String doView() {return "view";}/*** 默认(无前缀)* ThymeleafView 视图对象*/@RequestMapping("/doThymeleafView")public String doThymeleafView() {return "success";}/*** 重定向视图(前缀为:“redirect:”)* RedirectView 视图对象*/@RequestMapping("/doRedirect")public String doRedirectView() {/*1、使用 redirect 为前缀时不能直接访问具体的页面(会报404)>错误写法:return "redirect:success";2、如果想要通过 redirect 访问到具体页面,可以转发到一个跳转到某个页面的控制器方法(控制器方法设置的请求路径)中比如:redirect:/doThymeleafView3、这里最终页面显示的地址是 /doThymeleafView,而不是 /doRedirect*/return "redirect:/doThymeleafView";}
    }
  • 启动Tomcat查看效果

    • 正常效果就是可以正常访问到 view 页面和 success 页面,这里就不截图了

原理分析

  • 关键的一些源码还是刚才的哪些,所以这里就不做记录了

在这里插入图片描述

转发与重定向(理解)

转发与重定向的作用:在 Servlet 中实现页面的跳转

转发

  • 概念:由服务器进行的页面跳转就被称为 “转发”

  • 特点

    • 地址栏不发生变化,显示的是上一个页面的地址
    • 请求次数:只有一次请求(就是浏览器向服务器发送的那一次请求)
    • 请求域数据不会丢失
    • 根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
  • 原生 Servlet 实现转发使用 request.getRequestDispatcher("/地址").forward(request, response);

  • SpringMVC 使用转发在返回的地址前使用 redirect: 当做前缀(底层会进行解析,最后得到一个 InternalResourceView 视图对象)

重定向

  • 概念:由服务器进行的页面跳转就被称为 “重定向”
  • 特点
    • 地址栏显示的是新的地址
    • 请求次数:两次
    • 请求域中的数据会丢失,因为是两次次请求
    • 根目录:http://localhost:8080/,没有项目的访问地址

SpringMVC 视图控制器(view-controller)

当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用 view-controller标签进行表示。

注意

1、如果不单单是跳转页面,而是进行了一定的操作,那么就不要使用 view-controller,因为 view-controller 无法实现对应操作!
2、在配置文件中配置view-controller之后,会导致 controller 控制器中的所有请求映射失效

  • 注释掉 index 的请求映射

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;@Controller
    public class TestController {/*** 跳转至首页*/
    //    @RequestMapping("/")
    //    public String doIndex() {
    //        return "index";
    //    }}
    
  • 在 spring-mvc.xml 配置文件中使用 view-controller 标签进行处理

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 扫描组件 --><context:component-scan base-package="com.laoyang.mvc" /><!-- 配置 Thymeleaf 视图解析器 --><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><!-- 优先级 --><property name="order" value="1"/><!-- 字符编码 --><property name="characterEncoding" value="UTF-8"/><!-- 模板 --><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 视图前缀 --><property name="prefix" value="/WEB-INF/templates/"/><!-- 视图后缀 --><property name="suffix" value=".html"/><!-- 模板模型 --><property name="templateMode" value="HTML5"/><!-- 页面编码格式 --><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean><!--path:设置处理的请求地址,该路径是和 @RequestMapping 注解中的地址是一样的简单理解:就是把 controller 中用来跳转页面的控制器方法写在了配置文件中view-controller:设置请求地址所对应的视图名称注意:1、如果不单单是跳转页面,而是进行了一定的操作,那么就不要写在配置文件中,因为配置文件无法实现对应操作!2、在配置文件中配置view-controller之后,会导致 controller 控制器中的所有请求映射失效--><!-- 访问方式:http://localhost:8080/springmvc/ --><mvc:view-controller path="/" view-name="index"/><!-- 访问方式:http://localhost:8080/springmvc/doView --><mvc:view-controller path="/doView" view-name="view"/>
    </beans>
    

    为了更好的看懂,我这里还配置了一个跳转到 view.html 页面的 view-controller,记得要把对应控制器中的控制器方法注释掉! 不注释掉的话可能会出现一些不必要的问题。

  • 启动Tomcat测试效果

    • 访问方式:localhost:8080/springmvc/

      在这里插入图片描述

    • 访问方式:localhost:8080/springmvc/doView

      在这里插入图片描述

    • 可以看到,我们在配置文件中配置的路径是可以正常访问到对应的页面的,但是此时会有一个小问题,就是点击页面的超链接之后会报 404,这是因为 view-controller 标签会导致所有控制器中的请求映射失效。

      在这里插入图片描述

  • 解决请求映射失效问题(annotation-driven)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 扫描组件 --><context:component-scan base-package="com.laoyang.mvc" /><!-- 配置 Thymeleaf 视图解析器 --><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><!-- 优先级 --><property name="order" value="1"/><!-- 字符编码 --><property name="characterEncoding" value="UTF-8"/><!-- 模板 --><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 视图前缀 --><property name="prefix" value="/WEB-INF/templates/"/><!-- 视图后缀 --><property name="suffix" value=".html"/><!-- 模板模型 --><property name="templateMode" value="HTML5"/><!-- 页面编码格式 --><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean><!--path:设置处理的请求地址,该路径是和 @RequestMapping 注解中的地址是一样的view-controller:设置请求地址所对应的视图名称--><!-- 访问方式:http://localhost:8080/springmvc/ --><mvc:view-controller path="/" view-name="index"/><!-- 访问方式:http://localhost:8080/springmvc/doView --><mvc:view-controller path="/doView" view-name="view"/><!-- 解决请求映射失效问题:开启 mvc 的注解驱动 --><mvc:annotation-driven />
    </beans>
    
  • 再次测试

    在这里插入图片描述

    此时点击超链接就可以正常进行映射了

SpringMVC 视图解析器(InternalResourceViewResolver)

我们上面使用的视图解析器都是解析 html 页面的(ThymeleafViewResolver),但如果视图使用的是 JSP 页面,那么就需要使用 InternalResourceViewResolver 视图解析器

  • 创建一个新的项目,然后把 web.xml、pom 依赖复制到这个新项目中

  • 在 resource 目录下创建并编写 spring-mvc.xml 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描组件 --><context:component-scan base-package="com.laoyang.mvc" /><!-- 视图解析器 --><bean id="resolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/templates/" /><property name="suffix" value=".jsp" /></bean>
    </beans>
    
  • 在 webapp 目录下创建 index.jsp

    • 说明

      Tomcat 的 web.xml 文件中配置了默认欢迎页(index.html,index.htm,index.jsp);但是在 Tomcat 中,每一个 webapp 目录下的子目录都被认为是一个 JSP 站点,所以只能访问到 index.jsp 欢迎页

      如果在 webapp 目录下同时创建了 index.html 和 index.jsp,那么访问的时候就会报 404,如果只有 index.html,那么启动后也是会报404,因为访问不到默认页

    <%--Created by IntelliJ IDEA.User: LaoyangDate: 2022/1/10Time: 17:15To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>首页</title>
    </head>
    <body><h1>Hello Tom!</h1><!--pageContext.request.contextPath:page域对象中的数据,通过这个域对象可以拿到上下文路径> 因为 jsp 不会自动给我们加上上下文路径然后在进行访问,所以这里我们需要手动添加,并且必须添加为动态的上下文路径> 如果是配置固定的上下文路径,那么以后一旦修改,维护起来就很麻烦--><a href="${pageContext.request.contextPath}/doSuccess">访问 success.jsp 页面</a>
    </body>
    </html>
    
  • 在 WEB-INF/templates 目录下创建 success.jsp

    <%--Created by IntelliJ IDEA.User: LaoyangDate: 2022/1/10Time: 17:22To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>主页面</title>
    </head>
    <body><h1>主页面效果</h1>
    </body>
    </html>
    
  • 编写对应的控制器方法,实现页面跳转

    package com.laoyang.mvc.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;/*** @ClassName JspController* @Description: JSP 跳转* @Author Laoyang* @Date 2022/1/10 17:12*/
    @Controller
    public class JspController {@RequestMapping("/doSuccess")public String doSuccess() {// 这里返回的 jsp 页面会被 spring-mvc.xml 配置文件中的视图解析器进行解析return "success";}
    }
    
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 音视频开发 (WebRTC、OpenGL、FFmpeg、ijkplayer.....)精编源码解析

    从通信为王的时代&#xff0c;到互联网高歌猛进的二十一世纪&#xff0c;音视频技术一直是众多科技公司的必备技能。 要说音视频技术&#xff0c;在这两年迎来爆发期。首先 5G 的发展提供了硬件条件&#xff0c;又受疫情的影响&#xff0c;生活场景线上化&#xff0c;大量的线…...

    2024/4/14 9:47:04
  2. 浅谈前端开发调试工具Chrome DevTools的使用

    前端调试与调试工具了解 众所周知&#xff0c;前端开发调试具有非常复杂的特点。既可以从浏览器调试&#xff0c;也可以从Hybrid、NodeJS、小程序等平台调试。调试工具也具有多样化的特点&#xff0c;如Charles、Spy-Debugger、Whistle以及本篇将重点介绍的Chrome DevTools。 …...

    2024/4/7 15:35:04
  3. 一定能看懂的 Retrofit 最详细的源码解析

    前提 只有了解了框架的原理才能更好的使用她&#xff0c;才能定位问题的根本。写这篇文章的也是为了自我的学习和提升。其实看源码就跟看书一样&#xff0c;看了这么多本书有什么用呢&#xff0c;其实不然&#xff0c;这些知识已经潜移默化的影响了你的思维。你之后在阅读源码时…...

    2024/4/14 9:47:04
  4. torch.optim.lr_scheduler--学习率调整总结

    参考链接&#xff1a;https://blog.csdn.net/qyhaill/article/details/103043637 调用例子&#xff1a; import torch import torch.nn as nn from torch.optim.lr_scheduler import LambdaLRinitial_lr 5class model(nn.Module):def __init__(self):super().__init__()self…...

    2024/4/20 4:35:41
  5. Armv8-A虚拟化手册(2)

    4. Stage2转换 4.1 什么是stage2转换 Stage2转换允许一个hypervisor控制虚拟机中内存视图。特别的&#xff0c;它允许hypervisor控制一个虚拟机可以访问哪个内存映射的系统资源&#xff0c;这些资源呈现在虚拟机中的地址空间的哪里。 控制内存访问的能力对隔离和基础服务很重要…...

    2024/4/14 9:47:35
  6. Conformer阅读笔记

    论文&#xff1a;《Conformer: Convolution-augmented Transformer for Speech Recognition》 摘要 基于transformer和卷积神经网络cnn的模型在ASR上已经达到了较好的效果&#xff0c;都要优于RNN的效果。Transformer能够捕获长序列的依赖和基于内容的全局交互信息&#xff0…...

    2024/4/7 15:34:59
  7. pyecharts第十节、地图(三、省份地图)

    上文继续 声明以下使用的包集合 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts0.5.10 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple echarts-countries-pypkg pip install -i https://pypi.tuna.tsinghua.edu.cn/simple echarts-china-pr…...

    2024/4/14 9:47:40
  8. 阿里云服务器远程登录网站后台,免费SSL证书申请(HTTP转为HTTPS)

    一&#xff1a;登录阿里云后台 阿里云后台 二&#xff1a;切换root用户 sudo su root 三&#xff1a;宝塔登录 bt default 3.1 浏览器输入外网面板地址&#xff0c;输入username&#xff0c;password 3.2成功登录 免费SSL证书申请&#xff08;HTTP转为HTTPS&#xff09;...

    2024/4/7 15:34:57
  9. 2022-2028年全球与中国电力电子变压器产业市场前瞻与投资战略规划分析

    本文研究全球与中国市场电力电子变压器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析电力电子变压器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

    2024/4/20 1:22:46
  10. 0121嵌入式C学习日志

    关键字 static 静态类 //只有函数在多次调用时定义 局部变量加static会将存储位置从栈区存到全局变量区 全局变量声明static只有当前文件能使用 const关键字 const int* a; int const *a; 指针常量 是一个指向const int型的指针&#xff0c;a所指向的内存单元不可改写…...

    2024/4/14 9:47:50
  11. 三维CAD核心技术及发展趋势

    本文源自对华天软件CTO梅敬成博士视频分享的总结 一、发展历程 三维CAD起源于高端制造业的需求&#xff0c;例如航天、航空和汽车。 &#xff08;1&#xff09;什么是参数化设计&#xff1f; 无论多么复杂的几何模型&#xff0c;都可以分解成有限数量的构成特征&#xff0c…...

    2024/4/20 18:04:45
  12. 异步编程漫谈

    异步编程漫谈一. 同步和异步二. 为什么要异步编程三. 如何异步编程1. 异步的实现方式2. 异步实现的提供方式四. 协程的分类五. 各种原生支持异步编程语言漫谈1. JavaScript2. C#3. Go六. 总结一. 同步和异步 要完全理解异步编程需要先理解几个概念 任务 我给任务的定义是完成…...

    2024/4/25 15:00:02
  13. docker - seata 使用nacos注册中心和配置中心,集成feign-rest调用,

    docker - seata 使用nacos注册中心和配置中心,集成feign-rest调用&#xff0c; Server端使用nacos配置中心注册中心 从v1.4.2版本开始&#xff0c;已支持从一个Nacos dataId中获取所有配置信息,你只需要额外添加一个dataId配置项。 docker 配置中心 在 registry.conf 中加入…...

    2024/4/14 9:48:05
  14. Java中String类的常用方法

    一、认识String类 String类在java.lang包中&#xff0c;java使用String类创建一个字符串变量&#xff0c;字符串变量属于对象。java把String类声明的final类&#xff0c;不能有类。String类对象创建后不能修改&#xff0c;由0或多个字符组成&#xff0c;包含在一对双引号之间。…...

    2024/4/23 1:47:01
  15. 全球及中国数字功率转换行业商业模式分析及投资风险预测2022年版

    本文研究全球与中国市场数字功率转换的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析数字功率转换的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要…...

    2024/4/16 1:58:47
  16. 会员管理系统源码 php语言开发 可用于美容店,理发店,服装店

    会员管理系统源码 php语言开发 可用于美容店&#xff0c;理发店&#xff0c;服装店&#xff0c;美甲店&#xff0c;奢侈品店等等 功能介绍&#xff1a; 1.常用功能 会员登记&#xff0c;会员充值&#xff0c;会员充次&#xff0c;商品消费&#xff08;会员&#xff09;&#xf…...

    2024/4/18 11:48:38
  17. C语言复习二

    const的使用&#xff1a; 首先const原来是c里面的&#xff0c;用来定义常量&#xff0c;后来被引用到C语言里面来&#xff0c;用来定义只读变量 例如(int const a),表示a这个值只可读不可以进行其他操作。但是a可以&#xff0c;改变这个指针的地址可以但不可以改变指针所指的内…...

    2024/4/28 14:28:42
  18. Infinite Dictionaries

    原题连接:Infinite Dictionaries - C语言网 A dictionary is a set of key-value pairs, for example: {color:red, price:2, 7:test, 100:-100} //一个字典是一组关键对&#xff0c;例如{color:red, price:2, 7:test, 100:-100} As you can see, keys and values can be strin…...

    2024/4/28 20:19:19
  19. 数据库系统原理(BNU_党德鹏_慕课)超详细听课笔记(上)

    数据库系统原理 笔记第一章 绪论第一节 数据库第二节 数据库管理系统第三节 数据管理技术发展趋势第二章 关系模型第一节 关系结构和约束第二节 基本关系代数运算第三节 附加关系代数运算第四节 扩展关系代数运算第三章 PG数据定义与操作第一节 SQL概述第二节 数据定义与修改第…...

    2024/4/28 4:09:07
  20. 程序设计与算法(二):3. 二分算法

    目录 例 查找p 例 查找lowerbound 例 二分法求方程的根 例 找一对数 例 农夫和奶牛 例子源于慕课课程&#xff1a;程序设计与算法二 二分查找&#xff1a;有序、时间复杂度是log(n) 例 查找p int BS(int a[], int size, int p) {int low 0, high size - 1;while (low &l…...

    2024/4/29 2:45:12

最新文章

  1. React Context

    Context https://juejin.cn/post/7244838033454727227?searchId202404012120436CD549D66BBD6C542177 context 提供了一个无需为每层组件手动添加 props, 就能在组件树间进行数据传递的方法 React 中数据通过 props 属性自上而下(由父及子)进行传递&#xff0c;但此种用法对…...

    2024/5/2 22:46:05
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. pyside6的QSpinBox自定义特性初步研究(二)

    当前的需求是&#xff0c;蓝色背景的画面&#xff0c;需要一个相对应色系的QSpinBox部件。已有的部件风格是这样的&#xff0c;需要新的部件与之般配。 首先新建一个QDoubleSpinBox&#xff0c;并定义其背景色和边框&#xff1a; QDoubleSpinBox { color: white; border:1px…...

    2024/4/30 6:11:48
  4. 【Godot4自学手册】第三十五节摇杆控制开门

    本节主要实现&#xff0c;在地宫墙壁上安装一扇门&#xff0c;在核实安装一个开门的摇杆&#xff0c;攻击摇杆&#xff0c;打开这扇门&#xff0c;但是只能攻击一次&#xff0c;效果如下&#xff1a; 一、添加完善节点 切换到underground场景&#xff0c;先将TileMap修改一下…...

    2024/5/1 13:37:32
  5. Python语法总结:not(常出现错误)

    0、not是什么 在python中not是逻辑判断词&#xff0c;用于布尔型True和False之前 a not Ture # a False b not False # b True1、not的用法 &#xff08;1&#xff09;判断语句 if not a:# 如果a是False&#xff0c;执行的语句&#xff08;2&#xff09;判断元素是否在…...

    2024/5/2 5:16:56
  6. 【外汇早评】美通胀数据走低,美元调整

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

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

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

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

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

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

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

    2024/5/2 9:28:15
  10. 【外汇早评】日本央行会议纪要不改日元强势

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

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

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

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

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

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

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

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:18
  27. 错误使用 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,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
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:16:58
  45. 如何在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