HYBRIS - 组件和插槽如何在 JSP 文件中工作?
HYBRIS - How components and slots work in JSP file?
最近在用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
是所有组件都显示在页面上的唯一方法。
现在你会想'what the problem if the components are being displayed on the web?',嗯,问题是这些组件并没有通过对应的java控制器(尽管在com.myStore.storefront.controllers.ControllerConstants.java
文件)。另外想了解下为什么不能正常使用
我按照 Wki Hybris 的步骤进行操作,发现所有内容都按原样声明到另一个正常工作的自定义组件。我找不到差异,我不明白为什么不通过我的控制器,或者为什么标签不能像槽的 id 那样工作,但是当我使用组件的标识符时它 "works"。
真的,任何想法都会有所帮助。
非常感谢。
尝试以下操作:
- 同步目录。您可能一切都正确,但可能忘记在添加组件后同步目录。这可能是微不足道的,但值得一试。
既然您创建了自己的组件,我假设您也为您的组件创建了一个 JSP(如果它扩展了 SimpleCMSComponent)
使用组件 jsp 文件的名称,不包括 CMS Page Slot 标记的 var
属性中的单词 component
。
如果我的 jsp 组件内容在一个名为 mycartcomponent.jsp
的文件中,那么我会将其用作
例如,
<cms:pageSlot position="MyComponent" var="mycart">
<cms:component component="${mycart}" />
</cms:pageSlot>
我还没有创建模板、页面或广告位。我已经使用了 Hybris 在他的示例商店中带来的那个。我只创建了一个新组件 CustomCMSImageComponent
就像 CMSImageComponent
.
的副本
在文件中定义新组件:mystorecore-items.xml
<deployment table="CustomCMSImageComponent" typecode="20003"/>
</itemtype>
为此组件创建一个新控制器 CustomCMSImageComponentController.java
和一个视图 customcmsimagecomponent.jsp
表示 CustomCMSImageComponentController.java
应该是 ControllerConstants.java
中该组件的控制器
String CustomCMSImageComponent = _Prefix + CustomCMSImageComponentModel._TYPECODE + _Suffix; // 诺声纳
在AddToCartSlot
中创建该组件的实例(在相应的impex中)
构建项目、启动服务器、初始化 (HAC) 和同步 (HMC)
昨天我发现为什么我使用这个标签时显示所有组件:实际上是插槽中的组件名称和页面中的插槽名称。那么这个问题就解决了。
为了让 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
}
}
@Controller 注释被 Spring 用于实例化 CustomCMSImageComponentController 并将该实例 (bean) 保存在
spring 应用上下文。
渲染 CustomCMSImageComponent 时,Hybris 在 spring 应用程序上下文中搜索名称为 "CustomCMSImageComponentController" 的 bean,以便
找到与组件关联的控制器,如果没有找到任何内容,将使用 DefaultCMSComponentController。
You should always use content slot name in jsp page to render components(content slot name which is inserted in impex via insert_update ContentSlotName;)
最近在用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
是所有组件都显示在页面上的唯一方法。
现在你会想'what the problem if the components are being displayed on the web?',嗯,问题是这些组件并没有通过对应的java控制器(尽管在com.myStore.storefront.controllers.ControllerConstants.java
文件)。另外想了解下为什么不能正常使用
我按照 Wki Hybris 的步骤进行操作,发现所有内容都按原样声明到另一个正常工作的自定义组件。我找不到差异,我不明白为什么不通过我的控制器,或者为什么标签不能像槽的 id 那样工作,但是当我使用组件的标识符时它 "works"。
真的,任何想法都会有所帮助。
非常感谢。
尝试以下操作:
- 同步目录。您可能一切都正确,但可能忘记在添加组件后同步目录。这可能是微不足道的,但值得一试。
既然您创建了自己的组件,我假设您也为您的组件创建了一个 JSP(如果它扩展了 SimpleCMSComponent)
使用组件 jsp 文件的名称,不包括 CMS Page Slot 标记的
var
属性中的单词component
。如果我的 jsp 组件内容在一个名为
mycartcomponent.jsp
的文件中,那么我会将其用作例如,
<cms:pageSlot position="MyComponent" var="mycart"> <cms:component component="${mycart}" /> </cms:pageSlot>
我还没有创建模板、页面或广告位。我已经使用了 Hybris 在他的示例商店中带来的那个。我只创建了一个新组件 CustomCMSImageComponent
就像 CMSImageComponent
.
在文件中定义新组件:
mystorecore-items.xml
<deployment table="CustomCMSImageComponent" typecode="20003"/> </itemtype>
为此组件创建一个新控制器
CustomCMSImageComponentController.java
和一个视图customcmsimagecomponent.jsp
表示
中该组件的控制器CustomCMSImageComponentController.java
应该是ControllerConstants.java
String CustomCMSImageComponent = _Prefix + CustomCMSImageComponentModel._TYPECODE + _Suffix; // 诺声纳
在
AddToCartSlot
中创建该组件的实例(在相应的impex中)构建项目、启动服务器、初始化 (HAC) 和同步 (HMC)
昨天我发现为什么我使用这个标签时显示所有组件:实际上是插槽中的组件名称和页面中的插槽名称。那么这个问题就解决了。
为了让 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
}
}
@Controller 注释被 Spring 用于实例化 CustomCMSImageComponentController 并将该实例 (bean) 保存在 spring 应用上下文。
渲染 CustomCMSImageComponent 时,Hybris 在 spring 应用程序上下文中搜索名称为 "CustomCMSImageComponentController" 的 bean,以便 找到与组件关联的控制器,如果没有找到任何内容,将使用 DefaultCMSComponentController。
You should always use content slot name in jsp page to render components(content slot name which is inserted in impex via insert_update ContentSlotName;)