首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详解Java中的复合视图设计模式

详解Java中的复合视图设计模式

原创
作者头像
苏先生
修改于 2019-05-17 01:47:56
修改于 2019-05-17 01:47:56
1.7K00
代码可运行
举报
文章被收录于专栏:Java架构-筑基Java架构-筑基
运行总次数:0
代码可运行

使用由多个子视图组成的复合视图。整个模板的每个子视图可以整体动态地包括在内,并且可以独立于内容来管理页面的布局。

Apache Tiles和SiteMesh 框架使用Composite View Design Pattern。

为简单起见,这种模式分为若干部分,如问题,动因,结构,解决方案,实施等。

目录

  • 问题
  • 动因
  • 解决方案
  • 说明
  • 结构 - 类图,序列图
  • 参与者和责任
  • 履行
  • 后果
  • 适用性
  • 现实世界的例子
  • 参考

问题

(问题部分描述了开发人员面临的设计问题)

您希望从模块化的原子组件部件构建视图,这些部件组合在一起以创建复合整体,同时独立地管理内容和布局。

动因

(本节描述了列出影响问题和解决方案的原因和动机。动因列表突出了人们可能选择使用模式并提供使用模式的理由的原因)

  • 您需要在多个视图中重复使用的常见子视图,例如页眉,页脚和表格,这些子视图可能出现在每个页面布局中的不同位置。
  • 您在子视图中有内容可能经常更改或可能受某些访问控制的约束,例如限制对特定角色的用户的访问。
  • 您希望避免在多个视图中直接嵌入和复制子视图,这使得布局更改难以管理和维护。

解决方案

使用由多个原子子视图组成的复合视图。整个模板的每个子视图可以整体动态地包括在内,并且可以独立于内容来管理页面的布局。

例如,门户网站包含许多独立的子视图,例如新闻源,天气信息和单个页面上的股票报价。可以独立于内容来管理页面的布局。

此模式的另一个好处是,Web设计人员可以对站点的布局进行原型设计,将静态内容插入每个模板区域。随着站点开发的进展,实际内容将替换这些占位符。该方法提供了改进的模块化和可重用性,以及改进的可维护性。

结构体

我们使用UML类图来显示解决方案的基本结构,本节中的UML序列图介绍了解决方案的动态机制。

下面是表示Composite View Design Pattern关系的类图。

类图

序列图

参与者和责任

Client - 客户端发送到视图。

View- 视图。

SimpleView- 表示的复合整体的原子部分。它也被称为视图片段或子视图。

CompositeView- 复合视图由多个视图组成。这些视图中的每一个要么是一个简单视图,要么本身可能是一个复合视图。

Template- 模板,代表视图布局。

这种模式如何运作

为了理解这种模式,我们举一个例子。在下图中,您可以看到网页的典型结构。

这种结构称为“经典布局”。模板根据此布局组织页面,将每个“块”放在所需的位置,以使标题上升,页脚向下等。

可能会发生这种情况,例如点击链接,只需要更改页面的一部分,通常是正文。

如您所见,页面不同,但它们的区别仅在于正文部分。但是请注意,页面是不同的,它不像框架集中的框架刷新!

使用复合视图模式,页面的其他部分已被重用,并且已保留布局一致性。

履行

在此示例中,View管理是使用标准JSP标记实现的,例如jsp:include标记。使用标准标签来管理视图的布局和组合是一种易于实施的策略。

标准标签视图管理策略示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
   <body>
      <jsp:include
         page="/jsp/CompositeView/javabean/banner.seg" flush="true"/>
      <table width="100%">
         <tr align="left" valign="middle">
            <td width="20%">
               <jsp:include page="/jsp/CompositeView/javabean/ProfilePane.jsp"
                  flush="true"/>
            </td>
            <td width="70%" align="center">
               <jsp:include page="/jsp/CompositeView/javabean/mainpanel.jsp"
                  lush="true"/>
            </td>
         </tr>
      </table>
      <jsp:include page="/jsp/CompositeView/javabean/footer.seg"
         flush="true"/>
   </body>
</html>

Apache Tiles与Spring MVC集成的 示例

Apache Tiles是一个免费的开源模板框架,完全基于Composite设计模式。在Apache Tiles中,通过组合称为Tiles的子视图组合来构建页面。

第1步: 提供依赖关系配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>3.0.7</version>
</dependency>

第2步:定义平铺布局文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<tiles-definitions>
    <definition name="template-def"
           template="/WEB-INF/views/tiles/layouts/defaultLayout.jsp">  
        <put-attribute name="title" value="" />  
        <put-attribute name="header"
           value="/WEB-INF/views/tiles/templates/defaultHeader.jsp" />  
        <put-attribute name="menu"
           value="/WEB-INF/views/tiles/templates/defaultMenu.jsp" />  
        <put-attribute name="body" value="" />  
        <put-attribute name="footer"
           value="/WEB-INF/views/tiles/templates/defaultFooter.jsp" />  
    </definition>  
    //欢迎加入Java高级架构进阶Qqun:963944895;免费分享Java架构学习资料、面试题、编程书籍
    <definition name="home" extends="template-def">  
        <put-attribute name="title" value="Welcome" />  
        <put-attribute name="body"
           value="/WEB-INF/views/pages/home.jsp" />  
    </definition>  
