【问题标题】:Spring load and concatenate views弹簧加载和连接视图
【发布时间】:2015-03-15 13:28:50
【问题描述】:

我正在将我的项目从 CodeIgniter 切换到 Spring。
我在 CodeIgniter 中可以做的事情是依次加载多个视图并创建一个新视图。
例如,假设我的<head> 标记内的所有内容在所有页面中都是相同的,但<title> 除外。我可以简单地做$this->load->view('header', $header_data); 其中header 代表视图名称,$header_data 代表一个包含标题值的数组。

但是在 Spring 中,我的控制器执行以下操作

@Controller
@RequestMapping("/")
public class IndexController
{
    @RequestMapping(method = RequestMethod.GET)
    public String index(ModelMap model)
    {
        model.addAttribute("title", "Home");
        return "index";
    }
}

我似乎无法像使用 php 那样分别加载页眉、正文和页脚,而且我无法将不同的变量传递到每个单独的视图中。
春天有什么办法可以做到吗?任何示例或链接将不胜感激。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    在 Java 世界中,一个页面(视图)是从一个或多个模板生成的。模板(通常)是一个文件,例如 JSP、HTML、XHTML 等。大多数应用程序要求页面遵循某种常见布局,例如页眉、页脚、侧边栏等。这可以通过使用一些模板来描述布局,然后使用特定于页面的模板来呈现实际的页面内容。使用这种方法,页面之间的任何共同点(具有相似的布局)都会在布局模板中编码,然后由特定于页面的模板填充。

    可以使用两种不同的方法之一来实现布局 - DecorationComposition。您(需要)使用哪种方法取决于您使用的view technology(而且数量太多)。例如,如果您使用纯基于 JSP 的模板,您可以使用 <jsp:include /> 包含来自其他模板的常见页面元素,这是 Composition 的一种形式,因为视图是由各种模板组合FreeMarkerVelocity 是另外两种流行的视图技术,它们提供基于 Composition 的布局。相比之下,TilesSiteMeshThymeleaf 提供基于 Decoration 的布局,其中页面模板只需声明它们使用的布局,然后框架装饰具有通用布局元素的页面内容。

    您应该尝试使用一些框架来确定最适合您的框架。从您提供的示例中,您可能会更好地使用基于 Decoration 的框架,如 Tiles、SiteMesh 或 Thymeleaf,因此您可能想先探索这些。

    【讨论】:

    • 谢谢。我最终使用了 SiteMesh,它完全符合我的要求!
    【解决方案2】:

    使用 Spring MVC,您不会被锁定在特定的视图技术上。这与您的问题有何关系,这意味着您可以将 Spring MVC 与 Apache Tiles 集成,这是一个免费的开源模板,可简化用户界面的开发。

    这是一篇带有示例源的好文章,解释了集成和好处http://java.dzone.com/articles/spring-mvc-tiles-3-integration。简而言之,图块将帮助您定义页面的基本模板,并为您提供通过单个响应交换动态部分的方法。以下示例图块定义定义了一个应该不言自明的模板

    <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE tiles-definitions PUBLIC  
            "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"  
            "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
    <tiles-definitions>
    
        <definition name="DefaultTemplate" 
          template="/WEB-INF/views/template/SiteTemplate.jsp">
            <put-attribute name="title"     value="Home" />
            <put-attribute name="header"    value="/WEB-INF/views/template/header.jsp" />
            <put-attribute name="menu"      value="/WEB-INF/views/template/menu.jsp" />
            <put-attribute name="body"      value="" />
            <put-attribute name="footer"    value="/WEB-INF/views/template/footer.jsp" />
        </definition>
    
    </tiles-definitions>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2010-10-21
      相关资源
      最近更新 更多