【问题标题】:Migrate Struts-Tiles to Spring + tiles 3将 Struts-Tiles 迁移到 Spring + tile 3
【发布时间】:2015-01-08 16:46:58
【问题描述】:

我正在从 Strut1 + Tiles 项目迁移到 SpringMVC 和 Apache Tiles 3。我对 Struts1+Tiles 知之甚少,它太旧了,我被困在 Struts-tiles 中的 Controller 和 ComponentContext 中。根据 apache 网站的文档,它已被 ViewPreparer 和 AttributeContext 取代,但我不知道以下行的含义:
ComponentContext compContext=(ComponentContext)pageContext.getAttribute(ComponentConstants.COMPONENT_CONTEXT,PageContext.REQUEST_SCOPE);
ComponentConstants.COMPONENT_CONTEXT 是什么?以及如何将ComponentContext 更改为AttributeContext

请帮忙,谢谢。

【问题讨论】:

  • 我认为您将很难找到可以帮助您使用 Struts-1 天的 Tiles 的人。有关于重新使用tiles-1 配置tiles.apache.org/2.1/framework/migration/configuration.html 的文档,但在这里您希望将其移至删除了这种配置样式的tiles-3。也许如果您发布一个更大的示例,我可能会帮助您,我至少可以解释 AttributeContext 的作用,但我不能保证任何事情。
  • 感谢您的考虑,我正在维护一个非常大的项目,这里很难解释。在我看来,ComponentContext 存储了我们在切片定义中放入的值,我们可以通过上面的代码行在 Java 代码中获取它。在图块 3 中,不再使用 ComponentContext 并由 AttributeContext 取代。但我不知道如何在像 ComponentContext 这样的 Javacode 中获取它。请帮忙!

标签: java spring-mvc migration struts-1 apache-tiles


【解决方案1】:

Bidi,获取 AttributeContext 有两种方式:

第一个,如mck所说:通过请求范围的“org.apache.tiles.AttributeContext.STACK”键。但是,该值是一个包含 2 个 AttributeContext 类型元素的 STACK。我们需要的是第一个元素。恕我直言,这种方式是有限的,因为由于数据结构是一个堆栈,get也意味着根据FIFO规则从堆栈中移除,所以你只能使用一次对象。

我在我的项目中使用第二种方式。因为 ViewPreparer 的 execute() 方法已经有一个 AttributeContext 类型的参数,而且每次渲染页面时都会调用这个方法,所以你可以在覆盖的时候使用这个对象来做你想做的事情(或者放在 request 中)方法。 AttributeContext 只是键/值对的集合。通常,人们使用它来访问模板中的一些属性值,因此获取这些值并将它们放入请求可以节省开销。您还可以创建继承类的一些静态属性并为其设置值。

【讨论】:

    【解决方案2】:

    设置了 Spring-4 和 Tiles-3 集成(这里有 spring 文档以及一些很好的教程),那么你放入 spring 模型映射的属性将在你的 jsps 中可用,这不是与 AttributeContext 相关。

    另一方面,AttributeContext(基本上)仅用于保存属性映射。此处的属性在定义中定义,用于标识模板或字符串属性(通常在您的 xml 定义中声明),并带有角色、渲染器、表达式和/或值的属性。

    如果 AttributeContext 是你所追求的:你可以通过当前的 tilesContainer 获取它,并使用静态 TilesAccess 获取当前容器,例如

    TilesContainer tileContainer = TilesAccess.getCurrentContainer(request);
    AttributeContext attributeContext = tilesContainer.getAttributeContext(request);
    

    【讨论】:

    • 非常感谢,这里的代码在自定义标签代码中。它用于执行复杂的逻辑方法。我确实需要获取AttributeContext,但这里的“request”参数不是HttpServletRequest,而是org.apache.tiles.request.Request。我能得到的只是来自 jsp api 的 PageContext 以及它的 HttpServletRequest。你能给我“周围的好教程的数量”吗?
    • 除此之外,为了掌握更高级的方面,我会阅读tech.finn.no/2012/07/25/the-ultimate-view-tiles-3(该网站刚刚迁移,所以请原谅代码格式,我们正在努力)。
    • 您需要访问您的 ApplicationContext。这样你也可以调用 TilesAccess.getContainer(context),或者从 ServletRequest 创建你自己的 Tiles Request。或者您可以查看您的请求范围并在 TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME 键下找到您的“TilesContainer”
    • 那么,tiles的ApplicationContext和spring的ApplicationContext是不一样的吧?如何得到它?对不起,我对这个问题缺乏了解,但 apache 的文档不好
    • Tiles 的 ApplicationContext(是的,它们都有自己的版本)。对文档的任何改进都将不胜感激,没有比他/她更好的新视角了。
    【解决方案3】:

    比迪, 阅读http://tiles.apache.org/framework/tutorial/advanced/runtime.html

    特别是“使用 API 的运行时组合”部分。

    TilesContainer container = TilesAccess
            .getContainer(request.getSession().getServletContext());
    
    Request tilesRequest = new ServletRequest(
            container.getApplicationContext(), 
            request, 
            response);
    

    否则我建议你深入了解 Tiles 代码库,它不是复杂的代码,尤其是 TilesAccess、Request、ApplicationContext 的东西。

    【讨论】:

    • 提前谢谢,让我试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多