spring 视图,springboot视图解析器的作用

  spring 视图,springboot视图解析器的作用

  

目录

SpringMVC -视图和视图解析器1。基本介绍2。自定义视图1。为什么选择自定义视图2。自定义视图实例-代码实现3。自定义视图工作流摘要自定义视图-摘要自定义视图-工作流4。目标方法直接指定转发或重定向1。使用示例2。指定请求转发流程-调试源代码3。指定重定向过程-调试源代码

 

  

SpringMVC-视图和视图解析器

 

  springMVC中

1.基本介绍

的目标方法都是一个视图(有各种视图)。

 

  返回的视图将由视图解析器处理(视图解析器有很多种)。

  

2.自定义视图

 

  00-1010默认情况下,我们都返回默认视图,然后返回的视图由SpringMVC的InternalResourceViewResolver的视图处理器处理。

  bean id= internalResourceViewResolver class= org . spring framework . web . servlet . view . internalResourceViewResolver property name= prefix value=/We-INF/pages//property name= suffix value=。jsp//bean在实际开发中,我们有时需要自定义视图,可以满足越来越复杂的需求。

  00-1010 1.配置springdi batcher servlet-servlet . XML并添加自定义视图解析器。

  !-1.配置自定义视图解析程序BeannameViewResolver 2。BeannameViewResolver可以解析我们的自定义视图3。配置属性顺序,它指示视图解析程序的执行顺序。值越小,优先级越高。4.属性顺序的默认值是最低优先级。为值integer . max _ value int lowest _ precedent=2147483647-bean class= org . spring framework . web . servlet . view . beannameviewrolver 属性名= order 值= 99//bean2创建自定义视图类。

  @Component(value=view )公共类MyView扩展abstract view { @ Override protected void renderMergedOutputModel(MapString,Object model,HTTP Servlet Request Request,HTTP Servlet Response Response)抛出异常{//完成视图渲染//并能确定我们要跳转到的页面[请求转发]/we b-INF/pages/my _ view . jspsystem . out . println(转到自己的视图.);object o=model . get( name );//LLP system . out . println(o);//1.下面是将请求转发到/we b-INF/pages/my _ view.jsp//2./web-INF/pages/my _ view.jsp将由Spring MVC//Spring MVC/we b-INF/pages/my _ view . JSP request . getrequest dispatcher(/we b-INF/pages/my _ view . JSP )解析。转发(请求、响应);}}3.创建goodsHandler测试

  @ Controller @ request mapping( goods )公共类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 容器中的 idSpringMVC 调用 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.使用实例

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

 

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

  

@Controllerpublic 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

  

@Overrideprotected 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视图内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: