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

2023-08-19 18:26:14

😀前言
本篇讲解了什么是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

    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="99"/>
    </bean>
建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. 下面就是进行请求转发到 /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";
    }
}
创建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>
创建/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>
完成测试(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";

        
    }
}

如果是这种

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

/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>
完成测试(页面测试)

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>
创建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>
创建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. 这里考察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;
    }
}
创建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. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下

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

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

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

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

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

java基础合集

数据库合集

redis合集

nginx合集

linux合集

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

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

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

更多推荐

java微服务 Dubbo面试题/SpringCloud面试题

java微服务面试题Q:为什么要用微服务?微服务有哪些优势?单体应用把所有功能都堆放在一起,改动影响大,风险高。微服务具有以下优势:针对特定服务发布,影响小,风险小,成本低。频繁发布版本,快速交付需求。低成本扩容,弹性伸缩,适应云环境。Q:怎么解决服务调用闭环(循环依赖)?服务分层,设定groupId。比如分为上层服务

【23种设计模式】组合模式(八)

前言组合模式,英文名称是:CompositePattern。当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达的意思,那就是“俄罗斯套娃”。“俄罗斯套娃”就是大的瓷器娃娃里面装着一个小的瓷器娃娃,小的瓷器娃娃里面再装着更小的瓷器娃娃,直到最后一个不能再装更小的瓷器娃娃的那个瓷器娃娃为止。在我们的操

黑马JVM总结(十)

(1)直接内存_基本使用下面我们看一下使用了ByteBuffer直接内存,大文件的读写效率是非常的高Java本身并不具备磁盘读写的能力,它需要调用操作系统的函数,需要从java的方法内部调用本地方法操作系统的方法,设计到了cpu的用户状态变为内核态,切换到内核态以后,由cpu的函数去读取磁盘文件的内容,会在操作系统中划

【计算机网络】——数据链路层(应用:局域网、广域网、设备 )

//仅做个人复习和技术交流,图片取自王道考研,侵删一、大纲1、介质访问控制信道划分介质访问控制随机访问介质访问控制2、局域网3、广域网4、数据链路层设备二、局域网1、局域网基本概念和体系结构局域网(LocalAreaNetwork):简称LAN,是指在某一区域内由多台计算机互联成的计算机组,使用广播信道。特点1:覆盖的

【python】我用python写了一个可以批量查询文章质量分的小项目(纯python、flask+html、打包成exe文件)

web效果预览:文章目录一、API分析1.1质量分查询1.2文章url获取二、代码实现2.1Python2.11分步实现2.12一步完成2.13完整代码2.2python+html2.21在本地运行2.22打打包成exe文件2.23部署到服务器一、API分析1.1质量分查询先去质量查询地址:https://www.cs

Python垃圾回收机制详解:引用计数与循环垃圾收集器

文章目录Python垃圾回收机制引用计数机制循环垃圾收集器小结详细讲解及实操1.程序中的垃圾问题2.垃圾的定义3.自动垃圾回收机制4.示例:使用del方法删除垃圾对象5.手动处理垃圾回收6.结束程序7.垃圾回收的自动处理8.结束程序python精品专栏推荐python基础知识(0基础入门)python爬虫知识Pytho

MySQL与ES数据同步的四种方案及实践演示

文章目录一、同步双写优点缺点双写失败风险项目演示二、异步双写(MQ方式)优点缺点项目演示三、基于Datax同步核心组件架构图支持的数据源及操作项目演示四、基于Binlog实时同步实现原理优点缺点项目演示一、同步双写也就是同步调用,这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。优点1.业务逻辑简单

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,这下搞的饭都吃不起了。还在有个朋友内推我去了一家互联网公司,兴冲冲见面试官,没想到一道题把我给问死了:如果模块请求http改为了h

每日练习-7

目录一、选择题二、算法题1、两种排序方法2、求最小公倍数一、选择题1、解析:指针和引用是C++中两种不同的变量类型,它们都可以用来访问或修改其他变量的值,但是它们有以下几个区别:引用必须在定义时初始化,而指针可以在任何时候初始化。例如,int&r=a;是合法的,但是int&r;是不合法的。而int*p;和int*p=&

02_elasticsearch 核心概念

02_elasticsearch核心概念1、lucene和elasticsearch的前世今生2、elasticsearch的核心概念1、lucene和elasticsearch的前世今生1、lucene和elasticsearch的前世今生lucene:最先进、功能最强大的搜索库。但是直接基于lucene开发,非常复

【Vue】模板语法,插值、指令、过滤器、计算属性及监听属性(内含面试题及毕设等实用案例)上篇

一、引言1、什么是模板语法?Vue的模板语法是一种用于在HTML中声明式地渲染Vue组件的语法。它基于HTML,并通过特定的模板语法扩展了HTML。Vue使用了一种称为“Mustache”语法的模板插值来绑定数据到HTML元素上。在Vue的模板语法中,你可以使用双大括号({{}})将数据绑定到HTML元素上,这样数据的

热文推荐