java - 使用磁贴动态组合页面

标签 java tiles apache-tiles

我是一个新的 tiles 用户,到目前为止我很喜欢它。但我现在面临一个问题,我不确定 tiles 是否是我手中实现目标的正确工具。

我想做的是创建一个在多个站点之间共享的通用注册表格。 此注册表单在每个站点上会略有不同。很明显,他们可以使用相同的 jsp 文件和 java 代码。我的目标是拥有一个 .properties 文件,我可以在其中配置哪些输入表单片段应该包含在表单中,哪些不应该包含(对于每个站点)。

有没有办法动态插入属性?

我创建了一个 View 准备器类。这样我就可以添加/覆盖现有属性。

public class TestViewPreparer extends ViewPreparerSupport {
    public void execute(TilesRequestContext tilesContext, AttributeContext attributeContext) throws PreparerException {
        Attribute attribute = new Attribute("/WEB-INF/views/search-panel/holiday-type.jsp");
        attributeContext.putAttribute("rfFragment", attribute);
    }
}

但这一次只能添加/覆盖一个属性。除了在模板文件中,我还必须为它们中的每一个添加以下行。

<tiles:insertAttribute name="rfFragment1" />
<tiles:insertAttribute name="rfFragment2" />
    //... etc

我正在寻找的更像是添加一个 Attribute 列表,并将它们包含在带有循环的模板行中。有点像这样:

    <tiles:useAttribute id="fragments" name="rfFragments" classname="java.util.List" />
    <c:forEach var="fragment" items="${fragments}">
        <tiles:insertAttribute value="${fragment}" flush="true" /></c:forEach>

我的问题是 AttributeContext 只能采用一个属性,不能采用属性列表。还是我错过了什么?

我希望我已经足够详细地描述了我的问题。

最佳答案

我目前正在处理类似的问题,尝试使用 ViewPreparer 在图 block 中创建动态导航菜单。根据下面链接的帖子,您可以通过 TilesRequestContext 传递 ArrayList,而不是使用 AttributeContext。我还没有完全让它自己工作,但也许这些链接会帮助将来寻找它的人(我花了很长时间才找到好的例子)

ViewPreparer example

Injecting the controller with Spring

我的实现:

public class HeaderController extends ViewPreparerSupport{
private EvalTypesService evalTypesService;

@Autowired
public HeaderController(EvalTypesService evalTypesService){
    this.evalTypesService = evalTypesService;
}

@Override
public void execute(TilesRequestContext tilesContext, AttributeContext attributeContext) throws PreparerException{
    List<EvalMasterEvaluationType> evalTypes = evalTypesService.getAllActiveEvalTypes();
    tilesContext.getRequestScope().put("evalTypes", evalTypes);
}

view.xml中的定义:

<definition name=".mainTemplate" template="/WEB-INF/views/main_template.jsp" preparer="myPathToController.HeaderController">
    <put-attribute name="header" value="/WEB-INF/views/tiles/header.jsp" />
    <put-attribute name="content" value="" />
    <put-attribute name="footer" value="/WEB-INF/views/tiles/footer.jsp" />
</definition>

分派(dispatch) servlet xml 中的 Tiles Beans:

<bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>

<bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/views/**/views.xml</value>
        </list>
    </property>
    <property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SimpleSpringPreparerFactory" /></bean>

在 header.jsp 磁贴中:

<div id="nav">
<c:out value="${msg}"></c:out>
<ul>
    <c:forEach var="type" items="${evalTypes}">
    <li><a href="<s:url value="/evalTypes/${type.id}" />"><c:out value="${type.name}" /></a></li>

    </c:forEach>
</ul>

关于java - 使用磁贴动态组合页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6371384/

相关文章:

java - 如何在 MyBatis Mapper XML 中连接一个 ResultHandler

java - 什么是辅助类?

java - 如何在 Spring MVC 3.0 中创建可重用组件

java - Struts2 Action 映射问题

Spring 3 MVC + Tiles 3 - 没有显示任何内容

spring - 服务器启动时获取 BeanCreationException。我正在使用 3.0.5 版的 spring 和 3.0.1 版的 apache tiles

Java - 语法让我难过

java - 重写自定义 ArrayAdapter 删除迭代器

java - 如何使用多个 Controller 或如何正确使用 Apache Tiles?

java - 如何使用 Spring Controller 解析 Apache Tiles 定义