</tiles-definitions>

第3步: ApplicationConfiguration和其他类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
@RequestMapping("/")
public class ApplicationController {
    @RequestMapping(
        value = {
            "/"
        },
        method = RequestMethod.GET)
    public String homePage(ModelMap model) {
        return "home";
    }
    @RequestMapping(
        value = {
            "/apachetiles"
        },
        method = RequestMethod.GET)
    public String productsPage(ModelMap model) {
        return "apachetiles";
    }

    @RequestMapping(
        value = {
            "/springmvc"
        },
        method = RequestMethod.GET)
    public String contactUsPage(ModelMap model) {
        return "springmvc";
    }
}
//欢迎加入Java高级架构进阶Qqun:963944895;免费分享Java架构学习资料、面试题、编程书籍
public class ApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class << ? > [] getRootConfigClasses() {
        return new Class[] {
            ApplicationConfiguration.class
        };
    }

    @Override
    protected Class << ? > [] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {
            "/"
        };
    }
}

最后,在ApplicationConfiguration类中,我们使用TilesConfigurer和TilesViewResolver类来实现集成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.baeldung.tiles.springmvc")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
    @Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitions(
            new String[] {
                "/WEB-INF/views/**/tiles.xml"
            });
        tilesConfigurer.setCheckRefresh(true);

        return tilesConfigurer;
    }
//欢迎加入Java高级架构进阶Qqun:963944895;免费分享Java架构学习资料、面试题、编程书籍
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        TilesViewResolver viewResolver = new TilesViewResolver();
        registry.viewResolver(viewResolver);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
            .addResourceLocations("/static/");
    }
}

第4步: 平铺模板文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
    <head>
        <meta
          http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title><tiles:getAsString name="title" /></title>
        <link href="<c:url value='/static/css/app.css' />" 
            rel="stylesheet">
        </link>
    </head>
    <body>
        <div class="flex-container">
            <tiles:insertAttribute name="header" />
            <tiles:insertAttribute name="menu" />
        <article class="article">
            <tiles:insertAttribute name="body" />
        </article>
        <tiles:insertAttribute name="footer" />
        </div>
    </body>
</html>

后果

  • 改善模块化和重用
  • 添加基于角色或基于策略的控制
  • 增强可维护性
  • 降低可维护性
  • 降低性能

写在最后

