【问题标题】:HYBRIS - How components and slots work in JSP file?HYBRIS - JSP 文件中的组件和插槽如何工作?
【发布时间】:2016-06-21 10:34:19
【问题描述】:

最近我在使用 Hybris,我无法理解组件是如何工作的。

我知道如何创建和定义一个,如何将它们添加到我想要的页面等。但我不明白如何在jsp 文件中使用标签<cms: component>

在产品详细信息页面的插槽AddToCartSlot 中,我添加了更多组件。我试图像标准一样调用我的组件并评论他的行。

默认调用组件如下:

<cms:pageSlot position="AddToCart" var="component">
   <cms:component component="${component}" />
</cms:pageSlot>

所以我也尝试调用我的组件,但不起作用:

<cms:pageSlot position="MyComponent" var="component">
   <cms:component component="${component}" />
</cms:pageSlot>

所以我的台词评论和取消评论他的台词,所有组件都显示在页面上。 但是对我来说这没有任何意义,因为在标签cms:pageSlot 的位置属性中应该接收到插槽的 id 而不是组件的 id 以显示所有组件插槽。但是,将 id 设置为 AddToCart 而不是 AddToCartSlot 是所有组件都显示在页面上的唯一方式。

现在你会想“如果组件显示在 Web 上会出现什么问题?”,好吧,问题是这些组件没有通过与它们对应的 java 控制器(尽管在com.myStore.storefront.controllers.ControllerConstants.java 文件)。另外,我想了解它为什么不能正常工作。

我按照 Wki Hybris 的步骤进行操作,发现所有内容都按原样声明给另一个正常工作的自定义组件。我找不到差异,我不明白为什么不通过我的控制器,或者为什么标签不能像插槽的 id 那样工作,但是当我使用组件的标识符时它“工作”。

真的,任何想法都会有所帮助。

非常感谢。

【问题讨论】:

标签: java jsp jsp-tags hybris


【解决方案1】:

为了让 Hybris 使用它,控制器应该是这样的:

@Controller("CustomCMSImageComponentController")
@RequestMapping(value = ControllerConstants.CustomCMSImageComponent )// now the controller is mapped to "/view/CustomCMSImageComponentController"
public class CustomCMSImageComponentController extends AbstractCMSComponentController<CustomCMSImageComponentModel> {
    @Override
    protected void fillModel(final HttpServletRequest request, final Model model,
                       final CustomCMSImageComponentModelcomponent) {
    //here the spring Model(model method parameter) should be filled with what is needed to dynamically render in JSP
    }
}

Spring 使用@Controller 注解来实例化 CustomCMSImageComponentController 并将该实例(bean)保存在 spring 应用程序上下文。

在渲染 CustomCMSImageComponent 时,Hybris 在 Spring 应用程序上下文中搜索名称为“CustomCMSImageComponentController”的 bean,以便 找到与组件关联的控制器,如果没有找到任何内容,则将使用 DefaultCMSComponentController。

【讨论】:

    【解决方案2】:

    我还没有创建模板、页面或槽。我已经使用了 Hybris 在他的示例商店中带来的那个。我只创建了一个新组件CustomCMSImageComponent,就像来自CMSImageComponent 的副本。

    1. 在文件中定义新组件:mystorecore-items.xml

         <deployment table="CustomCMSImageComponent" typecode="20003"/>
      </itemtype>
      

    2. 为此组件创建一个新的控制器CustomCMSImageComponentController.java和一个视图customcmsimagecomponent.jsp

    3. 表明CustomCMSImageComponentController.java应该是ControllerConstants.java中这个组件的控制器

      字符串 CustomCMSImageComponent = _Prefix + CustomCMSImageComponentModel._TYPECODE + _Suffix; // NOSONAR

    4. AddToCartSlot(对应的impex中)创建这个组件的实例

    5. 构建项目、启动服务器、初始化 (HAC) 和同步 (HMC)

    昨天我发现为什么我使用这个标签时会显示所有组件:实际上这是插槽中的组件名称和页面中的插槽名称。所以这个问题就解决了。

    【讨论】:

      【解决方案3】:

      尝试以下方法:

      1. 同步目录。您可能一切正常,但在添加组件后可能忘记同步目录。这可能是微不足道的,但值得一试。
      2. 由于您创建了自己的组件,我假设您也为您的组件创建了一个 JSP(如果它扩展了 SimpleCMSComponent)

        在CMS Page Slot标签的var属性中使用不包括component字样的组件jsp文件的名称。

        如果我将我的 jsp 组件内容放在一个名为 mycartcomponent.jsp 的文件中,那么我会将它用作

        例如,

        <cms:pageSlot position="MyComponent" var="mycart">
           <cms:component component="${mycart}" />
        </cms:pageSlot>
        

      【讨论】:

      • 简单组件使用 SimpeCMSComponent 还是 JSPIncludeComponent 更好?
      • @FelipeKunzler 我是 hybris 新手,所以我真的无法回答你的问题,但我使用 SimpleCMSComponent 已经有一段时间了。
      【解决方案4】:

      您应该始终在 jsp 页面中使用内容槽名称来渲染组件(通过 insert_update ContentSlotName; 插入 impex 中的内容槽名称)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-06
        • 2018-08-25
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        • 2020-10-27
        • 2016-05-06
        • 2021-02-06
        相关资源
        最近更新 更多