• 什么是springMVC 视图和视图解析器


    😀前言
    本篇讲解了什么是springMVC 视图和视图解析器

    🏠个人主页尘觉主页
    在这里插入图片描述

    🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

    在csdn获奖荣誉: 🏆csdn城市之星2名
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者

    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
    如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

    😀什么是springMVC 视图和视图解析器

    🥰基本介绍

    1. 在 springMVC 中的目标方法最终返回都是一个视图(有各种视图)

    2. 返回的视图都会由一个视图解析器来处理 (视图解析器有很多种)

    😉自定义视图

    为什么需要自定义视图

    1. 在默认情况下,我们都是返回默认的视图, 然后这个返回的视图交由 SpringMVC 的InternalResourceViewResolver 视图处理器来处理的

    img

    1. 在实际开发中,我们有时需要自定义视图,这样可以满足更多更复杂的需求

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

    配置 springDispatcherServlet-servlet.xml , 增加自定义视图解析器

    解读

    1. 配置自定义视图解析器BeanNameViewResolver

    2. BeanNameViewResolver可以去解析我们自定义的视图

    3. 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高

    4. 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647

        
            
        
    
    • 1
    • 2
    • 3
    建MyView.java -自定义视图类
    解读
    1. MyView继承了AbstractView, 就可以作为一个视图使用
    2. @Component(value = “myView”),该视图会注入到容器中, 名字/id是 myView
    @Component(value = "hspView")
    public class MyView extends AbstractView {
        @Override
        protected void renderMergedOutputModel(Map<String, Object> model,
                                               HttpServletRequest request,
                                               HttpServletResponse response) throws Exception {
    
            //完成视图渲染
            //并且可以确定我们要跳转的页面 [请求转发] /WEB-INF/pages/my_view.jsp
            System.out.println("进入到自己的视图..");
    
            //解读
            //1. 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp
            //2. /WEB-INF/pages/my_view.jsp 会被springmvc解析
            //   /springmvc/WEB-INF/pages/my_view.jsp
            request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp")
                    .forward(request, response);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    注意
    1. 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp

    2. /WEB-INF/pages/my_view.jsp 会被springmvc解析 /springmvc/WEB-INF/pages/my_view.jsp

    3.最后浏览器解析成http://localhost:8080 /springmvc/WEB-INF/pages/my_view.jsp

    创建GoodsHandler.java类
    @RequestMapping("/goods")
    @Controller
    public class GoodsHandler {
    
        @RequestMapping(value = "/buy")
        public String buy() {
            System.out.println("------buy()-----");
            return "myView";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    创建view.jsp类
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>自定义视图测试title>
    head>
    <body>
    <h1>自定义视图测试h1>
    <a href="goods/buy">点击到自定义视图-a><br/>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    创建/WEB-INF/pages/my_view.jsp类
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>my_view页面title>
    head>
    <h1>进入到my_view页面h1>
    <p>是从自定义视图来的..p>
    <body>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    完成测试(Postman 测试)

    img

    自定义视图-小结

    1. 自定义视图: 创建一个 View 的 bean, 该 bean 需要继承自 AbstractView, 并实现renderMergedOutputModel 方法。

    2. 并把自定义 View 加入到 IOC 容器中

    3. 自定义视图的视图处理器,使用 BeanNameViewResolver, 这个视图处理器也需要配置到 ioc 容器

    4. BeanNameViewResolver 的调用优先级需要设置一下,设置 order 比 Integer.MAX_VAL小的值. 以确保其在 InternalResourceViewResolver 之前被调用

    自定义视图-工作流程
    1. SpringMVC 调用目标方法, 返回自定义 View 在 IOC 容器中的 id

    2. SpringMVC 调用 BeanNameViewResolver 解析视图: 从 IOC 容器中获取 返回 id 值对应的 bean, 即自定义的 View 的对象

    3. SpringMVC 调用自定义视图的 renderMergedOutputModel 方法渲染视图

    4. 说明: 如果在 SpringMVC 调用目标方法, 返回自定义 View 在 IOC 容器中的 id,不存在, 则仍然按照默认的视图处理器机制处理

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

    1. 默认返回的方式是请求转发,然后用视图处理器进行处理,比如在目标方法中这样写:

    img

    1. 也可以在目标方法直接指定重定向或转发的 url 地址

    2. 如果指定重定向,不能定向到 /WEB-INF 目录中

    应用实例-代码实现

    修改 GoodsHandler.java, 增加方法 order()
    直接指定要请求转发的或者是重定向的页面
    1. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下

    2. redirect 关键字,表示进行重定向

    3. /login.jsp 在服务器解析 /springmvc/login.jsp

    @RequestMapping("/goods")
    @Controller
    public class GoodsHandler {   
    /**
         * 演示直接指定要请求转发的或者是重定向的页面
         * @return
         */
        @RequestMapping(value = "/order")
        public String order() {
            System.out.println("=======order()=====");
    
             // return "forward:/WEB-INF/pages/my_view.jsp";
            // return "forward:/aaa/bbb/ok.jsp";
            
            return "redirect:/login.jsp";
    
            
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    如果是这种

    return "redirect:/WEB-INF/pages/my_view.jsp";
    
    • 1

    /WEB-INF/pages/my_view.jsp 被解析成 /springmvc/WEB-INF/pages/my_view.jsp 然后会报404错误

    在这里插入图片描述

    修改view.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>自定义视图测试title>
    head>
    <body>
    <h1>自定义视图测试h1>
    <a href="goods/buy">点击到自定义视图-a><br/>
    <a href="goods/order">测试在目标方法中指定请求转发或者重定向的页面-a><br/>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    完成测试(页面测试)

    img

    img

    完成测试(Postman 测试)

    img

    💖综合代码演示

    完成一个简单的用户登录案例

    1. 编写登录页面 login.jsp

    2. LoginHandler [doLogin 方法], 如果用户输入用户名是 wyx, 密码 123 就可以登录成功.

    3. 创建 JavaBean : User.java

    4. 表单提交数据到 doLogin 方法, 以 User 对象形式接收.

    5. 登录成功到, 页面 login_ok.jsp 并显示登录欢迎信息

    6. 登录失败, 到页面 login_error.jsp

    代码实现

    创建login.jsp
    <form action="login">
        u:<input name="username" type="text"> <br/>
        p:<input name="password" type="password"><br/>
        <input type="submit" value="登录">
    form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    创建login_ok.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录成功title>
    head>
    <h1>登录成功h1>
    欢迎你: ${requestScope.user.username}
    <body>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    创建login_error.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录失败title>
    head>
    <body>
    <h1>登录失败h1>
    
    <a href="<%=request.getContextPath()%>/homework/login.jsp">返回重新登录a>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 这里考察web工程路径的知识点 如果忘记了 可以去看我的博客 链接

    2. <%=request.getContextPath()%>/homework/login.jsp

    服务器解析 /springmvc/homework/login.jsp

    1. 浏览器会解析 为 http://localhost:8080/springmvc/homework/login.jsp
    创建 User.java
    public class User {
        //属性..
        private String username;
        private String password;
    
        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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    创建LoginHandler.java
    @RequestMapping("/user")
    @Controller
    public class LoginHandler {
    
        //处理登录
        @RequestMapping(value = "/login")
        public String doLogin(User user) {
            //判断
            if("wyx".equals(user.getUsername())
                    && "123".equals(user.getPassword())){
                //验证OK
                return "forward:/WEB-INF/pages/homework/login_ok.jsp";
            } else {
                return "forward:/WEB-INF/pages/homework/login_error.jsp";
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    😄总结

    1. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下

    2. redirect 关键字,表示进行重定向

    3. MyView继承了AbstractView, 就可以作为一个视图使用

    4. 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高

    5. 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647

    😁热门专栏推荐
    想学习vue的可以看看这个

    java基础合集

    数据库合集

    redis合集

    nginx合集

    linux合集

    等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

    🤔欢迎大家加入我的社区 尘觉社区

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
    希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
    如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

  • 相关阅读:
    Win10怎么禁止自动安装软件
    java面试题,各大企业常见的java笔试题及答案(精华)
    Redis分布式锁
    【SCS-CN】SCS-CN模型中CN值的确定
    记一次 .NET 某物管后台服务 卡死分析
    BGFX多线程渲染
    还不轻松heic怎么转换?无需担心,使用这几款heic转换器轻松实现
    M0_IAP
    【MySQL】DML
    C++ list的模拟实现
  • 原文地址:https://blog.csdn.net/apple_67445472/article/details/132382735