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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 什么是springMVC 视图和视图解析器

😀前言

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

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


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

🥰基本介绍

  1. 在 springMVC 中的目标方法最终返回都是一个视图(有各种视图)
  2. 返回的视图都会由一个视图解析器来处理 (视图解析器有很多种)

😉自定义视图

为什么需要自定义视图

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

  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 测试)

自定义视图-小结

  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. 默认返回的方式是请求转发,然后用视图处理器进行处理,比如在目标方法中这样写:

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

完成测试(Postman 测试)

💖综合代码演示

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

  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


文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁

希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞


目录
相关文章
|
2月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
2月前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
49 0
|
15天前
|
搜索推荐 Java Spring
Spring Filter深度解析
【10月更文挑战第21天】Spring Filter 是 Spring 框架中非常重要的一部分,它为请求处理提供了灵活的控制和扩展机制。通过合理配置和使用 Filter,可以实现各种个性化的功能,提升应用的安全性、可靠性和性能。还可以结合具体的代码示例和实际应用案例,进一步深入探讨 Spring Filter 的具体应用和优化技巧,使对它的理解更加全面和深入。
|
28天前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
28天前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
1月前
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
120 9
|
2月前
|
XML 监控 Java
Spring Cloud全解析:熔断之Hystrix简介
Hystrix 是由 Netflix 开源的延迟和容错库,用于提高分布式系统的弹性。它通过断路器模式、资源隔离、服务降级及限流等机制防止服务雪崩。Hystrix 基于命令模式,通过 `HystrixCommand` 封装对外部依赖的调用逻辑。断路器能在依赖服务故障时快速返回备选响应,避免长时间等待。此外,Hystrix 还提供了监控功能,能够实时监控运行指标和配置变化。依赖管理方面,可通过 `@EnableHystrix` 启用 Hystrix 支持,并配置全局或局部的降级策略。结合 Feign 可实现客户端的服务降级。
153 23
|
23天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
59 0
|
2月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
36 1

推荐镜像

更多
下一篇
无影云桌面