HYBRIS - 组件和插槽如何在JSP文件中工作?

时间:2016-06-21 10:34:19

标签: java jsp jsp-tags hybris

最近我和Hybris合作,我无法理解这些组件是如何工作的。

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

在产品详细信息页面的插槽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的position属性中应该收到一个槽的id而不是一个组件的id来显示所有组件槽。但是,将标识AddToCart而不是AddToCartSlot放在页面上显示所有组件的唯一方法。

现在你会想到如果组件在网络上显示会出现什么问题?&#39;好吧,问题是这些组件没有通过与它们对应的java控制器(尽管正在com.myStore.storefront.controllers.ControllerConstants.java文件中创建和声明。另外,我想了解为什么它不能正常工作。

我按照Wki Hybris的步骤进行操作,我发现所有内容都被声明为另一个正常工作的自定义组件。我找不到差异,我无法理解为什么不通过我的控制器或为什么标签不能像插槽的ID一样工作,但它&#34;工作&#34;当我使用组件的标识符时。

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

非常感谢。

4 个答案:

答案 0 :(得分:1)

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

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

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

  2. 为此组件CustomCMSImageComponentController.java和视图customcmsimagecomponent.jsp

  3. 创建新控制器
  4. CustomCMSImageComponentController.java

    中指出ControllerConstants.java应该是此组件的控制者

    String CustomCMSImageComponent = _Prefix + CustomCMSImageComponentModel._TYPECODE + _Suffix; // NOSONAR

  5. AddToCartSlot中创建此组件的实例(在相应的impex中)

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

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

答案 1 :(得分: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)保留在 春季申请背景。

渲染CustomCMSImageComponent时,Hybris在Spring应用程序上下文中搜索名为“CustomCMSImageComponentController”的bean后,以便 找到与组件关联的Controller,如果找不到任何东西,将使用DefaultCMSComponentController。

答案 2 :(得分:0)

尝试以下事项:

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

    使用组件jsp文件的名称,但不包括CMS页面标记标记的component属性中的单词var

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

    例如,

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

答案 3 :(得分:0)

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