【Spring】渲染Web视图

简介: 前面学习了编写Web请求的控制器,创建简单的视图,本篇博文讲解控制器完成请求到结果渲染到用户的浏览器的过程。

前言


前面学习了编写Web请求的控制器,创建简单的视图,本篇博文讲解控制器完成请求到结果渲染到用户的浏览器的过程。


渲染Web视图



理解视图解析

前面所编写的控制器方法都没有直接产生浏览器中渲染所需要的HTML,只是将数据填充到模型中,然后将模型传递给视图,方法返回值是String类型的值,其是视图的逻辑名称,不会直接引用具体的视图实现。将控制器中请求处理的逻辑和视图中的渲染解耦是Spring MVC的重要特征,控制器只通过逻辑视图名了解视图,而视图解析器用于确定使用哪个视图实现来渲染模型。前面在WebConfig中,使用了InternalResourceViewResolver,其配置了prefix/WEB-INF/views/suffix.jsp用于确定渲染模型的jsp文件的物理位置。Spring自带了12个视图解析器用于将逻辑视图名转化为物理实现。


对于不同的视图解析器,一般对应某种特定的视图技术,如InternalResourceViewResolver一般用于JSP视图、TilesViewResolver用于Apache Tiles视图、FreeMarkerViewResolver用于FreeMarker视图、VelocityViewResolver用于Velocity视图。


创建JSP视图

Spring提供了两种支持JSP视图的方式。

  • InternalResourceViewResolver会将视图名解析为JSP文件。
  • Spring提供了两个JSP标签库,一个用于表单到模型的绑定,一个用于提供了通用的工具类特性。


配置适用于JSP的视图解析器

InternalResourceViewResolver会在视图名上添加前缀和后缀,进而确定Web应用中的视图资源的物理路径,如下代码使用@Bean注解,并设置了前缀和后缀的解析器。

@Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

也可使用XML的配置如下。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  p:prefix="/WEB-INF/views/"
  p:suffix=".jsp" />

配置视图解析器后,home会被解析为/WEB-INF/views/home.jsp/books/detail会被解析为/WEB-INF/views/books/detail.jsp

InternalResourceViewResolver最终会将逻辑视图名解析为InternalResourceView实例,该实例会引用JSP文件,如果JSP文件中使用JSTL标签处理信息和格式化时,需要将其解析为JSTLView,此时需要设置解析器的viewClassJstlView.class即可。


使用Spring的JSP库

Spring提供了两个用来帮助定义Spring MVC Web视图的JSP标签库,其中一个标签库会用来渲染HTML表单标签,另一个标签库包含工具类标签。

Spring的表单绑定JSP标签库包含了14个标签,其中大多数用来渲染HTML的表单标签,其能够根据模型中对象的属性填充值,还包含展现用户错误的的标签,其会将错误信息渲染到最终的HTML中,可通过如下方式指定。

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="cf" %>

在声明后,即可使用如下14个标签库。


针对不同地区展示不同信息已是国际化的重要组成部分,其关键在于使用<s:message>标签,如在home.jsp中添加<s:message code="spittr.welcome" />标签,然后在WebConfig中添加如下代码。

@Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
        resourceBundleMessageSource.setBasename("messages");
        return resourceBundleMessageSource;
    }

最后在resources/下添加messages.properties文件,并配置内容如下spitter.welcome=welcome!,启动,显示welcome!,还可配置message_zh.properties文件,内容配置如下spitter.welcome=china welcome!,启动,会显示china wecome!,即会根据本地时区选择合适的messages文件显示。


使用Apache Tiles视图定义布局

前面我们并未关注Web页面的布局问题,每个jsp完全负责定义自身的布局,假定需要为所有页面定义一个通用的头部和底部,这时可使用布局引擎如Apache Tiles,定义适用于所有页面的通用页面布局。


配置Tiles视图解析器

首先需要配置TilesConfigurerbean,它负责定位和加载Tile定义并协调生成Tiles,再者需要TilesViewResolverbean将逻辑视图名称解析为Tile定义。

@Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitions("/WEB-INF/layout/tiles.xml");
        tilesConfigurer.setCheckRefresh(true);
        return tilesConfigurer;
    }

然后再定义tils.xml文件和对应的文件即可。


使用Thymeleaf


配置Thymeleaf视图解析器

需要配置如下三个bean

  • ThymeleafViewResolver,将逻辑视图名解析为Thymeleaf模版视图。
  • SpringTemplateEngine,处理模板并渲染结果。
  • TemplateResolver,加载Thymeleaf模板。

添加beanWebConfig中如下。

@Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }
    @Bean
    public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        return templateEngine;
    }
    @Bean
    public TemplateResolver templateResolver() {
        TemplateResolver templateResolver = new ServletContextTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        return templateResolver;
    }


总结


Spring的视图渲染十分灵活,有传统的jsp方案(InternalResourceViewResolver),还有Tiles(TilesViewResolver)Thymeleaf(ThymeleafViewResolver)的布局引擎,开发者可根据自身需求选择合适的视图解析器。

目录
相关文章
|
2天前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
51 3
|
2天前
|
设计模式 存储 前端开发
MVC(模型-视图-控制器)是一种在Web应用程序开发中广泛使用的软件设计模式
【5月更文挑战第12天】MVC模式是Web应用开发中的常见设计模式,将逻辑、数据和界面分离,提升代码可维护性和重用性。模型处理数据逻辑,视图展示数据,控制器协调用户输入与模型视图交互。优点包括代码分离、易维护、可扩展和组件重用,促进高效灵活的开发。
8 2
|
2天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
29 3
|
2天前
|
XML 前端开发 JavaScript
CSR(客户端渲染)和AJAX在Web开发中各自扮演不同的角色
【5月更文挑战第8天】CSR(客户端渲染)与AJAX在Web开发中各司其职。CSR提供初始HTML框架,通过JavaScript在浏览器端获取并渲染数据,提升交互性和响应速度。AJAX则实现页面局部更新,如实时搜索,不刷新页面即可获取数据。CSR可能因DOM操作多而引发性能问题,但可优化解决;AJAX适合频繁交互场景,提高响应性。两者在不同需求下各有优势,需按项目选择适用技术。
16 4
|
2天前
|
前端开发 搜索推荐 安全
AJAX和CSR(客户端渲染)是Web开发中常用的两种技术
【5月更文挑战第8天】AJAX提升用户体验,减轻服务器压力,但对搜索引擎不友好且增加开发复杂度,易引发安全问题。CSR提供快速响应和交互性,改善用户体验,但首屏加载慢,搜索引擎支持不足,同样面临安全挑战。两者各有适用场景,需按项目需求选择。
15 0
|
2天前
|
Python
python web框架fastapi模板渲染--Jinja2使用技巧总结
python web框架fastapi模板渲染--Jinja2使用技巧总结
|
2天前
|
开发框架 前端开发 安全
Java从入门到精通:2.2.2学习使用Spring框架进行Web应用开发
Java从入门到精通:2.2.2学习使用Spring框架进行Web应用开发
|
2天前
|
安全 Java Go
第6章 Spring Security 的 Web 安全性(2024 最新版)(下)
第6章 Spring Security 的 Web 安全性(2024 最新版)
63 1
|
2天前
|
存储 安全 前端开发
第6章 Spring Security 的 Web 安全性(2024 最新版)(上)
第6章 Spring Security 的 Web 安全性(2024 最新版)
58 0
|
12小时前
|
JavaScript
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
js中如何使用工厂方式和构造函数创建对象,web开发项目实例