SpringMVC-视图和视图解析器

1.基本介绍

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

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

2.自定义视图

1.为什么要自定义视图

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

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

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

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

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>

2.创建自定义视图类

@Component(value = "view")
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("进入到自己的视图..");
   		Object o = model.get("name");
        //llp
        System.out.println(o);
        //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);
    }
}

3.创建goodsHandler测试

@Controller
@RequestMapping("goods")
public class GoodsHandler {
    @RequestMapping(value = "/buy")
    public String byGoods(Map<String,Object> map){
        map.put("name","llp");
        return "view";
    }
}

4.创建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>

5.测试效果

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

自定义视图-小结

自定义视图: 创建一个 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, 不存在, 则仍然按照默认的视图处理器机制处理
如果将默认视图解析器设置的优先级比自定义视图高,默认视图解析器不管页面是否存在都会直接返回,不会在走自定义视图解析器。

自定义 View在IOC容器中的 id存在时,自定义视图解析器执行流程:

自定义 View在IOC容器中的 id不存在时,自定义视图解析器执行流程

通用会先执行BeanNameViewResolver,可以看到此时,容器中不包含id=”view”的bean

回到DispatcherServlet我们可以看到 List viewResolvers列表包含两个视图解析器,一个时自定义的视图还有一个是默认的视图解析器。如果返回的自定义视图为空,会继续遍历最终初始化默认视图解析器从而按照默认视图解析器的处理机制继续执行,不管/WEB-INF/pages/view.jsp 是否存在程序都会返回

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

1.使用实例

目标方法中指定转发或者重定向

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

@Controller
public class LoginServlet {
    @RequestMapping(value = "/login")
    public String login(){
        System.out.println("login....");
        return "login_ok";
    }
}

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

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

应用实例-代码实现

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

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
    //请求转发到 /WEB-INF/pages/my_view.jsp
    //下面的 /WEB-INF/pages/my_view.jsp 被解析成 /springmvc/WEB-INF/pages/my_view.jsp
    //return "forward:/WEB-INF/pages/my_view.jsp";
    //return "forward:/aaa/bbb/ok.jsp";
    //直接指定要重定向的页面
    //1. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
    //2. redirect 关键字,表示进行重定向
    //3. /login.jsp 在服务器解析 /springmvc/login.jsp
    return "redirect:/login.jsp";
    // /WEB-INF/pages/my_view.jsp 被解析 /springmvc/WEB-INF/pages/my_view.jsp
    //return "redirect:/WEB-INF/pages/my_view.jsp";
}

2.修改view.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>自定义视图测试</title>
</head>
<body>
<h1>自定义视图测试</h1>
<a href="goods/buy" rel="external nofollow" >点击到自定义视图-</a><br/>
<a href="goods/order" rel="external nofollow" >测试在目标方法中指定请求转发或者重定向的页面-</a><br/>
</body>
</html>

2.指定请求转发流程-Debug源码

1.SpirngMVC默认情况下

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
      return  "my_view.jsp";
}

可以看到默认转发是走的InternalResourceView默认视图解析器,beanName=my_view.jsp 对应的实例则是InternalResourceView

最终执行到InternalResourceView的renderMergedOutputModel方法中dispatcherPath=/WEB-INF/pages/my_view.jsp.jsp进行请求转发

2.指定forward关键字

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
    return "forward:/WEB-INF/pages/my_view.jsp";
}

在DispatcherServlet中我们可以看到,当我们指定了forward关键字时,viewResolver还是默认的InternalResourceView,和不指定forward关键字不同的地方子在于,指定了关键字后beanName变成了forward: 而url则是我们后面指定的路径,因此我们在使用forward关键字进行请求转发时,SpringMVC底层会根据程序员在后面指定的路径进行请求转发,如果设置的路径不存在则会抛出404NOTFOUND异常

3.指定重定向流程-Debug源码

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
    return "redirect:/login.jsp";
}

在前面我们配置了自定义视图和默认视图解析器,可以看到这里走的是默认的视图解析器。redirect: 被作为beanName, RedirectView则是对应的bean实例

从里可以看出在SpringMvc中,重定向"redirect:/login.jsp" ,斜杠被浏览器解析成ip:port,而在服务端springmvc底层RedirectView会解析成“/springmvc/login.jsp”

RedirectView

@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
      HttpServletResponse response) throws IOException {
   String targetUrl = createTargetUrl(model, request);
   targetUrl = updateTargetUrl(targetUrl, model, request, response);
   // Save flash attributes
   RequestContextUtils.saveOutputFlashMap(targetUrl, request, response);
   // Redirect 重定向
   sendRedirect(request, response, targetUrl, this.http10Compatible);
}

到此这篇关于SpringMVC超详细讲解视图和视图解析器的文章就介绍到这了,更多相关SpringMVC视图内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringMVC超详细讲解视图和视图解析器的更多相关文章

  1. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  2. JSP中springmvc配置validator的注意事项

    这篇文章主要介绍了JSP中springmvc配置validator的注意事项的相关资料,并说明springmvc中spring-servlet.xml、applicationContext.xml的区别需要的朋友可以参考下

  3. SpringMVC拦截器和异常处理器使用示例超详细讲解

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器参数及拦截器链配置,感兴趣的可以尝试一下

  4. Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】

    这篇文章主要介绍了Laravel框架基础语法与知识点整理,包括模板变量、输出、include引入子视图等相关操作技巧,需要的朋友可以参考下

  5. SpringMVC数据页响应ModelAndView实现页面跳转

    本文主要介绍了SpringMVC数据页响应ModelAndView实现页面跳转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. SpringMVC静态资源配置过程详解

    在javaweb项目中配置了DispatcherServlet的情况下,如果不进行额外配置的话,几乎所有的请求都会走这个servlet来处理,默认静态资源按路径是访问不到的会报404错误,下面就来讲一讲如何配置才能访问到静态资源吧

  7. iOS实现列表与网格两种视图的相互切换

    相信大家应该也都发现了,在现在很多的电商app中,都会有列表视图和网格两种视图的相互切换。例如京东和淘宝。这样更利于提高用户的体验度,所以这篇文章小编就是大家分享下利用iOS实现列表与网格两种视图相互切换的方法,文中介绍的很详细,感兴趣的下面来一起看看吧。

  8. 详解SpringMVC中的四种跳转方式、视图解析器问题

    这篇文章主要介绍了SpringMVC的四种跳转方式、视图解析器,springmvc核心配置文件和视图解析器的使用,添加视图解析器,通过案例讲解四种跳转方式,需要的朋友可以参考下

  9. 详解SpringMVC的两种实现方式

    这篇文章主要介绍了SpringMVC的两种实现方式,方式一是通过实现Controller接口,方式二是使用注解开发,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下

  10. SpringMVC程序简单实例

    这篇文章主要介绍了SpringMVC程序简单实例的相关资料,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部