点关注,不迷路;持续更新Java相关技术及资讯文章

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ModelAndView 详解
当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。 因此,经常需要在控制器中构造ModelAndView对象。ModelAndView类提供了几个重载的构造器和一些方便的方法, 让你可以根据自己的喜好来构造ModelAndView对象。这些构造器和方法以类似的方式支持视图名称和视图对象。 当你只有一个模型属性要返回时,可以在构造器中指定该属性来构造ModelAndView对象.通过ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面 , 使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。 调用addObject()方法将值设置到一个名为ModelMap的类属性,ModelMap是LinkedHashMap的子类, 具体请看类。 ModelAndView 包括Model 和View ,下面是他的构造方法中的两个
全栈程序员站长
2022/09/09
5950
ModelAndView 详解
Spring中Model、ModelMap、ModelAndView理解和具体使用总结
在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型,作为模型数据的存储容器, 成为”隐含模型”。 也就是说在每一次的前后台请求的时候会随带这一个背包,不管你用没有,这个背包确实是存在的,用来盛放我们请求交互传递的值;关于这一点,spring里面有一个注解: @ModelAttribute :被该注解修饰的方法,会在每一次请求时优先执行,用于接收前台jsp页面传入的参数 例子:
全栈程序员站长
2022/09/07
1.7K0
springmvc之视图解析流程
发送请求地址为/springmvc/test时,会返回SUCCESS。而前面的视图配置会将SUCCESS转换为/WEB-INF/views/success.jsp。
西西嘛呦
2020/08/26
2860
《Spring实战》摘录 - 11
问题: #5.2.3-1 | 测试SpittleController处理针对“/spittles”的GET请求 回答:
用户1335799
2019/05/08
7760
《Spring实战》摘录 - 11
SpringMVC WebConfig配置视图解析器
在SpringMVC中,视图解析器(View Resolver)用于将逻辑视图名称(例如"home")转换为实际视图(例如JSP、Thymeleaf或FreeMarker模板)。通过使用视图解析器,我们可以将控制器中的逻辑视图名称与实际视图文件解耦,提高应用程序的可维护性和可扩展性。
堕落飞鸟
2023/05/14
8920
SpringMVC 解毒4
ViewResolver 视图解析器能够通过viewName视图名和locale用户区域获取View对象,从而渲染视图。 如果你想使用自定义的一个模板引擎,就得配置上相对应的ViewResolver。
zhangheng
2020/04/28
7010
SpringMVC视图nternalResourceView
SpringMVC 是一个流行的 Web 框架,它提供了一种强大的机制来处理 HTTP 请求和响应。在 SpringMVC 中,视图是用来生成响应的一部分。SpringMVC 视图包括多种类型,其中 InternalResourceView 是一种基于 JSP 的视图类型。
堕落飞鸟
2023/05/13
3520
Spring Web MVC框架(四) 视图和视图解析
在Spring中视图相关的两个接口是ViewResolver和View两个接口,ViewResolver用于视图名称和实际视图之间的映射,View接口用于准备和传递数据到实际的视图。
乐百川
2022/05/05
9180
第6章—渲染web视图—使用Apache Tiles视图定义布局
Tiles是一个免费的开源模板Java应用程序的框架。基于复合模式简化的用户界面的构建。对于复杂的网站仍是最简单、最优雅的方式与任何MVC技术一起工作。Struts2对Tiles提供了支持,如今Tiles发展已有13个年头,成为Apache的一个独立项目,我们可以单独使用Tiles来构建用户界面布局。
Dream城堡
2018/09/10
6450
第6章—渲染web视图—使用Apache Tiles视图定义布局
ModelAndView详解
亦或如下方法来构建你的ModelAndView对象 [java] view plain copy
全栈程序员站长
2022/09/09
7140
Spring MVC各组件近距离接触--下--04
前面两节主要介绍了Spring mvc中的HandlerMapping和Controller,下面来介绍一下mvc中的其他常见组件。
大忽悠爱学习
2022/08/23
4800
Spring MVC各组件近距离接触--下--04
Spring MVC各组件近距离接触--下下--05
org.springframework.web.serviet.view是SpringMVC中将原本可能存在于Dispatcherservlet中的视图渲染逻辑得以剥离出来的关键组件。
大忽悠爱学习
2022/08/23
9080
Spring MVC各组件近距离接触--下下--05
Spring 4 MVC 表单校验资源处理(带源码)
下一篇文章:Spring 4 MVC 视图解析器(XML JSON PDF等) 纯注解
明明如月学长
2021/08/27
5580
【小家Spring】Spring MVC容器的web九大组件之---ViewResolver源码详解---视图解析器ViewResolver详解
Spring的一个优秀之处在于,把view层技术与MVC框架的其他部分离开来。 例如,选择使用Velocity或者XSLT来代替已有的JSP方式只需要修改配置就可以实现。
YourBatman
2019/09/03
8950
【小家Spring】Spring MVC容器的web九大组件之---ViewResolver源码详解---视图解析器ViewResolver详解
《Spring实战》读书笔记-第6章 渲染Web视图
在《Spring实战》的书中是包括6.3 使用Apache Tiles视图定义布局和6.4 使用Thymeleaf这两个小节的,但是考虑到平时开发使用的比较少,就不进行介绍了,感兴趣的小伙伴们可以自行学习。
Java架构师必看
2020/04/10
1.2K0
SpringMVC详细笔记整合
原文链接: 1、SpringMVC——走出新手村 2、SpringMVC——初次见面 3、SpringMVC——走出新手村
Java学习
2018/07/25
9990
SpringMVC详细笔记整合
第6章—渲染web视图—使用Thymeleaf
长期以来,jsp在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thymeleaf是原生的,不依赖于标签库.它能够在接受原始HTML的地方进行编辑和渲染.因为它没有与Servelet规范耦合,因此Thymeleaf模板能进入jsp所无法涉足的领域.现在我们来看下如何使用Thymeleaf!
Dream城堡
2018/09/10
5040
第6章—渲染web视图—使用Thymeleaf
SpringMVC返回视图常见的 5 种方式,你会几种?| SpringMVC系列第7篇
当 http 请求被自定义的 controller 处理时,如何指定响应的页面呢?
路人甲Java
2021/07/23
3.7K0
Spring 4 MVC HelloWorld 纯注解方式(带源码)【超赞】
【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看】 【翻译 by 明明如月 QQ 605283073】 #项目下载地址:http://websystique.com/?
明明如月学长
2021/08/27
3810
SpringMVC知识点 总结
MVC模式使应用程序的不同方面(输入逻辑,业务逻辑 和 UI逻辑)分离,同时提供这些元素之间的松耦合。
SuperHeroes
2019/03/12
1.2K0
SpringMVC知识点 总结
相关推荐
ModelAndView 详解
更多 >
交个朋友
加入[架构及运维] 腾讯云技术交流站
云架构设计 云运维最佳实践
加入前端工作实战群
前端工程化实践 组件库开发经验分享
加入架构与运维趋势交流群
技术趋势前瞻 架构演进方向
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档