精华内容
下载资源
问答
  • 本篇文章主要介绍了浅谈SpringMVC之视图解析器(ViewResolver),具有一定的参考价值,有兴趣的可以了解一下
  • 主要介绍了Springboot视图解析器ViewResolver使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Spring配置Freemarker视图解析器,配置多个视图解析器
  • 理解视图和视图解析器的解析流程、使用常用的InternalResourceView和JstlView、实现自定义视图、实现重定向操作
  • Spring MVC--5.视图和视图解析器
  • 视图解析器

    千次阅读 2018-08-20 10:13:23
    ·SpringMVC 使用ViewResource 进行视图解析,在浏览器中渲染模型  ·ViewResolver 能够解析JSP、Velocity 模版和XSLT 等多种视图 ·处理视图最重要的两个接口:  ·ViewResolver接口在视图...常见的视图解析器...

       ·SpringMVC 使用ViewResource 进行视图解析,在浏览器中渲染模型

       ·ViewResolver 能够解析JSP、Velocity 模版和XSLT 等多种视图

    ·处理视图最重要的两个接口:

             ·ViewResolver接口在视图名称和真正的视图之间提供映射

             ·View接口则处理请求将真正的视图呈现给用户

     

    常见的视图解析器

        ·InternalResourceViewResolver  : 国际化视图解析器  (常用)

        ·XmlViewResolver  : XML视图解析器   (可以缓存)

        ·FreeMarkerViewResolver :   模版视图解析器   (重点)

        ·redirect、forward : 重定向视图

     

    》国际化视图解析器  InternalResourceViewResolver

     ·使用的最广泛的一个视图解析器

     ·返回的视图名称都解析为InternalResourceView 对象,将模型属性都存放到request属性中

     ·利用requestDispatcher 在服务器端进行请求的转发

    	<!-- 国际化视图解析器配置(最普遍通用视图解析器) -->
    	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<!-- 		前缀 -->
    		<property name="prefix" value="/WEB-INF/jsps/"></property>
    		<!-- 		后缀 -->
    		<property name="suffix" value=".jsp"></property>
    	</bean>
    //	InternalResourceViewResolver 国际化视图解析
    	@RequestMapping("/toIrvr.do")
    	public ModelAndView toIrvr(){
    		ModelAndView mav = new ModelAndView();
    //		组装页面显示的数据
    		mav.addObject("msg","internalResourceViewResolver,国际化视图解析器");
    //		逻辑视图名
    		mav.setViewName("irvr");
    		return mav;
    	}

     

    》 XML视图解析器  XmlViewResolver

     ·继承自AbstractCachingViewResolver抽象类,支持视图缓存

     ·XmlViewResolver需要给定一个xml配置文件,用来定义视图的bean对象

    <?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    		       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 
    	
    	<!-- 试图对象,bean的名字必须是控制器中返回的逻辑视图名 -->
    	<bean name="xmlPage" class="org.springframework.web.servlet.view.JstlView">
    		<property name="url" value="/WEB-INF/jsps/xPage.jsp"></property>
    	</bean>
    	
    </beans>

     ·XmlViewResolver将根据Controller 处理器方法返回的逻辑视图名称到配置文件中寻找相应的视图bean用于处理视图

     ·默认使用/WEB-INF/Views.xml文件,也可以在XmlViewResolver的location属性中指定位置

    	<!-- xml视图解析器,支持试图缓存,需要指定配置文件 -->
     	<bean id="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"> 
    	    <!-- 指定配置文件所在位置 -->
     	    <property name="location" value="classpath:resource/my-views.xml"></property> 
     	</bean> 
    //	xmlViewResolver xml视图解析 支持试图缓存;需要提供一个xml配置文件,用来指定视图bean
    	@RequestMapping("/toXml.do")
    	public ModelAndView toXml(){
    		ModelAndView mav = new ModelAndView();
    //		组装页面显示的数据
    		mav.addObject("msg","xmlViewResolver,xml视图解析器");
    //		逻辑视图名
    		mav.setViewName("xmlPage");
    		return mav;
    	}

     

    》模版视图解析器    FreeMarkerViewResolver

      ·FreeMarkerViewResolver 会把返回的逻辑视图解析为FreeMarkerView

      ·需要引包: freemarker-2.3.15.jar

      ·扩展:

             ·FreeMarker 是一个Java语言编写的模版引擎,它基于模版来生成文本输出。

             ·freeMarker的优点:

    1. 分离表现层和业务逻辑
    2. 提高效率
    3. 页面静态化 (例如:商品详情页)
    	<!-- freemarker视图解析器 -->
     	<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    		<!-- 前缀 -->
     		<property name="prefix" value="fn_"></property> 
    		<!-- 后缀 -->
     		<property name="suffix" value=".ftl"></property> 
    		<!-- 优先级 -->
     		<property name="order" value="1"></property> 
     	</bean> 
    	
    	<!-- freeMarker配置 -->
    	<bean id="fmConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    		<!-- 指定模版路径 -->
    		<property name="templateLoaderPath" value="/WEB-INF/freemarker/templates/"></property>
    		<!-- 指定默认编码格式 -->
    		<property name="defaultEncoding" value="UTF-8"></property>
    	</bean>

     模版:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    		<title>${title}</title>
    	</head>
    	<body>
    		这是freemarker模版;<br/>
    		这是数据:${fmData}
    	</body>
    </html>

     控制器代码:

    //	freeMarkerViewResolver freeMarker模版视图解析器,提供模版文件,配置freemarkerViewResolver;提供freemarker的配置属性
    	@RequestMapping("/toFm.do")
    	public ModelAndView toFm(HttpServletResponse response){
    //		设置页面的编码格式
    		response.setContentType("text/html; charset=UTF-8");
    		ModelAndView mav = new ModelAndView();
    //		组装页面显示的数据
    		mav.addObject("fmData","freeMarkerViewResolver,freeMarker视图解析器");
    		mav.addObject("title", "freeMarker视图解析器");
    //		逻辑视图名
    		mav.setViewName("welcome");
    		return mav;
    	}

     

    》 重定向视图

          ·redirect前缀

                ·返回视图名时,使用”redirect:” 前缀,UrlBaseViewResolver视图控制器会识别这是一次特殊的重定向,并把redirect后面的视图当做重定向的地址

          ·forward前缀

                 ·forword前缀视图是另一种通过UrlBaseViewResolver 机制处理到的转向机制

          ·redirect 和forward的区别

                  Redirect是两次请求,不在同一个request域范围

                  Forward是一次请求,是同一个request域

    1、同样的需要配置视图解析器

    	<!-- 国际化视图解析器配置(最普遍通用视图解析器) -->
    	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<!-- 		前缀 -->
    		<property name="prefix" value="/WEB-INF/jsps/"></property>
    		<!-- 		后缀 -->
    		<property name="suffix" value=".jsp"></property>
    	</bean>

     2、控制器代码 注意看两者的区别

    //	专门用来组装数据,不返回逻辑视图名
    	@RequestMapping("/tomakeData.do")
    	public String makeData(Model model,HttpServletRequest request){
    //		组装数据
    		model.addAttribute("modelData","这是model存放的数据");
    		request.setAttribute("reqData", "这是request存放的数据");
    		request.getSession().setAttribute("sData", "这是session存放的数据");
    //		forward或者redirect关键字进行请求转发或重定向时,关键字冒号后面跟的是目标方法的请求路径
    		System.out.println("makeData的request对象"+request.toString());
    //		return "forward:toShowInfo";
    		return "redirect:toShowInfo";
    	}
    	
    	
    //	专门用来返回逻辑视图名
    	@RequestMapping("/toShowInfo")
    	public String ShowInfo(Model model,HttpServletRequest request,String modelData){
    		System.out.println("showInfo的request对象"+request.toString());
    		model.addAttribute("modelData",modelData);
    		return "showInfo";
    	}

     

    展开全文
  • SpringBoot官网推荐使用HTML视图解析器,但是根据个人的具体业务也有可能使用到JSP视图解析器,所以本文介绍了两种视图解析器,感兴趣的可以了解下
  • SpringMVC-视图和视图解析器

    千次阅读 2019-05-06 22:56:46
    视图(View)和视图解析器(ViewResolver)的工作流程: 当请求处理方法处理完请求之后,会返回String、ModelAndView、或View对象,如return “success”,但这三种返回值最终都会被SpringMVC统一转化为ModelAndView对象...

    视图(View)和视图解析器(ViewResolver)的工作流程:
    当请求处理方法处理完请求之后,会返回String、ModelAndView、或View对象,如return “success”,但这三种返回值最终都会被SpringMVC统一转化为ModelAndView对象,随后Spring就会用ViewResolver,把返回的ModelAndView对象中的View渲染给用户看。

    1.视图View

    视图View的作用是渲染数据,将数据以JSP、PDF、EXCEL等形式呈现给用户。SpringMVC通过View接口来支持视图,该接口提供了各种各样的视图,并且可以让用户自定义视图。
    在客户端的每一次请求时,视图解析器ViewResolver都会产生一个新的视图View对象。

    视图View接口的实现类及部分简介如下

    视图类型简介
    URL视图资源图InternalResourceView将JSP或其他资源封装成一个视图。被视图解析器InternalResourceViewResolver默认使用。
    JstlViewInternalResourceView的子类。如果JSP中使用了JSTL的国际化标签,就需要使用该视图类。
    文档视图AbstractExcelViewExcel文档视图的抽象类。
    AbstractPdfViewPDF文档视图的抽象类
    报表视图ConfigurableJasperReportsView常用的JasperReports报表视图
    JasperReportsHtmlView
    JasperReportsPdfView
    JasperReportsXlsView
    JSON视图MappingJackson2JsonView将数据通过Jackson框架的ObjectMapper对象,以JSON方式输出

    2.视图解析器ViewResolver

    SpringMVC提供了一个视图解析器的上级接口ViewResolver,所有具体的视图解析器必须实现该接口。

    常用的视图解析器实现类及简介如下

    视图解析器类型简介
    解析为beanBeanNameViewResolver将视图解析后,映射成一个bean,视图的名字就是bean的id。
    解析为映射文件InternalResourceViewResolver将视图解析后,映射成一个资源文件。例如将一个视图名为字符串“success.jsp”的视图解析后,映射成一个名为success的JSP文件。
    JasperReportsViewResolver将视图解析后,映射成一个报表文件。
    解析为模板文件FreeMarkerViewResolver将视图解析后,映射成一个FreeMarker模板文件。
    VelocityViewResolver将视图解析后,映射成一个Velocity模板文件。
    VelocityLayoutViewResolver

    InternalResourceViewResolver是JSP最常用的视图解析器,可以通过prefix给响应字符串加上前缀,通过suffix加上后缀。例如我们之前曾在springMVC的配置文件中配置了一个视图解析器InternalResourceViewResolver,如下:

    springmvc.xml

    <beans …>
     …
     <!-- 配置视图解析器:把handler处理类的返回值,加工成最终的视图路径-->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/views/"></property>
      <property name="suffix" value=".jsp"></property>
     </bean>
    </beans>
    

    此外,视图解析器还可以通过解析JstlView进而实现国际化、通过解析<mvc:view-controller>进而指定请求的跳转路径、通过“redirect:”和“forward:”指定跳转方式等等。

    ①通过解析JstlView实现国际化

    JstlViewInternalResourceView的子类。如果在JSP中使用了JSTL,那么InternalResourceViewResolver就会自动将默认使用的InternalResourceView视图类型转变为JstlVIew类型。

    以下,在SpringMVC中使用JSTL的fmt标签来实现国际化:

    所谓“国际化”,就是指同一个程序,对于不同地区/国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。例如,同一个用JSP开发的欢迎页面,中国地区访问时显示“欢迎您”,而美国地区访问时则显示“Welcome”。以下是实现国际化的具体步骤:

    第一步:对于不同地区/国家,创建不同的资源文件
    将程序中的提示信息、错误信息等放在资源文件中,为不同地区/国家编写资源文件。这些资源文件使用共同的基名,通过在基名后面添加语言代码、国家或地区代码来区分不同地域的访问者。如下是一些常见的资源文件命名方式及简介:

    资源文件名简介
    基名_en.properties所有英文语言的资源
    基名_en_US.properties针对美国地区、英文语言的资源
    基名_zh.properties所有的中文语言的资源
    基名_zh_CN.properties针对中国大陆的、中文语言的资源
    基名_zh_HK.properties针对中国香港的、中文语言的资源
    基名.properties默认资源文件。如果请求相应语言的资源文件不存在,将使用此资源文件。例如,若是中国大陆地区用户,应该访问“基名_zh_CN.properties”,而如果不存在此文件,就会去访问默认的“基名.properties”。

    例如,如果访问此项目的用户来自美国和中国两个国家,就需要创建美国和中国两个地区的资源文件:在项目的src目录中,新建美国地区的资源文件i18n_en_US.properties,和中国内地的资源文件i18n_ zh_CN.properties,如下:

    美国地区的资源文件:i18n_en_US.properties

    resource.welcome=WELCOME
    resource.exit=EXIT
    

    中国内地的资源文件:i18n_ zh_CN.properties

    resource.welcome=\u6B22\u8FCE\u60A8
    resource.exit=\u9000\u51FA
    

    说明:

    在中文使用的i18n_ zh_CN.properties中,用户输入的原文是:

    resource.welcome=欢迎您
    resource.exit=退出

    但Eclipse会自动将“欢迎您”等汉字自动转为相应的ASCII,供属性文件使用。 如果读者使用的Eclipse版本不能自动的将汉字转为ASCII,也可以使用JDK安装目录中bin中的native2ascii.exe工具进行转换。

    不同资源文件的基名必须保持一致(如i18n),并且资源文件的内容是由很多key-value对组成,key必须一致(如resource.welcome),value随语言/国家地区不同而不同(如美国是“WELCOME”,中国是“欢迎您”)。

    本例使用的基名i18n是internationalization(国际化)的缩写。internationalization的首尾字母i和n中间有18个字母,所以简称i18n。

    第二步:在SpringMVC的配置文件中,加载国际化资源文件
    springmvc.xml

    <beans …>
     …
     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
      <property name="basename" value="i18n" />
     </bean>
    </beans>
    

    Spring容器在初始化时,会自动加载id为“messageSource”,且类型为org.springframework.context.MessageSource的Bean,并加载该Bean中通过basename属性指定基名的国际化资源文件。

    第三步:使用JSTL标签实现国际化显示
    先导入JSTL依赖的2个JAR:jstl.jarstandard.jar,再在显示页success.jsp中导入JSTL用于支持国际化的库,并使用<fmt:message …>实现国际化显示,如下:

    显示页success.jsp

    <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    …
    <body>
     …
     <fmt:message key="resource.welcome"></fmt:message>
     <br><br>
     <fmt:message key="resource.exit"></fmt:message>
     <br><br>
    </body>
    

    fmt标签的key值会根据浏览器的语言环境去匹配资源文件中的key,若匹配则会显示相应资源文件中key对应的value值。例如,中国内陆地区下载的谷歌浏览器默认的语言是中文,所以会在i18n_zh_CN.properties中寻找key为“resource.welcome”、“resource.exist”的value值,并显示到页面上,如下:

    发送请求页index.jsp

    <a href="FirstSpringDemo/testI18n">testI18n</a><br/>
    

    请求处理类:FirstSpringDemo.java

    @Controller
    @RequestMapping(value = "/FirstSpringDemo")
    public class FirstSpringDemo{
     @RequestMapping("/testI18n")
     public String testI18n(){
      return "success";
     }
    }
    

    显示页面:success.jsp

    <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    …
    <body>
        …
     <fmt:message key="resource.welcome"></fmt:message>
     <br>
     <fmt:message key="resource.exist"></fmt:message>
    </body>
    

    执行index.jsp中的超链接,运行结果:
    在这里插入图片描述
    将浏览器的语言设置为英文,
    在这里插入图片描述
    以上就实现了国际化的显示操作,JSP页面会根据浏览器的语言环境自动寻找相应的资源文件,并依据key值进行显示。
    注意:就本例来说,国际化显示标签必须在success.jsp中才会起作用,而如果将放在index.jsp中则无法实现国际化。
    这是因为在springmvc.xml中配置的MessageSource(具体是ResourceBundleMessageSource实现类)是用来处理响应的,也就是说只有在请求处理方法返回String、View或ModelAndView对象以后执行响应时,才会通过MessageSource来执行国际化操作。而如果直接在index.jsp中执行<fmt:message …>,因为此时还没有“处理响应”这一过程,所以就不会涉及到MessageSource,也就不会根据basename属性来指定的资源文件基名,因此本例的index.jsp中不能直接实现国际化显示。

    <mvc:view-controller>

    我们之前使用SpringMVC的流程大致都是:
    ①请求页index.jsp—>②使用@RequestMapping标识的请求处理类FirstSpringDemo.java中的方法–>③结果显示页success.jsp。

    除此以外,我们还可以省略②,让流程简化为①—>③,即省略请求处理方法。简化的方法是在springmvc.xml中配置<mvc:view-controller…/>,如下:

    springmvc.xml

    <beans …>
     <mvc:view-controller path="/testViewController" view-name="success"/>
    </beans>
    

    其中path用来匹配请求路径(类似于@RequestMapping的value值),view-name用来指定响应跳转的页面(类似于请求处理方法中的return “success”)。以上配置,就表示凡是请求路径为“testViewController”的,就会被直接跳转到“success”页面(“success”会加上InternalResourceViewResolver中设置的前缀和后缀)。如下:

    index.jsp

    <a href="testViewController">testViewController</a><br/>
    

    点击此超链接后,就会直接跳转到view-name指定的success页面(/views/success.jsp),即略过了@RequestMapping标识的请求处理方法。

    但是,此时如果我们再点击index.jsp中之前编写的其他超链接,就都会报“HTTP Status 404”异常。解决办法就是再在springmvc.xml中加入<mvc:annotation-driven></mvc:annotation-driven>,如下:

    springmvc.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
     	<mvc:view-controller path="/testViewController" view-name="success"/>
        <mvc:annotation-driven></mvc:annotation-driven>
    </beans>
    

    一般情况,在使用<mvc:view-controller…/>的同时,也需要加入<mvc:annotation-driven…/>标签。

    ③页面跳转方式

    当请求处理方法的返回值是字符串时,视图解析器InternalResourceViewResolver会给返回值加上前缀、后缀,然后默认以请求转发的方式进行页面跳转。此外,我们还可以通过给返回值加上“forward:”或“redirect:”来指定跳转方式为请求转发或重定向。

    第一种:通过“forward:”指定跳转方式为请求转发

    @RequestMapping("/testForward")
     public String testForward(){
      return "forward:/views/success.jsp";
     }
    

    第二种:通过“redirect:”指定跳转方式为重定向

    @RequestMapping("/testRedirect")
     public String testRedirect(){
      return "redirect:/views/success.jsp";
     }
    

    需要注意,加上“forward:”或“redirect:”后,视图解析器将不会再给返回值加上前缀、后缀,需要我们自己写上完整的响应地址。

    3.处理静态资源

    如果我们在项目的WebContent目录下新建imgs目录,并存放一张图片logo.png,后启动tomcat服务来访问此图片http://localhost:8888/SpringMVCDemo/imgs/logo.png,就会看到浏览器显示“HTTP Status 404”异常。
    这是因为我们之前在web.xml中配置了DispatcherServlet,如下:

    web.xml

    <servlet>
     <servlet-name>springDispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:springmvc.xml</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
     <servlet-name>springDispatcherServlet</servlet-name>
     <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    DispatcherServlet的url-pattern是“/”,表示会拦截所有请求。因此,当访问图片、js文件、视频等静态资源时,也会被DispatcherServlet所拦截并去尝试匹配相应的@RequestMapping方法,但静态资源一般不会有相应的@RequestMapping,因此会报404异常。为了解决此异常,以便能够访问静态资源,可以在springmvc.xml中加上<mvc:default-servlet-handler/><mvc:annotation-driven></mvc:annotation-driven>,如下:

    springmvc.xml

     <mvc:default-servlet-handler/>
     <mvc:annotation-driven></mvc:annotation-driven>
    

    之后,就可以成功访问到项目中的静态资源。

    <mvc:default-servlet-handler/>标签的作用是:此标签会在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler,它会对所有DispatcherServlet处理的请求进行筛查,如果发现某个请求没有相应的@RequestMapping进行处理(如请求的是图片等静态资源),就会将该请求交给WEB服务器(如Tomcat)默认的Servlet处理,而默认Servlet就会直接去访问该静态资源。

    说明:

    Tomcat默认的Servlet是在“tomcat安装目录\conf\web.xml”中定义的,如下

     <servlet>
            <servlet-name>default</servlet-name>
            <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
            …
        </servlet>
    

    配置了<mvc:default-servlet-handler/>之后,就可以解决访问静态资源时产生的异常。而加入<mvc:annotation-driven></mvc:annotation-driven>的目的是为了在访问静态资源的同时,也能正常的访问其他非静态资源。如果只加<mvc:default-servlet-handler/>而不加<mvc:annotation-driven></mvc:annotation-driven>,就会造成只能访问静态资源,而无法访问非静态资源。

    展开全文
  • 本篇文章讲述了SpringMVC的视图是怎么进行解析的,讲解了视图、视图解析器以及常用的视图解析器实现类。

    今天来说说SpringMVC视图是怎么解析的。

    1、SpringMVC如何解析视图概述

    1.1、无论控制器返回一个String,ModelAndView,View都会转换为ModelAndView对象,由视图解析器解析视图,然后进行页面的跳转。

    如图所示:
    在这里插入图片描述

    1.2、其中重要的两个接口(视图View、视图解析器ViewResolver):

    在这里插入图片描述
    在这里插入图片描述

    1.3、断点调试源码

    在这里插入图片描述

    1.4、流程图

    在这里插入图片描述

    2、视图和视图解析器

    1)请求处理方法执行完成后,最终返回一个ModelAndView对象。对于那些返回String,View或ModelMap等类型的处理方法,SpringMVC也会在内部将他们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。

    2)SpringMVC借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以使JSP,也可以是Excel、JFreeChart等各种表现形式的视图。

    3)对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚集在生产模型数据的工作上,从而实现MVC的充分解耦。

    3、视图

    1)视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
    2)为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义了一个高度抽象的View接口:
    在这里插入图片描述

    3)视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。

    4、常用的视图实现类

    在这里插入图片描述

    5、JstlView

    1)若项目中使用了JSTL,则SpringMVC会自动把视图由InternalResourceView转为JstlView(断点调试,将JSTL的jar包增加到项目中,视图解析器会自动修改为JstlView)。

    2)若使用JSTL的fmt标签则需要在SpringMVC的配置文件中配置国际化资源文件

    3)若希望直接响应通过S平ringMVC渲染的页面,可以使用mvc:view-controller标签实现

    6、视图解析器

    1)SpringMVC为逻辑视图名的解析提供了而不同的策略,可以在SpringMVC上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。

    2)视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。

    3)所有的视图解析器都必须实现ViewResolver接口。

    7、常用的视图解析器实现类

    在这里插入图片描述
    1)程序员可以选择一种视图解析器或混用多种视图解析器。

    2)每个视图解析器都实现了Ordered接口并开放出一个order属性,可以通过order属性指定解析器的优先顺序,order越小优先级越高。

    3)SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出ServletException异常。

    4)InternalResourceViewResolver
    JSP是最常见的视图技术,可以使用InternalResourceViewResolve作为视图解析器:
    在这里插入图片描述

    8、mvc:view-controller标签

    1)若希望直接响应通过SpringMVC渲染的页面,可以使用mvc:view-controller标签实现

    <!-- 直接配置响应的页面:无需经过控制器来执行结果 -->
    <mvc:view-controller path="/success" view-name="success"/>
    

    2)请求的路径:

    http://localhost:8080/SpringMVC/success
    

    3)配置<mvc:view-controller>会导致其他请求路径失效
    解决办法:

    <!-- 在实际开发过程中都需要配置mvc:annotation-driven标签 -->
    <mvc:annotation-driven/>
    

    9、重定向

    1)关于重定向
    ① 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理。
    ② 如果返回的字符串中待forward:redirect:前缀时,SpringMVC会对他们进行特殊处理:将forward:redirect:当成指示符,其中的字符串作为URL来处理。
    redirect:success.jsp会完成一个到success.jsp的重定向的操作。
    forward:success.jsp会完成一个到success.jsp的转发操作。

    2)定义页面链接

    <a href="springmvc/testRedirect">testRedirect</a>
    

    3)定义控制器方法

    @RequestMapper("/testRedirect")
    public String testRedirect(){
    	System.out.println("testRedirect");
    	return "redirect:/index.jsp";
    	//return "forward:/index.jsp";
    }
    

    4)源码分析

    ① 首先进入到DispatcherServlet类中通过视图名来解析视图。

    在这里插入图片描述
    ② 进入resolveViewName进行解析视图。

    在这里插入图片描述
    ③ 进入到resolveViewName来进行判断是否有key,如果没有就创建一个视图,如果存在就通过key来获取这个视图。
    在这里插入图片描述
    ④ 进入createView方法进行判断开始的关键字是否为重定向或者转发。

    在这里插入图片描述
    ⑤ 确定方式后视图开始渲染。

    在这里插入图片描述
    return “forward:/index.jsp”;
    在这里插入图片描述

    展开全文
  • 目录,更新ing,学习Java的点滴记录   目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录 SpringMvc知识 第一篇---->SpringMvc初识|MVC|三层架构 ...拦截开发 处理模型数据 1 介绍 视

    目录,更新ing,学习Java的点滴记录

      目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

    SpringMvc知识

    第一篇---->SpringMvc初识|MVC|三层架构
    第二篇---->IoC容器上下文和映射请求上下文
    第三篇---->熟悉基本开发流程
    第四篇---->接收各类请求参数的方式
    第五篇---->获取请求中的Request,Session,Cookie等对象属性
    第六篇---->拦截器开发
    第七篇---->视图和视图解析器
    第八篇---->数据校验
    第九篇---->文件上传方式
    第十篇---->数据转换和数据格式化

    视图和视图解析器

    1 模型数据

    1.1 介绍

    • 视图是业务处理后展现给用户的内容,一般情况下,都会在业务处理方法中返回一些数据,这些数据将回显到页面中,供用户查看。在之前谈SpringMvc开发流程的时候,说到控制器获取数据后,会将数据装配到模型数据和视图中,然后将视图名称转发到视图解析器中,通过解析器后得到最终视图,最后将数据模型渲染到视图中,展示最终结果给用户。
    • SpringMvc提供了以下几种途径输出模型数据
        1)ModelAndView:处理方法返回值类型为ModelAndView时,方法中可以通过该对象添加模型数据
        2)Map或者Model:在处理方法中可以创建对应的Model或者Map对象,用来保存对应的数据,最后将Map或者Model返回即可
        3)@SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
        4)@ModelAttribute:方法形参标注该注解后,行藏的对象就会放到数据模型中。

    1.2 ModelAndView

    • 控制器处理方法的返回值如果是ModelAndView,则其既包含视图信息也包含模型数据信息
    • 添加模型数据的方式
        1)ModelAndView addObject(String attributeName, Object attributeValue):设置属性名和属性值
        2)ModelAndView addAllObjects(Map<String, ?> modelMap):如果有多个属性需要传递,可以先保存在一个Map集合中,然后直接传递一个Map集合,达到实现传递多个属性的效果
    • 设置视图的方式
        1)void setViewName(String viewName):传递一个视图名称,DisPatcherServlet会根据该视图名称结合视图解析器进行解析
        2)void setView(View view):传递一个View类型的对象,
    • 示例
        1) 创建处理器方法
        在这里插入图片描述
        2)在页面中回显模型数据
        在这里插入图片描述
        在这里插入图片描述

    1.3 Model,Map

    • SpringMvc在内部使用了一个Model接口存储模型数据
    • 具体步骤:
        1)SpringMvc在调用方法前会调用一个隐含的模型对象作为模型数据的存储对象
        2)如果方法的形参是Map或者Model类,SpringMvc会将隐含类型的引用传递给这些形参。在方法体内,可以通过这个形参对象访问到模型数据中所有数据,也可以向模型中添加新的属性数据。
    • 示例
        在这里插入图片描述
        在这里插入图片描述

    1.4 @SessionAttributes

    • 这个在第五篇里面已经提到过了,所以不重复了

    1.5 @ModelAttribute

    • PS:这一部分内容转载自–》@ModelAttribute使用,并做适当修改
    • @ModelAttribute注解的使用位置
        1)应用在方法上
        2)应用在方法的参数上
        3)应用在方法上,并且方法也使用了@RequestMapping
    1. 应用在方法上
    • 被@ModelAttribute注解的方法会在当前Controller每个方法执行之前都执行,因此对于一个Controller中包含多个URL的时候,要谨慎使用。
    • 1)使用@ModelAttribute注解无返回值的方法
        在这里插入图片描述
        说明:当访问/view/test的时候,首先会执行myModel方法,在该方法内,会接受请求中传递的参数,并且使用一个Model对象,将str值保存起来,然后会执行test方法,然后跳转到success.jsp页面中,此时Model对象也会被传递过来,在页面中也可以获取到Model中的值
        如果把myModel和test方法合二为一,就是下面的样子:
        在这里插入图片描述
    • 2)使用@ModelAttribute注解有返回值的方法
        在这里插入图片描述
        在这里插入图片描述
        在这种情况下,返回值对象被默认放到隐含的Model中,在Model中的key为返回值首字母小写,value为返回的值。如果对于key的默认取值不满意,可以使用@ModelAttribute(value=“xxx”)来改变key的值
        上面的情况等同于下面这个形式:
        在这里插入图片描述
        现在我们启动测试,看看能否在页面中获取到值
        在这里插入图片描述
    1. 应用在方法的参数上
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        从演示效果来看,使用@ModelAttribute注解的参数,会从前面@ModelAttribute注解的方法中给Model传入的参数中寻找对应属性并传入
        这里强调一个@SessionAttributes的使用,因为和@ModelAttribute注解有关系
        在这里插入图片描述
    2. 应用在方法上,并且方法也使用了@RequestMapping
        在这里插入图片描述
        这种情况下,返回值String(或者其他对象)就不再是视图了,而是放入到Model中的值,此时对应的页面就是@RequestMapping中的值test
        如果类上有@RequestMapping,则视图路径还要加上类的@RequestMapping值,上面例子中视图路径为view/test.jsp

    2 视图和视图解析器

    2.1 引入

    • 视图是展示给用户的内容。在此之前,需要通过控制器得到对应的数据模型,如果是非逻辑视图,则不会经过视图解析器定位视图,而是直接将数据模型渲染就结束了;而逻辑视图则要对其进一步解析,以定位真实视图,这就是视图解析器的作用。而视图则是把从控制器查询回来的数据模型进行渲染,以显示给请求者查看。

    2.2 视图

    • 在向控制器发起请求之后,SpringMvc控制器获取到了对应的数据,绑定到数据模型中,那么视图就可以展示数据模型的信息了。
    • 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的 处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图
    • 为了满足各种需求,SpringMvc中定义了多种视图,只是常用的不多,有几个而已。
    • 下面来看一下核心接口View的源码
        在这里插入图片描述
    • 里面的getContentType方法和render方法很重要。getContentType表示返回一个字符串,标明给用户什么类型的文件响应,可以是HTML,json,PDF等,而render方法则是一个渲染视图的方法,通过它就可以渲染视图了。其中,Model是其模型数据,HTTP请求对象和响应对象用于处理HTTP请求的各类问题。
    • 当控制器返回ModelAndView的时候,视图解析器就会解析它,然后将模型数据传递给render方法,这样就能够渲染视图了。SpringMvc中实现视图的类有很多,比如Jstl视图JstlView,Json视图MappingJackson2JsonView等等,通过这些具体视图的render方法,SpringMvc就可以将模型数据渲染称为各类视图,来满足各种需求。
    • 下图为SpringMvc主要视图类的结构图
        在这里插入图片描述
    • 这只是画了一部分比较常用的,最常用的是JstlView,InternalResourceView和MappingJackson2JSONView等这几种。并且JstlView和InternalResourceView是父子关系,可以看成一类,主要是为jsp的渲染服务的,可以使用jstl标签库,也可以使用SpringMvc提供的标签库。
    • 视图又分为逻辑视图和非逻辑视图。比如MappingJackson2JsonView是一个非逻辑视图,它的目的就是将数据模型转换为一个JSON视图,展现给用户,无需对视图名字再进行下一步的解析。下面来看个示例
        在使用的时候需要额外添加Jackson的jar包,资料:链接:https://pan.baidu.com/s/1mz_Kp1kd70kvzuONHdQ3qw 提取码:fvk9
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
    • 通过ModelAndView中的setView方法可以指定具体的视图类型,由于设置的MappingJackson2JsonView视图是非逻辑视图,所以在没有视图解析器的情况下也可以进行渲染,最终将绑定的模型数据转换为Json数据
    • 下面来看一个逻辑视图InternalResourceView,对于逻辑视图而言,必须要要一个视图解析器,下面是我的项目中使用的视图解析器,配置在springmvc.xml中
        在这里插入图片描述
    • 上面是使用配置文件xml的形式来配置,其实使用Java代码配置也可以,但是我个人不常用,二者殊途同归,都是要创建一个视图解析器,通过前缀和后缀加上视图名称就能找到对应的Jsp文件,然后把模型数据渲染到jsp文件中,这样便能展现视图给用户了。
    • 了解了大概解析过程,现在开始研究一下视图解析器了,不了解它,那就没法深刻理解具体视图是怎么做关联对应的。

    2.3 视图解析器

    • 对于非逻辑视图而言是不需要用视图解析器进行解析的,比如MappingJackson2JsonView,它的含义就是把当前数据模型转换为json,并不需要对视图逻辑名称进行转换。但是对于逻辑视图而言把视图名称转换成逻辑视图则是必备过程,InternalResourceView就是这样一个视图。在配置文件中配置它以后就会加载到SpringMvc的视图解析器列表中,当返回ModelAndView的时候,SpringMvc就会在视图解析器列表中查找,找到对应的视图解析器进行解析视图。
    • 先看一下视图解析器顶层接口ViewResolver的源码
        在这里插入图片描述
    • 是不是很简单哈哈,这里面只有一个对视图进行解析的方法resolveViewName的定义,里面的参数有两个,viewName表示视图名称,locale用于国际化,这也说明了SpringMvc是支持国际化的。
    • 下面来看一下SpringMvc中配置的视图解析器的主要结构图
        在这里插入图片描述
    • 上图中描述了SpringMvc自带的一部分视图解析器,它能够解析各种各样需要逻辑视图名称。之前都是默认配置了InternalResourceViewResolver的,但是可以发现控制器中处理方法中有时并没有返回一个ModelAndView,而是直接返回一个字符串,它也可以渲染视图,因为底层视图解析器生成了对应的视图。
        在这里插入图片描述
    • 对于上面的代码,因为配置了InternalResourceViewR额搜绿二,通过springMvc的作用,它能够生成JstlView视图。系统也会绑定视图和模型数据到一个ModelAndView中,然后视图解析器根据视图的名称,找到对应的视图资源,这就是视图解析器的作用。
    展开全文
  • Spring配置Freemarker视图解析器,前台页面全部使用freemarker渲染
  • Spring 视图和视图解析器简介什么是 Spring 视图和视图解析器Spring MVC(Model View Controller)是 Spring 中一个重要的组成部分,而 Spring 视图和视图解析器则是 Spring MVC 中的组成部分。在介绍 Spring 视图和...
  • 视图解析器是MVC 的V(视图)环节。这个环节在Spring 中的最主要体现在与如何将模型数据与视图进行绑定渲染? 切入点追踪Controller 首先我们从最简单的控制器开始,如下是我们的控制器代码 这个控制器返回了...
  • springBoot配置视图解析器

    千次阅读 2020-03-17 15:57:29
    1.直接写一个配置类继承WebMvcConfigurerAdapter即可 具体代码如下: ... import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springfra...
  • 前几篇文章介绍了springmvc调用Controller的处理流程,现在已经知道调用Controller之后可以得到ModelAndView对象,那么如何根据ModelAndView对象得到View对象,这就需要借助视图解析器ViewResolver了。 文章目录一、...
  • 视图解析器配置

    2021-01-14 21:05:33
    1、视图解析器配置: 配置文件中需要注意的属性: REDIRECT_URL_PREFIX = “redirect:” --重定向前缀 FORWARD_URL_PREFIX = “forward:” --转发前缀 prefix = “”; --视图名称前缀 suffix = “”; --视图...
  • 视图解析器及其原理

    2021-03-04 09:10:32
    render方法完成视图解析器:解析ModelView并得到具体的视图对象View视图解析器配置:指出拼串的前缀和后缀关于重定向视图解析原理 ModelAndView 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些...
  • 这两天自己写项目,到视图解析器怎么配置都不管用,按网上说的加spring.mvc.view.prefix也不好使,后来发现并不是通用的,被坑了一把: 以下是在application.properties里的配置(只要是yml或是properties里就行) #...
  • 什么是视图解析器

    千次阅读 2020-07-12 18:25:04
    SpringMVC中的视图解析器的主要作用就是将逻辑视图转换成用户可以看到的物理视图。 当用户对SpringMVC应用程序发起请求时,这些请求都会被SpringMVC的DispatcherServlet处理,通过处理器找到最为合适的...
  • springmvc配置视图解析器和重定向

    千次阅读 2020-09-13 18:19:30
    为什么需要配置视图解析器 看图 配置步骤 第一步:需要在springmvc.xml配置 <!-- 配置SpringMVC的视图解析器: 配置前缀和后缀 --> <bean class="org.springframework.web.servlet.view....
  • SpringMVC 视图解析器

    千次阅读 2019-04-22 16:57:24
    1.视图解析器 会 根据 把控制器返回的逻辑视图名 确定渲染模型的视图文件的物理位置。 Spring MVC的一个重要特性:将控制器中处理请求的逻辑 和 视图中渲染实现 解耦。 控制器方法和视图实现 只会在模型内容上保持...
  • view视图解析器解析

    千次阅读 2017-11-30 19:56:27
    ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图,SpringMVC中用于把View对象呈现给客户端的是View对象本身,而ViewResolver只是把逻辑视图名称解析为对象的View对象。View接口的主要作用是...
  • springboot视图解析器

    万次阅读 2020-06-05 21:53:14
    视图解析器:简单来说,将用户请求转到对应页面 配置方式一:application.properties #配置视图解析器 spring.mvc.view.prefix=/WEB-INF/pages/ spring.mvc.view.suffix=.jsp 方式二:Java类处理 import org....
  • spring MVC视图解析器

    万次阅读 2017-11-20 22:31:32
    在这篇博客中介绍一下SpringMVC视图解析器。当我们对SpringMVC控制的资源发起请求时,这些请求都会被SpringMVC的DispatcherServlet处理,接着spring会分析看哪一个HandlerMapping定义的所有请求映射中存在对该请求的...
  • 视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析,在springmvc.xml配置文件中配置如下: <!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname=...
  • * @Description: 将自定义tml视图解析器添加到模板引擎并主持到ioc */ @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); template...
  • spring多个视图解析器 1.简介 在Spring中,提供了View Resolver来使用模型中可用的数据来解析视图,而无需与JSP,Velocity或Thymeleaf等View技术紧密绑定。 Spring可以根据需要轻松灵活地配置一个或多个View ...
  • 1.视图解析的流程 从上面的流程图可以看出,视图解析的过程主要有两个类在起主要作用,View视图...1.3. 视图解析器接口及其实现类 请求内容为web项目目录下的内容(如Jsp页面)时使用InternalResourceViewResolver ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 198,654
精华内容 79,461
关键字:

视图解析器