什么是springMVC 视图和视图解析器实例代码

 更新时间:2023年09月22日 10:44:00   作者:尘觉  
在 springMVC 中的目标方法最终返回都是一个视图,返回的视图都会由一个视图解析器来处理,这篇文章主要介绍了什么是springMVC 视图和视图解析器,需要的朋友可以参考下

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

🥰基本介绍

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

😉自定义视图

为什么需要自定义视图

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

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

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

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

解读

  • 配置自定义视图解析器BeanNameViewResolver
  • BeanNameViewResolver可以去解析我们自定义的视图
  • 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
  • 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="99"/>
    </bean>

建MyView.java -自定义视图类

解读

  • MyView继承了AbstractView, 就可以作为一个视图使用
  • @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);
    }
}

注意

  • 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp
  • /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 测试)

自定义视图-小结

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

自定义视图-工作流程

SpringMVC 调用目标方法, 返回自定义 View 在 IOC 容器中的 id

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

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

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

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

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

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

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

应用实例-代码实现

修改 GoodsHandler.java, 增加方法 order()

直接指定要请求转发的或者是重定向的页面

  • 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
  • redirect 关键字,表示进行重定向
  • /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 测试)

💖综合代码演示

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

  • 编写登录页面 login.jsp
  • LoginHandler [doLogin 方法], 如果用户输入用户名是 wyx, 密码 123 就可以登录成功.
  • 创建 JavaBean : User.java
  • 表单提交数据到 doLogin 方法, 以 User 对象形式接收.
  • 登录成功到, 页面 login_ok.jsp 并显示登录欢迎信息
  • 登录失败, 到页面 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>
  • 这里考察web工程路径的知识点 如果忘记了 可以去看我的博客 链接
  • <%=request.getContextPath()%>/homework/login.jsp

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

  • 浏览器会解析 为 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";
        }
    }
}

😄总结

  • 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
  • redirect 关键字,表示进行重定向
  • MyView继承了AbstractView, 就可以作为一个视图使用
  • 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
  • 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647

到此这篇关于什么是springMVC 视图和视图解析器的文章就介绍到这了,更多相关springMVC视图解析器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 使用线程监控文件目录变化的实现方法

    java 使用线程监控文件目录变化的实现方法

    这篇文章主要介绍了java 使用线程监控文件目录变化的实现方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Java日志相关技术_动力节点Java学院整理

    Java日志相关技术_动力节点Java学院整理

    这篇文章主要介绍了Java日志相关技术_动力节点Java学院整理的相关资料,需要的朋友可以参考下
    2017-07-07
  • SpringBoot如何取消内置Tomcat启动并改用外接Tomcat

    SpringBoot如何取消内置Tomcat启动并改用外接Tomcat

    这篇文章主要介绍了SpringBoot如何取消内置Tomcat启动并改用外接Tomcat,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • JAVA实现较完善的布隆过滤器的示例代码

    JAVA实现较完善的布隆过滤器的示例代码

    这篇文章主要介绍了JAVA实现较完善的布隆过滤器的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • SpringCloud中Eureka的配置及使用讲解

    SpringCloud中Eureka的配置及使用讲解

    Eureka 服务注册中心,主要用于提供服务注册功能,当微服务启动时,会将自己的服务注册到 Eureka Server,这篇文章主要介绍了SpringCloud中Eureka的配置及详细使用,需要的朋友可以参考下
    2023-01-01
  • 2020macOS Big Sur配置Java开发环境之jdk安装过程

    2020macOS Big Sur配置Java开发环境之jdk安装过程

    这篇文章主要介绍了2020macOS Big Sur配置Java开发环境之jdk安装,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 教新手使用java如何对一个大的文本文件内容进行去重

    教新手使用java如何对一个大的文本文件内容进行去重

    用HashSet对内容去重这个过程jvm会内存溢出,只能首先将这个大文件中的内容读取出来,对每行String的hashCode取模取正整数,可用取模结果作为文件名,将相同模数的行写入同一个文件,再单独对每个小文件进行去重,最后再合并
    2021-06-06
  • java并发编程之深入理解Synchronized的使用

    java并发编程之深入理解Synchronized的使用

    文详细讲述了线程、进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础。本文将接着讲一下Java线程同步中的一个重要的概念synchronized,希望能够给你有所帮助
    2021-06-06
  • 聊聊maven的pom.xml中的exclusions标签的作用

    聊聊maven的pom.xml中的exclusions标签的作用

    这篇文章主要介绍了maven的pom.xml中的exclusions标签的作用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • JavaSE-面向对象(方法重写)

    JavaSE-面向对象(方法重写)

    子类在调用父类的私有方法中不能直接调用,但是可以通过get方法进行调用,修改属性的值可以通过set方法进行修改。而子类想要修改父类中的方法可以使用方法重写进行操作。
    2021-08-08

最新评论