• SpringMVC(Rest+映射请求数据+模型数据+视图和视图解析器)


    目录

    一.Rest-优雅的 url 请求风格

    1.Rest-基本介绍

    1.说明

    2.REST 的核心过滤器

    2.Rest 风格的 url-完成增删改查

    2.1代码实现

    2.2查询GET

    2.3添加POST

    2.4删除DELETE

    2.5修改[PUT]

    2.6注意事项和细节说明

    二.SpringMVC 映射请求数据

    1.获取参数值

    1.1说明

    1.2解读@RequestParam(value="name", required=false)

     1.3实践

    孩子单纯的认为这个注解有点多此一举的感觉,[狗头]

    2.获取 http 请求消息头

    2.1说明:

    3.获取 javabean 形式的数据

    3.1使用场景说明

     先创建两个Javabean文件

    handler类

    jsp文件

    结果显示

    使用注意事项

    4.获取 servlet api

    4.1应用实例

    4.2演示实例

    4.3使用注意事项

    三.模型数据

    1.模型数据处理-数据放入 request

    1.1 需求分析

    1.2方式 1: 通过 HttpServletRequest 放入 request 域

    1.3方式 2: 通过请求的方法参数 Map 放入 request 域,object>

    1.4 方式 3: 通过返回 ModelAndView 对象 实现 request 域数据

    2.模型数据处理-数据放入 session

    1 .需求分析/图解

     2.环境搭配

    3.代码实现

    3.@ModelAttribute 实现 prepare 方法(前置方法)

    1 .应用实例

    2.代码解读

    3.@ModelAttribute 最佳实践

    四.视图和视图解析器

    1.基本介绍

    2.自定义视图

    2.1 为什么需要自定义视图

    2.2 自定义视图实例-代码实现

    3.自定义视图工作流程小结

    4.自定义视图-工作流程

    4.目标方法直接指定转发或重定向

    4.1使用实例  

    4.2代码演示


    一.Rest-优雅的 url 请求风格

    1.Rest-基本介绍

    1.说明

            1. REST:即 Representational State Transfer ( 资源 ) 表现层状态转化。是目前流行的请求方
    式。它结构清晰 , 很多网站采用
            2. HTTP 协议里面,四个表示操作方式的动词:GET POST PUT DELETE 。它们分别对应 四种基本操作:GET 用来获取资源, POST 用来新建资源, PUT 用来更新资源, DELETE 用来删除资源。
            3. 实例
    传统的请求方法 :
            getBook?id=1 GET
            delete?id=1 GET
            update POST
            add POST
            4. 说明: 传统的 url 是通过参数来说明 crud 的类型, rest 是通过 get/post/put/delete 来说
    crud 的类型

    2.REST 的核心过滤器

            1. 当前的浏览器只支持 post/get 请求,因此为了得到 put/delete 的请求方式需要使用 Spring
    提供的 HiddenHttpMethodFilter 过滤器进行转换 .
            2. HiddenHttpMethodFilter:浏览器 form 表单只支持 GET POST 请求,而 DELETE, PUT 等 method 并不支持, Spring 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、 POST PUT DELETE 请求
            3. HiddenHttpMethodFilter 能对 post 请求方式进行转换,因此我们需要特别的注意这一点
            4. 这个过滤器需要在 web.xml 中配置

    2.Rest 风格的 url-完成增删改查

    2.1代码实现

    1. 修改 web.xml 添加 HiddenHttpMethodFilter

    1. <filter>
    2. <filter-name>hiddenHttpMethodFilterfilter-name>
    3. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
    4. filter>
    5. <filter-mapping>
    6. <filter-name>hiddenHttpMethodFilterfilter-name>
    7. <url-pattern>/*url-pattern>
    8. filter-mapping>

    2. 修改 springDispatcherServlet-servlet.xml

    1. <mvc:annotation-driven>mvc:annotation-driven>
    2. <mvc:default-servlet-handler/>

    3.rest.jsp前端页面

    1. <%--
    2. User:海绵hong
    3. Date: 2022/10/26
    4. Time: 19:46
    5. --%>
    6. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    7. <html>
    8. <head>
    9. <title>rest title>
    10. head>
    11. <body>
    12. <h3>Rest风格的crud操作案例h3>
    13. <br><hr>
    14. <h3>rest风格的url 查询书籍[get]h3>
    15. <a href="user/book/200">点击查询书籍a>
    16. <br><hr>
    17. <h3>rest风格的url 添加书籍[post]h3>
    18. <form action="user/book" method="post">
    19. name:<input name="bookName" type="text"><br>
    20. <input type="submit" value="添加书籍">
    21. form>
    22. <br><hr>
    23. <h3>rest风格的url, 删除一本书h3>
    24. <a href="user/book/600" id="deleteBook">删除指定id的书a>
    25. <form action="" method="post" id="hiddenForm">
    26. <input type="hidden" name="_method"/>
    27. form>
    28. <br><hr>
    29. <h3>rest风格的url 修改书籍[put]~h3>
    30. <form action="user/book/666" method="post">
    31. <input type="hidden" name="_method" value="PUT">
    32. <input type="submit" value="修改书籍~">
    33. form>
    34. body>
    35. html>

    2.2查询GET

    1. //查询[GET]
    2. @GetMapping (value = "/book/{id}")
    3. public String getBook(@PathVariable("id") String id) {
    4. System.out.println("查询书籍 id=" + id );
    5. return "success";
    6. }

    2.3添加POST

    1. //添加[POST]
    2. @PostMapping(value = "/book")
    3. public String addBook(String bookName) {
    4. System.out.println("添加书籍 bookName== " + bookName);
    5. return "success";
    6. }

    2.4删除DELETE

    1. 默认情况下 删除指定id的书 是get
    2. 怎么样将 get 请求转成 springmvc 可以识别的 delete 就要考虑HiddenHttpMethodFilter机制
    
    
    1. public static final String DEFAULT_METHOD_PARAM = "_method";
    2. ---------------------------------------------------
    3. private static final List ALLOWED_METHODS =
    4. Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(),
    5. HttpMethod.DELETE.name(), HttpMethod.PATCH.name()));
    6. ---------------------------------------------------
    7. if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
    8. String paramValue = request.getParameter(this.methodParam);
    9. if (StringUtils.hasLength(paramValue)) {
    10. String method = paramValue.toUpperCase(Locale.ENGLISH);
    11. if (ALLOWED_METHODS.contains(method)) {
    12. requestToUse = new HttpMethodRequestWrapper(request, method);
    13. }
    14. }
    15. }
    3. 上面代码可以看到 HiddenHttpMethodFilter 过滤器可以对以Post方式提交的delete,put,patch进行转换,成springmvc
       识别的 RequestMethod.DELETE / RequestMethod.PUT /...
    4. 我们需要将 get 删除指定id的书 以post方式提交给后端handler, 这样过滤器还会生效
    5. 我们可以同jquery来处理-引入jquery
    1. <%-- 引入jquery--%>
    2. <script type="text/javascript" src="script/jquery-3.6.0.min.js">script>
    3. <script type="text/javascript">
    4. $(function () { //当页面加载完成后,就执行=> 如果你完全忘记,去回顾我们讲过的jquery
    5. //给删除超链接绑定一个点击事件
    6. $("#deleteBook").click(function (){
    7. //alert("点击。。。。");
    8. //我们自己定义给提交的行为
    9. $("#hiddenForm").attr("action", this.href);//将超链接的值赋值给表单hiddenForm
    10. $(":hidden").val("DELETE");//给它设置一个delete
    11. $("#hiddenForm").submit();
    12. return false; //改变点击超链接的行为, 不在提交
    13. })
    14. })
    15. script>

    2.5修改[PUT]

    1. @PutMapping("/book/{id}")
    2. public String updateBook(@PathVariable("id") String id) {
    3. System.out.println("修改书籍 id=" + id);
    4. return "redirect:/user/success"; //重定向到一个没有指定 method 的 Handler 方法
    5. }

    2.6注意事项和细节说明

            1、 HiddenHttpMethodFilter ,在将 post 转成 delete / put 请求时,是按 _method 参数名来读取的
            2、如果 web 项目是运行在 Tomcat 8 及以上,会发现被过滤成 DELETE PUT 请求,到达
    控制器时能顺利执行,但是返回时(forward)会报 HTTP 405 的错误提示:消息 JSP 只允GET POST HEAD
            1) 解决方式 1: 使用 Tomcat7
            2) 解决方式 2: 将请求转发(forward)改为请求重定向(redirect) : 重定向到一个 Handler
    Handler 转发到页面
    3 、页面测试时 , 如果出现点击修改书籍,仍然走的是删除 url , 是因为浏览器原因 ( 缓存等原
    ), 换成 chrome 即可

    二.SpringMVC 映射请求数据

    1.获取参数值

    1.1说明

    1. 开发中,如何获取到 http://xxx/url? 参数名 = 参数值 & 参数名 = 参数值(之前我们是参数和地址参数名相同可以获取到)
    2. 这个使用的非常广泛,我们看一个案例

    1.2解读@RequestParam(value="name", required=false)

    1. 获取到超链接传递的数据 请求 http://localhost:8080/springmvc/vote/vote01?name=xx
    2. @RequestParam 表示会接收提交的参数
    3. value="name" 表示提交的参数名是name
    4. required=false 表示该参数可以没有, 默认是true,表示必须有这个参数
    5. 当我们使用了@RequestParam(value="name", required=false)后就请求的参数名和方法的形参名可以不一致

     1.3实践

    1. @RequestMapping(value = "/vote01")
    2. public String test01(@RequestParam(value = "name", required = false) String username) {
    3. System.out.println("得到的username= " + username);
    4. //返回到一个结果
    5. return "success";
    6. }

    孩子单纯的认为这个注解有点多此一举的感觉,[狗头]

    2.获取 http 请求消息头

    2.1说明:

    1. 开发中,如何获取到 http 请求的消息头信息
    2. 使用较少

    3.之前我们在servlet中使用其他方法来获取,但是在这个里面我们就可以使用@RequestHeader("Http请求头字段")来获取

    1. /**
    2. * 需求: 获取http请求头信息, 获取到Accept-Encoding 和 Host
    3. * 1. 这里涉及到前面讲过的http协议,小伙伴可以进行回顾
    4. *
    5. * @RequestHeader("Http请求头字段")
    6. */
    7. @RequestMapping(value = "/vote02")
    8. public String test02(@RequestHeader("Accept-Encoding") String ae,
    9. @RequestHeader("Host") String host) {
    10. System.out.println("Accept-Encoding= " + ae);
    11. System.out.println("Host= " + host);
    12. //返回到一个结果
    13. return "success";
    14. }

    结果:

    Accept-Encoding(是浏览器发给服务器,声明浏览器支持的编码类型)= gzip, deflate, br
    Host= localhost:8080

    3.获取 javabean 形式的数据

    3.1使用场景说明

    开发中,如何获取到 javaben 的数据,就是以前的 entity/pojo 对象数据

    演示如果获取到提交数据->封装成java对象
    
    @return 说明
    1. 方法的形参用对应的类型来指定即可, SpringMVC会自动的进行封装
    2. 如果自动的完成封装, 要求提交的数据,参数名和对象的字段名保持一致
    3. 如果属性是对象,这里就是仍然是通过 字段名.字段名 比如Master [pet]即提交的数据 参数名 是 pet.id pet.name, 这就是级联操作
    4. 如果提交的数据 的参数名和对象的字段名不匹配,则对象的属性值就是null
    5. 小伙伴疑惑,怎么就封装成功[底层仍然是反射+注解..]

     先创建两个Javabean文件

    1. package com.hong.web.requestparam.entity;
    2. /**
    3. * @author 海绵hong
    4. * @version 1.0
    5. */
    6. public class Pet {
    7. private Integer id;
    8. private String name;
    9. public Integer getId() {
    10. return id;
    11. }
    12. public void setId(Integer id) {
    13. this.id = id;
    14. }
    15. public String getName() {
    16. return name;
    17. }
    18. public void setName(String name) {
    19. this.name = name;
    20. }
    21. @Override
    22. public String toString() {
    23. return "Pet{" +
    24. "id=" + id +
    25. ", name='" + name + '\'' +
    26. '}';
    27. }
    28. }
    1. package com.hong.web.requestparam.entity;
    2. /**
    3. * @author 海绵hong
    4. * @version 1.0
    5. */
    6. public class Master {
    7. private Integer id;
    8. private String name;
    9. private Pet pet;//对象的属性是另外一个对象[涉及级联]
    10. public Integer getId() {
    11. return id;
    12. }
    13. public void setId(Integer id) {
    14. this.id = id;
    15. }
    16. public String getName() {
    17. return name;
    18. }
    19. public void setName(String name) {
    20. this.name = name;
    21. }
    22. public Pet getPet() {
    23. return pet;
    24. }
    25. public void setPet(Pet pet) {
    26. this.pet = pet;
    27. }
    28. @Override
    29. public String toString() {
    30. return "Master{" +
    31. "id=" + id +
    32. ", name='" + name + '\'' +
    33. ", pet=" + pet +
    34. '}';
    35. }
    36. }

    handler类

    1. @RequestMapping(value = "/vote03")
    2. public String test03(Master master) {
    3. System.out.println("master=" + master);
    4. //返回结果
    5. return "success";
    6. }

    jsp文件

    1. <h1>添加主人信息h1>
    2. <form action="vote/vote03" method="post">
    3. 主人号:<input type="text" name="id"><br>
    4. 主人名:<input type="text" name="name"><br>
    5. 宠物号:<input type="text" name="pet.id"><br>
    6. 宠物名:<input type="text" name="pet.name"><br>
    7. <input type="submit" value="添加主人和宠物">
    8. form>

    结果显示

    使用注意事项

    1. 支持级联数据获取
    2. 表单的控件名称 name 需要和 javabean 对象字段对应 , 否则就是 null

    4.获取 servlet api

    4.1应用实例

    说明
    1. 开发中 , 我们可能需要使用到原生的 servlet api ,看看如何获取
    2. 使用 servlet api , 需要引入 tomcat/lib 下的 servlet-api .jar

    4.2演示实例

    1. /**
    2. * 使用servlet api, 来获取提交的数据
    3. *
    4. * @return
    5. */
    6. @RequestMapping(value = "/vote04")
    7. public String test04(HttpServletRequest request,
    8. HttpServletResponse response,
    9. HttpSession hs) {
    10. //获取到session
    11. //servlet原生的方式
    12. HttpSession session = request.getSession();
    13. System.out.println("session=" + session);
    14. //注意:通过参数传入的 hs 和 通request.getSession() 得到的对象是
    15. //同一个
    16. System.out.println("hs= " + hs);
    17. String username = request.getParameter("username");
    18. String pwd = request.getParameter("pwd");
    19. System.out.println("username= " + username);
    20. System.out.println("pwd= " + pwd);
    21. //返回结果
    22. return "success";
    23. }
    1. <h1>演示 servlet api的使用 h1>
    2. <form action="vote/vote04" method="post">
    3. 用户名:<input type="text" name="username"><br>
    4. 密 码:<input type="password" name="pwd"><br>
    5. <input type="submit" value="添加用户">
    6. form>

    4.3使用注意事项

    1. 除了 HttpServletRequest, HttpServletResponse 还可以其它对象也可以这样的形式获取
    2. HttpSession java.security.Principal,InputStream,OutputStream,Reader,Writer
    3. 其中一些对象也可以通过 HttpServletRequest / HttpServletResponse 对象获取,比如
    Session 对象 , 既可以通过参数传入,也以通过 request.getSession() 获取,效果一样,推
    荐使用参数形式传入,更加简单明了

    三.模型数据

    1.模型数据处理-数据放入 request

    1.1 需求分析

    说明
    开发中 , 控制器 / 处理器中获取的数据如何放入 request 域,然后在前端 (VUE/JSP/...) 取出显
    应用实例需求

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 海绵hong
    4. Version: 1.0
    5. Filename: request_parameter
    6. --%>
    7. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    8. <html>
    9. <head>
    10. <title>测试 模型数据title>
    11. head>
    12. <body>
    13. <h1>添加主人信息h1>
    14. <form action="vote/vote05" method="post">
    15. 主人号:<input type="text" name="id"><br>
    16. 主人名:<input type="text" name="name"><br>
    17. 宠物号:<input type="text" name="pet.id"><br>
    18. 宠物名:<input type="text" name="pet.name"><br>
    19. <input type="submit" value="添加主人和宠物">
    20. form>
    21. <br/><hr/>
    22. <h1>添加主人信息[测试 Map ]h1>
    23. <form action="vote/vote06" method="post">
    24. 主人号:<input type="text" name="id"><br>
    25. 主人名:<input type="text" name="name"><br>
    26. 宠物号:<input type="text" name="pet.id"><br>
    27. 宠物名:<input type="text" name="pet.name"><br>
    28. <input type="submit" value="添加主人和宠物">
    29. form>
    30. <br/><hr/>
    31. <h1>添加主人信息[测试ModelAndView]h1>
    32. <form action="vote/vote07" method="post">
    33. 主人号:<input type="text" name="id"><br>
    34. 主人名:<input type="text" name="name"><br>
    35. 宠物号:<input type="text" name="pet.id"><br>
    36. 宠物名:<input type="text" name="pet.name"><br>
    37. <input type="submit" value="添加主人和宠物">
    38. form>
    39. body>
    40. html>
    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 海绵hong
    4. Version: 1.0
    5. Filename: vote05
    6. --%>
    7. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    8. <html>
    9. <head>
    10. <title>vote_ok title>
    11. head>
    12. <body>
    13. <h1>获取的的数据显示页面h1>
    14. <hr>
    15. 取出 request域的数据-通过前面讲解的el表达式来获取即可
    16. <br>
    17. address: ${requestScope.address}<br>
    18. 主人名字= ${requestScope.master.name}
    19. 主人id= ${requestScope.master.id}
    20. 宠物名字= ${requestScope.master.pet.name}
    21. html>

    1.2方式 1: 通过 HttpServletRequest 放入 request

    1. /**
    2. * 解读
    3. * 1. 演示将提交的数据->springmvc封装到java对象->springmvc 会自动的将其放入到request域
    4. * 2. 这样我们就可以在跳转到的页面取出数据.
    5. *
    6. * @return
    7. */
    8. @RequestMapping(value = "/vote05")
    9. public String test05(Master master, HttpServletRequest request) {
    10. //解读
    11. //1. springmvc会自动把获取的model模型,放入到request域中,名字就是master
    12. //2. 也可以手动将master放入到request
    13. request.setAttribute("address", "beijing");
    14. //3. 如果我们希望修改master的属性值
    15. master.setName("nono");//request域中的值也会发生变化
    16. //4. 分析一下springmvc默认存放对象到request域中,属性名是
    17. // request域 ("master", master) 属性名是类名/类型名 首字母小写
    18. //返回到一个结果
    19. return "vote_ok";
    20. }
    request域 ("master", master) 属性名是类名/类型名 首字母小写

    1.3方式 2: 通过请求的方法参数 Map 放入 request

    1. /**
    2. * 演示通过Map 设置数据到request域
    3. *
    4. * @return
    5. */
    6. @RequestMapping(value = "/vote06")
    7. public String test06(Master master, Map map) {
    8. System.out.println("------test06-----");
    9. //解读
    10. //1. 需求是通过map对象,添加属性到request中
    11. //2. 原理分析:springmvc会遍历map,然后将map的k-v, 存放到request域
    12. map.put("address", "beijing...");
    13. return "vote_ok";
    14. }

    1.4 方式 3: 通过返回 ModelAndView 对象 实现 request 域数据

    1. /**
    2. * 演示通过返回ModelAndView对象,将数据放入到request域
    3. * @return
    4. */
    5. @RequestMapping(value = "/vote07")
    6. public ModelAndView test07(Master master) {
    7. System.out.println("----test07----");
    8. ModelAndView modelAndView = new ModelAndView();
    9. //放入属性到modelAndView对象
    10. modelAndView.addObject("address", "shanghai");
    11. //modelAndView.addObject("master", null);
    12. //可以把从数据库得到的数据->对象-》放入modelAndView[Service-dao-db]
    13. //这里指定跳转的视图名称
    14. modelAndView.setViewName("vote_ok");
    15. //返回结果
    16. return modelAndView;
    17. }

    5. 使用注意事项

    1) 从本质看,请求响应的方法 return "xx", 是返回了一个字符串,其实本质是返回了一个
    ModelAndView 对象,只是默认被封装起来的 .
    2) ModelAndView 即可以包含 model 数据,也可以包含视图信息
    3) ModelAndView 对象的 addObject 方法可以添加 key-val 数据,默认在 request 域中
    4) ModelAndView 对象 setView 方法可以指定视图名称

    2.模型数据处理-数据放入 session

    1 .需求分析/图解

    说明
    开发中 , 控制器 / 处理器中获取的数据如何放入 session 域,然后在前端 (VUE/JSP/...) 取出显
    应用实例需求

     

     2.环境搭配

    1. <br/><hr/>
    2. <h1>添加主人信息[测试session]h1>
    3. <form action="vote/vote08" method="post">
    4. 主人号:<input type="text" name="id"><br>
    5. 主人名:<input type="text" name="name"><br>
    6. 宠物号:<input type="text" name="pet.id"><br>
    7. 宠物名:<input type="text" name="pet.name"><br>
    8. <input type="submit" value="添加主人和宠物">
    9. form>
    1. <hr>
    2. 取出 session域的数据 <br>
    3. address: ${sessionScope.address}<br>
    4. 主人名字= ${sessionScope.master.name}
    5. 主人信息= ${sessionScope.master}
    6. body>

    3.代码实现

    1. /**
    2. * 演示如何将数据设置到session域中
    3. * @return
    4. */
    5. @RequestMapping(value = "/vote08")
    6. public String test08(Master master, HttpSession httpSession) {
    7. System.out.println("----test08----");
    8. //master对象是默认放在request域
    9. //我们将master对象放入到session域
    10. httpSession.setAttribute("master", master);
    11. httpSession.setAttribute("address", "guangzhou");
    12. return "vote_ok";//请求转发
    13. }

    3.@ModelAttribute 实现 prepare 方法(前置方法

    1 .应用实例

    基本说明
    开发中,有时需要使用某个前置方法 ( 比如 prepareXxx(), 方法名由程序员定 ) 给目标方法准备一个模型对象
    1. @ModelAttribute 注解可以实现 这样的需求
    2. 在某个方法上,增加了 @ModelAttribute 注解后
    3. 那么在调用该 Handler 的任何一个方法时,都会先调用这个方法

    2.代码解读

    1. /**
    2. * 解读
    3. * 1. 当Handler的方法被标识 @ModelAttribute,就视为一个前置方法
    4. * 2. 当调用该Handler的其它的方法时,都会先执行该前置方法
    5. * 3. 类似我们前面讲解Spring时,AOP的前置通知[底层是AOP机制]
    6. * 4. prepareModel前置方法,会切入到其它方法前执行..
    7. */
    8. @ModelAttribute
    9. public void prepareModel(){
    10. System.out.println("prepareModel()-----完成准备工作-----");
    11. }

    3.@ModelAttribute 最佳实践

    修改用户信息(就是经典的使用这种机制的应用),流程如下 :
    1. 在修改前,在前置方法中从数据库查出这个用户
    2. 在修改方法 ( 目标方法 ) 中,可以使用前置方法从数据库查询的用户
    3. 如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库
    的信息为准,比如,用户的某个属性不能修改,就保持原来的值
    就是一个应用实践(当我们需要修改某些数据的时候,不知道那些数据被修改了,那么我们就可以使用前置方法拿到这些数据,然后进行比较)

    四.视图和视图解析器

    1.基本介绍

    1. springMVC 中的目标方法最终返回都是一个视图 ( 有各种视图 )
    2. 返回的视图都会由一个视图解析器来处理 ( 视图解析器有很多种 )
    3.解析器有多个的时候,会根据解析器的优先级(order)去判断,第一个有问题就会去执行第二个,第二个有问题就会去执行第三个,知道找到一个成功的,如果全部失败就会报错
    注意:默认解析器如果没有找到视图就会直接报错,不会去找到下一个

    2.自定义视图

    2.1 为什么需要自定义视图

    1. 在默认情况下,我们都是返回默认的视图 , 然后这个返回的视图交由 SpringMVC InternalResourceViewResolver 视图处理器来处理的
    2. 在实际开发中,我们有时需要自定义视图 ,这样可以满足更多更复杂的需求

    2.2 自定义视图实例-代码实现

    配置自定义视图解析器

    1. <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
    2. <property name="order" value="99">property>
    3. bean>

    首先我们需要配置一个视图

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 海绵hong
    4. Version: 1.0
    5. Filename: view
    6. --%>
    7. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    8. <html>
    9. <head>
    10. <title>自定义视图测试title>
    11. head>
    12. <body>
    13. <h1>自定义视图测试h1>
    14. <a href="goods/buy">点击到自定义视图-a><br/>
    15. <a href="goods/order">测试在目标方法中指定请求转发或者重定向的页面-a><br/>
    16. body>
    17. html>

    由这个jsp跳转到handler

    1. package com.hong.web.viewresolver;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author 海绵hong
    6. * @version 1.0
    7. */
    8. @RequestMapping("/goods")
    9. @Controller
    10. public class GoodsHandler {
    11. @RequestMapping(value = "/buy")
    12. public String buy() {
    13. System.out.println("------buy()-----");
    14. return "hongView";//待会再填写自定义视图名
    15. }
    16. }

    因为这个handler的重定向,继续跳转到id=hspView的handler自定义视图中

    最后指向my_view.jsp

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 海绵hong
    4. Version: 1.0
    5. Filename: my_view
    6. --%>
    7. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    8. <html>
    9. <head>
    10. <title>my_view页面title>
    11. head>
    12. <h1>进入到my_view页面h1>
    13. <p>是从自定义视图来的..p>
    14. <body>
    15. body>
    16. html>

    3.自定义视图工作流程小结

    自定义视图 - 小结
    1. 自定义视图 : 创建一个 View bean, bean 需要继承自 AbstractView, 并实现
    renderMergedOutputModel 方法 .
    2. 并把自定义 View 加入到 IOC 容器中
    3. 自定义视图的视图处理器,使用 BeanNameViewResolver , 这个视图处理器也需要配置
    ioc 容器
    4. BeanNameViewResolver 的调用优先级需要设置一下,设置 order Integer.MAX_VAL 小的值. 以确保其在 InternalResourceViewResolver 之前被调用

    4.自定义视图-工作流程

    1. SpringMVC 调用目标方法 , 返回自定义 View IOC 容器中的 id
    2. SpringMVC 调用 BeanNameViewResolver 解析视图 : IOC 容器中获取 返回 id 值对应的 bean, 即自定义的 View 的对象
    3. SpringMVC 调用自定义视图的 renderMergedOutputModel 方法渲染视图
    4. 这里 说明 : 如果在 SpringMVC 调用目标方法 , 返回自定义 View IOC 容器中的 id,
    不存在, 则仍然按照默认的视图处理器机制处理 .

    4.目标方法直接指定转发或重定向

    4.1使用实例  

    目标方法中指定转发或者重定向
    1. 默认返回的方式是请求转发,然后用视图处理器进行处理,比如在目标方法中这样写 :
    2. 也可以在目标方法直接指定重定向或转发的 url 地址
    3. 如果指定重定向,不能定向到 /WEB-INF 目录中

    4.2代码演示

    1. /**
    2. * 演示直接指定要请求转发的或者是重定向的页面
    3. * @return
    4. */
    5. @RequestMapping(value = "/order")
    6. public String order() {
    7. System.out.println("=======order()=====");
    8. //请求转发到 /WEB-INF/pages/my_view.jsp
    9. //下面的 /WEB-INF/pages/my_view.jsp 被解析成 /springmvc/WEB-INF/pages/my_view.jsp
    10. //return "forward:/WEB-INF/pages/my_view.jsp";
    11. //return "forward:/aaa/bbb/ok.jsp";
    12. //直接指定要重定向的页面
    13. //1. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
    14. //2. redirect 关键字,表示进行重定向
    15. //3. /login.jsp 在服务器解析 /springmvc/login.jsp
    16. return "redirect:/login.jsp";
    17. // /WEB-INF/pages/my_view.jsp 被解析 /springmvc/WEB-INF/pages/my_view.jsp
    18. //return "redirect:/WEB-INF/pages/my_view.jsp";
    19. }
    直接指定要重定向的页面
    1. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
    2. redirect 关键字,表示进行重定向
    
  • 相关阅读:
    基于IDEA 配置Maven环境和JDK版本(全局)
    【Linux】线程池
    边缘计算与图像识别:实现高效实时处理的新途径
    QT中闹钟的设置
    2022年最新Python大数据之Python基础【九】面向对象与继承
    李迟2022年10月工作生活总结
    压力管道的分类
    Library projects cannot set applicationId. applicationId is set to
    如何开发一个扩展性高、维护性好的软件系统?(一个程序员最基本的修养)
    【Azure 应用服务】App Service 开启了私有终结点(Private Endpoint)模式后,如何来实现公网Git部署呢?
  • 原文地址:https://blog.csdn.net/weixin_54107527/article/details/127538518