📅  最后修改于: 2023-12-03 15:05:16.304000             🧑  作者: Mango
Spring MVC是一个基于MVC框架的全栈框架,提供了强大的Web应用开发功能。其中,多视图页面是Spring MVC中非常重要的一部分,它可以让我们灵活的对应用程序的视图进行管理,同时支持多种视图技术。
视图解析器是Spring MVC多视图页面的核心组件之一,它的主要作用是将控制器返回的逻辑视图名称解析为需要渲染的物理视图。Spring MVC中提供了两个标准的视图解析器:InternalResourceViewResolver
和UrlBasedViewResolver
。
InternalResourceViewResolver
是Spring MVC中最常用的视图解析器,它的作用是将逻辑视图名称解析为JSP文件。
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setContentType("text/html;charset=UTF-8");
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
在上面的示例中,我们通过setPrefix
方法指定JSP文件所在的目录为/WEB-INF/jsp/
,然后通过setSuffix
方法指定JSP文件的后缀为.jsp
。这样,当我们在控制器中返回一个逻辑视图名称时,比如"home"
,InternalResourceViewResolver
会将其解析为"/WEB-INF/jsp/home.jsp"
,然后返回给前端进行渲染。
除了InternalResourceViewResolver
,Spring MVC还提供了另外一个视图解析器UrlBasedViewResolver
,它的作用是将逻辑视图名称解析为URL。
@Bean
public UrlBasedViewResolver freeMarkerViewResolver() {
UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
viewResolver.setContentType("text/html;charset=UTF-8");
viewResolver.setViewClass(FreeMarkerView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".html");
return viewResolver;
}
在上面的示例中,我们通过setViewClass
方法指定了要使用的视图类型为FreeMarker,然后通过setPrefix
方法指定URL前缀为/WEB-INF/views/
,通过setSuffix
方法指定URL后缀为.html
。这样,当我们在控制器中返回一个逻辑视图名称时,比如"home"
,UrlBasedViewResolver
会将其解析为"/WEB-INF/views/home.html"
,然后返回给前端进行渲染。
Spring MVC中支持同时使用多个视图解析器,通过配置多个视图解析器,我们可以轻松的实现多视图页面的功能。
@Configuration
@EnableWebMvc
@ComponentScan("com.example.springmvc")
public class AppConfig implements WebMvcConfigurer {
//定义JSP视图解析器
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setContentType("text/html;charset=UTF-8");
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
viewResolver.setOrder(0);
return viewResolver;
}
//定义FreeMarker视图解析器
@Bean
public UrlBasedViewResolver freeMarkerViewResolver() {
UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
viewResolver.setContentType("text/html;charset=UTF-8");
viewResolver.setViewClass(FreeMarkerView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".html");
viewResolver.setOrder(1);
return viewResolver;
}
//配置FreeMarker视图引擎
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/views/");
freeMarkerConfigurer.setDefaultEncoding("UTF-8");
return freeMarkerConfigurer;
}
//配置静态资源处理器
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
//配置消息转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
}
}
在上面的示例中,我们定义了两个视图解析器:InternalResourceViewResolver
和UrlBasedViewResolver
,并分别指定了JSP和FreeMarker视图解析器。然后通过setOrder
方法指定了它们的优先级,使得程序优先使用JSP视图解析器。
同时,我们还通过FreeMarkerConfigurer
配置了FreeMarker视图引擎,通过addResourceHandlers
方法配置了静态资源处理器,通过configureMessageConverters
方法配置了消息转换器,这些配置可以让我们的应用程序更加强大和灵活。
在实际开发中,我们经常需要在同一个应用程序中使用多种视图技术,下面给出了一个简单的示例:
@Controller
public class HelloController {
@GetMapping("/hello")
public String handleHello(Model model) {
model.addAttribute("message", "Hello World!");
return "hello";
}
@GetMapping("/hello.json")
@ResponseBody
public Map<String,Object> handleJson() {
Map<String,Object> result = new HashMap<>();
result.put("message", "Hello World!");
return result;
}
@GetMapping("/hello.xml")
@ResponseBody
public ModelAndView handleXml() {
Map<String,Object> model = new HashMap<>();
model.put("message", "Hello World!");
return new ModelAndView("xmlView", model);
}
}
在上面的示例中,我们定义了一个HelloController
,其中包含了三个方法用于处理不同的请求。其中,handleHello
方法返回一个逻辑视图名称"hello"
,当使用JSP视图解析器时,返回值将解析为JSP文件"/WEB-INF/jsp/hello.jsp"
,当使用FreeMarker视图解析器时,返回值将解析为URL"/WEB-INF/views/hello.html"
。
另外,handleJson
方法返回一个JSON格式的数据,可以通过Ajax请求获取数据。handleXml
方法返回一个XML格式的数据,可以通过WebService请求获取数据。
最后,我们需要根据实际的需求选择不同的视图解析器,视图引擎以及消息转换器等组件,才能灵活的实现Spring MVC的多视图页面功能。