精华内容
下载资源
问答
  • 视图解析器

    2019-10-08 15:59:18
    视图和视图解析器 请求处理方法执行完成之后,最终返回的是一个ModelAndView对象,对于那些返回String,View或者ModelMap等类型的处理方法,SpringMVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名...

    视图和视图解析器
    在这里插入图片描述

    请求处理方法执行完成之后,最终返回的是一个ModelAndView对象,对于那些返回String,View或者ModelMap等类型的处理方法,SpringMVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。
    SpringMVC接触视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP,也可能是EXCEL、JFreeChart等各种表现是形式的视图
    对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现MVC的充分解耦。

    视图(View)
    视图的作用使渲染模型数据,将模型里的数据以某种形式呈现给客户。为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义了一个高度抽象的View接口
    在这里插入图片描述
    视图对象由视图解析器负责实例化,由于视图是无状态的,所以它们不会有现成安全的问题。

    视图解析器(ViewResolver)
    SpringMVC为逻辑视图名的解析提供了不同的策略,可以在Spring Web上下文中配置一种或多种解析策略,并制定它们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
    视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。所有的视图解析器都必须实现ViewResolver接口。
    在这里插入图片描述

    org.springframework.web.servlet.view.InternalResourceViewResolver用于JSP解析。
    	<bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<property name="prefix" value="/WEB-INF/jsp/"></property>
    		<property name="suffix" value=".jsp"></property>
    	</bean>
    

    若项目中使用了JSTL,则SpringMVC会自动把视图由InternalResourceView转化为JstlView。若使用JSTL的fmt标签,则需要在SpringMVC的配置文件中配置国际化资源文件

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

    如果希望直接相应通过SpringMVC渲染的页面而不经过Handler处理,那么可以使用mvc:view-controller标签实现,比如直接访问/success,不经过Handler而直接访问success。jsp页面,由视图解析器解析为相应的jsp页面。首先需导入MVC命名空间,如下配置
    在这里插入图片描述

    <mvc:view-controller path="/success" view-name="success"/>
    //为了保证原先的请求能够正确找到相应的页面,必须配置以下代码,才能够正常
    <mvc:annotation-driven></mvc:annotation-driven>
    
    

    自定义视图解析器
    首先需要创建视图解析器类,是实现View接口,并且需要由Spring容器管理

    @Component
    public class MyView implements View {
    
    	public String getContentType() {
    		// TODO Auto-generated method stub
    		return "text/html";
    	}
    
    	public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
    			throws Exception {
    		// TODO Auto-generated method stub
    		System.out.println("*********");
    		response.getWriter().write("this is 自定义视图!");
    	}
    
    }
    

    配置视图解析器,BeanNameViewResolver根据视图名字解析视图

    //通过order属性指定视图解析器的优先级,值越小优先级越高,
    //开始配置的InternalResourceViewResolver默认是最大的,为Integer.MAX_VALUE
     <bean  class="org.springframework.web.servlet.view.BeanNameViewResolver">
    		<property name="order" value="100"></property>
    	</bean>
    

    编写Handler中的处理方法
    //返回值是自定义视图解析器的类名第一个字母小写的名字

        @RequestMapping("/testView")
    	public String testView() {
    		return "myView";
    	}
    

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

    展开全文
  • 与其叫ContentNegotiatingViewResolver为视图解析器,我觉得不如叫他视图解析器选择器,当然从宏观上来看ContentNegotiatingViewResolver是一个视图解析器。 ContentNegotiatingViewResolver可以“智能”地为我们...

    与其叫ContentNegotiatingViewResolver为视图解析器,我觉得不如叫他视图解析器选择器,当然从宏观上来看ContentNegotiatingViewResolver是一个视图解析器。
    ContentNegotiatingViewResolver可以“智能”地为我们选择视图解析器,所以ContentNegotiatingViewResolver中可以囊括多个视图解析器。

    示例:

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"
       p:order="1">
       <property name="viewResolvers">
           <list>
               <bean class="com.lyx.app.viewResolver.PdfViewResolver"
                     p:packageName="com.lyx.app.view"/>
               <bean class="com.lyx.app.viewResolver.XslViewResolver"
                     p:packageName="com.lyx.app.view"/>
               <ref bean="jspResolver"/>
           </list>
       </property>
    </bean>
    

    ContentNegotiatingViewResolver中的viewResolvers属性是一个List集合,其中可以指定多个视图解析器。
    除此之外ContentNegotiatingViewResolver还会扫描Spring 容器中所有的bean,如果发现了ViewResolver,那么该ViewResolver会供ContentNegotiatingViewResolver利用。

    那么ContentNegotiatingViewResolver是如何“智能”地选择视图解析器呢?
    有三种方式(优先级从高到底):

    1. 根据请求后缀,比如请求后缀是.xsl,那么它就会判断contentType是application/vnd.ms-excel…以此类推。
    2. 根据请求参数,比如请求参数xxxx/?format=json它就会判断contentType是application/json
    3. 根据Accept请求头,例如请求头包含text/html,他就会判断请求的contextType是text/html
    展开全文
  • Spring配置Freemarker视图解析器,配置多个视图解析器
  • SpringMVC 视图解析器还记得SpringMVC 快速入门中,dispatcher-servlet.xml 配置的视图解析器么。它是SpringMVC 的核心知识点。本章节比较简单,明白视图解析器的工作原理,然后配置自定义的视图解析器和使用重点向...

    SpringMVC 视图解析器

    还记得SpringMVC 快速入门中,dispatcher-servlet.xml 配置的视图解析器么。它是SpringMVC 的核心知识点。本章节比较简单,明白视图解析器的工作原理,然后配置自定义的视图解析器和使用重点向跳转页面。

    SpringMVC的配置文件,dispatcher-servlet.xml。这里配置了直接跳转的页面 mvc:view-controller 即不经过Controller层,直接根据视图解析器跳转页面。还配置了视图解析器 BeanNameViewResolver 优先级为666。其中jsp最为常见的解析器是 InternalResourceViewResolver 器优先级是int类型的最大值。也就是说优先级最低。

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    自定义CustomViewResolver java类 实现 View 接口。

    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.springframework.stereotype.Component;

    import org.springframework.web.servlet.View;

    @Component

    public class CustomViewResolver implements View{

    public String getContentType() {

    return "text/html";

    }

    public void render(Map model, HttpServletRequest request,

    HttpServletResponse response) throws Exception {

    response.setCharacterEncoding("utf-8");

    response.setContentType("text/html;charset=utf-8");

    response.getWriter().print("CustomViewResolver order 越小优先级越高! 所以优先于 InternalResourceViewResolver");

    }

    }

    语法知识点说明类 ViewResolverController

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation.RequestMapping;

    @Controller

    public class ViewResolverController {

    @RequestMapping("/testRedirect")

    public String testRedirect() {

    System.out.println("^^^^^^^^^^^^^^^^^^^^^重定向到apistudy.jsp页面,地址栏URL改变");

    return "redirect:apiStudy/testModelAndView";

    }

    @RequestMapping("/testForward")

    public String testForward() {

    System.out.println("^^^^^^^^^^^^^^^^^^^^^转发到apistudy.jsp页面,地址栏URL不变");

    return "forward:apiStudy/testModelAndView";

    }

    @RequestMapping("/testCustomViewResolver")

    public String testCustomViewResolver() {

    System.out.println("^^^^^^^^^^^^^^^^^^^^^进入到自定义的视图解析器中,返回值必须是类名首字母小写");

    return "customViewResolver";

    }

    }

    WEB-INF/views/index.jsp

    pageEncoding="UTF-8"%>

    SpringMVC 快速入门

    视图解析器

    Test Redirect

    Test Forward

    Test Custom View Resolver

    运行的效果图

    视图解析器工作流程:

    首先,不管目标方法的返回值是 String, Map, ModelMap, Model, 还是 ModelAndView。 SpringMVC 都会在内部将他们装配成ModelAndView对象,

    然后,借助视图解析器 ViewResolver,得到最终的逻辑视图对象View。最终的物理视图可以是jsp,excel,表单 等各种表现形式的视图。

    到这里SpringMVC 的视图解析器就介绍完了,下一章是重难点,SpringMVC Form表单的crud操作。

    展开全文
  • 最近被问到过几次关于springmvc多视图解析器解析的问题;总结一下。1、问题:假设我有两个jsp:WEB-INF/html/a.jspWEB-INF/report/b.jsp且我配置了视图解析器:然后呢,我分别返回视图名为a和b;为什么a能找到,而b...

    最近被问到过几次关于springmvc多视图解析器解析的问题;总结一下。

    1、问题:

    假设我有两个jsp:

    WEB-INF/html/a.jsp

    WEB-INF/report/b.jsp

    且我配置了视图解析器:

    然后呢,我分别返回视图名为a和b;为什么a能找到,而b的时候是404;我配置了两个视图解析器,第一个找不到的话,第二个能找到啊?遇到过这个问题的朋友基本上会有类似的问题;

    2、分析

    此处我们使用了InternalResourceViewResolver,其有一个buildView方法,该方法一定会创建一个View;所以呢View永远不为null(即使该jsp不存在);问题就是出在这;因为我们使用这个的时候默认是使用servlet forward转发的,此时并不知道该jsp是否存在。

    3、解决方案:

    3.1、最简单的办法是使用其viewNames属性,来指定一个是否可以处理的规则;

    如上两个的意思是对html或report开头的视图名进行处理,比如返回的视图名为html/a 那么会交给viewNames为html*的那个解析器处理;支持的规则可以查看javadoc。

    3.2、内容协商,根据请求时的MediaType来决定使用哪个View;比如根据不同的MediaType决定是JSON/XML/HTML展示时;可以搜索ContentNegotiatingViewResolver了解;

    以上的方式对于请求的MediaType一样,且视图名没有规则时一点用没有。

    3.3、如果仅有几个不同的视图需要特殊处理;可以考虑直接返回View对象进行处理;而直接不走ViewResolver;

    3.4、如果以上都不满足;那只能自己实现自己相应的ViewResolver,可以覆盖两个方法进行处理:

    3.4.1、覆盖UrlBasedViewResolver子类的canHandle;来决定哪些视图名不需要当前ViewResolver进行处理;自己可以得到prefix + suffix进行判断具体的视图页面是否存在,当然这个可能会存在性能问题;考虑做缓存。

    展开全文
  • 对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象...
  • ContentNegotiatingViewResolver视图解析器是Spring MVC 中常用的一个视图解析器。 这个实现了ViewResolver接口,基于请求文件和Accept 头部信息。ContentNagotiatingViewResolver自己并不解析视图,而是委派给其他...
  • 结构.png网上提供的很多办法,都是说修改order 来设置解析器的优先级,但是经尝试,发现此办法行不通,html和jsp配置同样的优先级,jsp视图解析器还是无法解析jsp,而且网上的很多配置文件写法...
  • 扩展:加深视图解析器和视图对象; 视图解析器根据方法的返回值得到视图对象; 多个视图解析器都会尝试能否得到视图对象; 视图对象不同就可以具有不同功能; ...
  • 视图解析器的一些属性class="org.springframework.web.servlet.view.InternalResourceViewResolver">在视图解析器的定义中,"exposeSpringMacroHelpers"设置是否通过Spring的宏库暴露一个RequestContext(名为...
  • springboot视图解析器

    万次阅读 2020-06-05 21:53:14
    视图解析器:简单来说,将用户请求转到对应页面 配置方式一:application.properties #配置视图解析器 spring.mvc.view.prefix=/WEB-INF/pages/ spring.mvc.view.suffix=.jsp 方式二:Java类处理 import org....
  • 视图和视图解析器 视图解析流程分析 视图和视图解析器 视图 常用的视图实现类 视图解析器 常用的视图解析器实现类 InternalResourceViewResolver 自定义视图 Excel视图 关于重定向

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,949
精华内容 2,779
关键字:

视图解析器