视图解析器

探讨SpringMVC中视图和视图解析器的概念,包括ModelAndView对象、视图解析策略、InternalResourceViewResolver配置及自定义视图解析器的实现。

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

请求处理方法执行完成之后,最终返回的是一个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的转发操作

<think> 首先,用户的问题是关于Spring Boot如何配置视图解析器的。我需要参考提供的站内引用来构建回答。 回顾引用内容: - **引用[1]**: 解释了手动配置和Spring Boot自动配置视图解析器的区别。提到了手动配置适用于非Spring Boot项目或深度定制,而Spring Boot自动配置简化了集成。 - **引用[2]**: 展示了在Spring Boot配置类中配置InternalResourceViewResolver的代码示例。 - **引用[3]**: 展示了使用WebMvcConfigurerAdapter来配置视图控制器,控制跳转页面。 - **引用[4]**: 展示了XmlViewResolver的配置示例,但这是在XML中配置的。 - **引用[5]**: 讨论了配置视图解析器时可能导致404错误的问题,并提供了解决方法,比如注册webapp目录作为资源目录。 用户的核心问题是:"springboot如何配置视图解析器"。我需要提供一个清晰的、结构化的回答,引导用户逐步配置。 根据系统指令: - 使用中文回答。 - 回答结构清晰,帮助用户逐步解决问题。 - 引用内容时,在末尾添加引用标识,如[^1]。 - 生成相关问题(在"§§相关问题§§"部分)。 - 对于数学表达式,使用LaTeX格式,但这个问题似乎不涉及数学,所以可能不需要。 回答结构: 1. **介绍视图解析器**:简要解释视图解析器的作用。 2. **Spring Boot的自动配置**:基于引用[1],说明Spring Boot如何自动配置常见的视图解析器(如Thymeleaf、Freemarker等)。 3. **手动配置视图解析器**:如果需要自定义,如何手动配置。参考引用[2]和引用[4]。 - 使用InternalResourceViewResolver(用于JSP)的示例(引用[2])。 - 简要提到XmlViewResolver(引用[4]),但指出在Boot中可能不常用。 4. **配置视图控制器**:参考引用[3],展示如何设置默认视图或重定向。 5. **常见问题和解决方案**:基于引用[5],讨论配置错误如404问题,并提供修复建议。 6. **总结**:对比手动和自动配置,根据场景推荐。 最后,添加"§§相关问题§§"部分,生成相关问题。 确保引用: - 在相关段落末尾添加引用标识。 例如: - "Spring Boot会自动配置常见的视图解析器[^1]." - "可以手动配置InternalResourceViewResolver[^2]." 代码块:用户提供了代码示例,我应该引用它们。系统指令要求使用代码块展示代码。 在回答中: - 引用代码时,使用代码块格式。 - 确保LaTeX正确,但这里可能无数学。 相关问题建议: 1. 如何处理Spring Boot视图解析器配置错误? 2. Spring Boot支持哪些视图技术? 3. 如何自定义视图解析器行为? 4. 视图解析器视图控制器的区别是什么? 基于引用内容生成。 </think> ### Spring Boot视图解析器配置方法 在Spring Boot应用中,视图解析器(ViewResolver)负责将控制器返回的逻辑视图名(如"home")解析为具体的视图资源(如HTML、JSP文件)。Spring Boot通过自动配置简化了常见视图技术的集成,但也支持手动配置以满足定制需求。下面我将逐步解释配置方法,基于参考引用内容。 #### 1. **Spring Boot自动配置视图解析器** Spring Boot会根据项目依赖自动配置常见的视图解析器。例如,添加Thymeleaf或Freemarker starter依赖后,Boot会默认设置对应的视图解析器,无需手动配置。 - **步骤**: 1. 在`pom.xml`中添加视图技术的starter依赖(如Thymeleaf): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> ``` 2. 视图文件默认放在`src/main/resources/templates`目录下(如`home.html`)。 3. 控制器中返回逻辑视图名: ```java @Controller public class HomeController { @GetMapping("/") public String home() { return "home"; // 自动解析为templates/home.html } } ``` - **优势**:Spring Boot自动处理前缀、后缀等约定,属性可通过`application.properties`定制(如`spring.thymeleaf.prefix=classpath:/custom/`)[^1]。 #### 2. **手动配置视图解析器** 如果需要深度定制(如使用JSP或其他非标准视图),可以手动配置视图解析器。以下是两种常见方式: - **方式一:配置InternalResourceViewResolver(用于JSP)** 参考引用[2],在自定义配置类中使用`@Bean`定义: ```java package com.stu.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration public class MvcConfig { @Bean public ViewResolver internalResourceViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); // 视图文件前缀 resolver.setSuffix(".jsp"); // 视图文件后缀 return resolver; } } ``` - **注意事项**:确保视图文件路径正确(如将JSP文件放在`src/main/webapp/WEB-INF/views/`目录下)。如果出现404错误,需注册`webapp`目录为资源目录(见常见问题部分)[^2][^5]。 - **方式二:配置视图控制器(简化视图跳转)** 参考引用[3],使用`WebMvcConfigurer`设置默认视图或重定向: ```java package com.boot.zhiyi.config; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class ViewConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("forward:/html/login.html"); // 设置根路径跳转 registry.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置优先级 } } ``` - **适用场景**:适合单纯重定向或设置默认入口视图,无需控制器逻辑[^3]。 - **其他视图解析器(如XmlViewResolver)** 引用[4]展示了传统XML配置,但在Spring Boot中推荐使用Java配置。如果需要类似功能,可定义`BeanNameViewResolver`或自定义解析器,不建议直接使用XML[^4]。 #### 3. **常见问题与解决方案** - **404错误(视图文件未找到)**: - **原因**:视图文件路径未正确注册。 - **修复**:在`pom.xml`中添加资源目录配置(引用[5]): ```xml <build> <resources> <resource> <directory>src/main/webapp</directory> <!-- 注册webapp目录 --> <targetPath>META-INF/resources</targetPath> <includes> <include>**/*.*</include> </includes> </resource> </resources> </build> ``` 确保视图文件路径与`setPrefix()`匹配[^5]。 #### 4. **总结与推荐** - **自动配置**:默认推荐,适用于常见视图技术(Thymeleaf、Freemarker)。添加starter依赖后,Boot自动处理解析器,通过属性文件定制简单参数[^1]。 - **手动配置**:适用于JSP、深度定制或非标准需求。使用`InternalResourceViewResolver`或视图控制器,确保资源路径正确[^2][^3]。 - **选择建议**:优先使用自动配置;如需定制视图路径或处理特殊场景,再引入手动配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值