hybris程序搭建-总结文档.docx

目录

分页查询数据操作步骤 1

分页查询数据代码 3

扩展一个字段操作步骤 12

详情页操作步骤 14

条件搜索操作步骤 16

表单信息的录入与提交保存操作步骤 19

搭建B2C商城步骤 25

单击此处输入文字。

 

 

 

 

 

分页查询数据操作步骤

 

1. trainingStorefront工程中新建controller,例如(UserMessageController)仿照订单历史记录的controller代码编写,在类上加注解@Controller@RequestMapping并继承extends AbstractSearchPageController

2. 需要在trainingfacade工程中编写自己的facade,(DefaultUserMessageFacade),并将其注入到controller中并加上注解@Resource(name=defaultUserMessageFacade)

3. 将新建的DefaultUserMessageFacade注入到trainingfacades工程中的trainingfacades-spring.xml文件中

4. trainingcore工程中新建service,(UserMessageServiceUserMessageServiceImpl),并将UserMessageServiceImpl注入到trainingfacades-spring.xml中对应的facade引用处

<bean id="defaultUserMessageFacade" class="org.training.facades.userMessage.impl.DefaultUserMessageFacade" parent="defaultCheckoutFacade">
   <property name="modelService" ref="modelService" />
   <property name="userMessageService" ref="userMessageService" />
   <property name="userMessagePageListtConverter" ref="userMessagePageListtConverter" />
</bean>

5. trainingcore工程中新建dao(UserMessageDaoUserMessageDaoImpl),并将UserMessageDao注入到UserMessageServiceImpl并生成gettersetter方法,然后将UserMessageDaoImpl注入到trainingfacades-spring.xml中对应的facade引用处,并在trainingcore-spring.xml中加入servicedao的引用声明

<alias alias="userMessageService" name="userMessageService"/>
<bean id="userMessageService"
     class="org.training.core.userservice.impl.UserMessageServiceImpl"
>
   <property name="userMessageDao" ref="userMessageDao"/>
</bean>
<bean name="userMessageDao" class="org.training.core.userDao.impl.UserMessageDaoImpl">
   <property name="pagedFlexibleSearchService" ref="pagedFlexibleSearchService"/>
     <property name="flexibleSearchService" ref="flexibleSearchService"/>
   <property name="modelService" ref="modelService"/>
</bean>

6. controller 中调用facade中新建的方法,例如我的是getPagedUserMessageListForStatuses(PageableData pageableData)这个方法,

7. facade中加入Converter,例如userMessagePageListtConverter,并将其注入到trainingfacades-spring.xml,新建getPagedUserMessageListForStatuses()方法,在该方法中调用service中的方法getUserMessagePageList(pageableData);引入的转换器可命名为如下:

Converter<UserMessageCodeModel, UserMessageData> userMessagePageListtConverter

8. UserMessageServiceImpl中调用UserMessageDaoImplfindUserMessagePageListAndStore(pageableData)方法

9. UserMessageDaoImpl中编写SQL语句,注入

PagedFlexibleSearchService pagedFlexibleSearchService,并将其注入到trainingcore-spring.xml中

10. UserMessageDaoImpl中新建

findUserMessagePageListAndStore( final PageableData pageableData)方法,该方法又调用了getPagedFlexibleSearchService().search()方法,将查询结果查出保存到searchpagedata中并返回到相应的页面.

 

11. trainingfacade工程中新建populator,例如(UserMessagePopulator),实现 Populator<SOURCE, TARGET>,并将source改为UserMessageCodeModel,target改为 UserMessageData,并将UserMessagePopulator注入到trainingfacades-spring.xml

<alias name="defaultUserMessagePopulator" alias="userMessagePopulator"/>
<bean id="defaultUserMessagePopulator" class="org.training.facades.populators.userPopulator.UserMessagePopulator"  >
</bean>

12. 运行ant allhybrisserver.bat启动服务,如果构建成功并且服务能正常启动起来,说明注入populator是没问题的.

13. 因为一个converter可包含多个populator,所以,此时需要在trainingfacades-spring.xml中将defaultUserMessagePopulator加入到 userMessagePageListtConverter

<bean id="userMessagePageListtConverter" parent="abstractPopulatingConverter">
   <property name="targetClass" value="de.hybris.platform.commercefacades.order.data.UserMessageData"/>
   <property name="populators">
      <list>
         <ref bean="userMessagePopulator"/>
      </list>
   </property>
</bean>

14. 然后再次运行ant allhybrisserver.bat启动服务,如果都正常,说明converter引用populator成功

15. trainingStorefront工程中新建JSP页面,在页面上引入相关tagtemplate与分页组件,并用foreach遍历数据

<%@ taglib prefix="pagination" tagdir="/WEB-INF/tags/responsive/nav/pagination" %>
<%@ taglib prefix="nav" tagdir="/WEB-INF/tags/responsive/nav" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

分页组件

<div class="account-orderhistory-pagination">
    <nav:pagination top="true" msgKey="text.account.orderHistory.page" showCurrentPageInfo="true" hideRefineButton="true" supportShowPaged="${isShowPageAllowed}" supportShowAll="${isShowAllAllowed}" searchPageData="${searchPageData}" searchUrl="${searchUrl}"  numberPagesShown="${numberPagesShown}"/>
</div>

 

 

分页查询数据代码

 

1. UserMessageController

package org.training.storefront.controllers.pages.checkout.steps;

import de.hybris.platform.acceleratorstorefrontcommons.annotations.PreValidateQuoteCheckoutStep;
import de.hybris.platform.acceleratorstorefrontcommons.annotations.RequireHardLogIn;
import de.hybris.platform.acceleratorstorefrontcommons.breadcrumb.ResourceBreadcrumbBuilder;
import de.hybris.platform.acceleratorstorefrontcommons.controllers.ThirdPartyConstants;
import de.hybris.platform.acceleratorstorefrontcommons.controllers.pages.checkout.steps.AbstractCheckoutStepController;
import de.hybris.platform.acceleratorstorefrontcommons.controllers.util.GlobalMessages;
import de.hybris.platform.acceleratorstorefrontcommons.forms.PlaceOrderForm;
import de.hybris.platform.cms2.exceptions.CMSItemNotFoundException;
import de.hybris.platform.commercefacades.order.data.OrderHistoryData;
import de.hybris.platform.commercefacades.order.data.UserMessageData;
import de.hybris.platform.commerceservices.order.CommerceCartModificationException;
import de.hybris.platform.commerceservices.search.pagedata.PageableData;
import de.hybris.platform.commerceservices.search.pagedata.SearchPageData;
import de.hybris.platform.order.InvalidCartException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import de.hybris.platform.acceleratorstorefrontcommons.controllers.pages.checkout.steps.AbstractCheckoutStepController;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.training.facades.userMessage.UserMessageFacade;
import org.training.storefront.controllers.ControllerConstants;
import org.training.storefront.controllers.model.UserMessageForm;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;
@Controller
@RequestMapping(value = "/checkout/multi/userMessage")
public class UserMessageController extends AbstractCheckoutStepController {
    private final String QUOTE_DETAILS_CMS_PAGE = "userMessagePageID";
    private final String TEXT_ACCOUNT_PROFILE = "text.account.profile";
    private static final String BREADCRUMBS_ATTR = "breadcrumbs";
    @Resource(name = "accountBreadcrumbBuilder")
    private ResourceBreadcrumbBuilder accountBreadcrumbBuilder;
    @Resource(name="defaultUserMessageFacade")
    private UserMessageFacade userMessageFacade;
    @Override
    public String enterStep(Model model, RedirectAttributes redirectAttributes) throws CMSItemNotFoundException, CommerceCartModificationException {
        return null;
    }
    @Override
    public String back(RedirectAttributes redirectAttributes) {
        return null;
    }
    @Override
    public String next(RedirectAttributes redirectAttributes) {
        return null;
    }
    @RequestMapping(value="/toUserMessagePage")
    public String toUserMessagePage(final Model model) throws Exception    {
        System.out.print("555555555555555555555555");
        UserMessageForm userMessageForm = new UserMessageForm();
        model.addAttribute("userMessageForm",userMessageForm);
        storeCmsPageInModel(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        setUpMetaDataForContentPage(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        model.addAttribute(BREADCRUMBS_ATTR, accountBreadcrumbBuilder.getBreadcrumbs(TEXT_ACCOUNT_PROFILE));
        model.addAttribute(ThirdPartyConstants.SeoRobots.META_ROBOTS, ThirdPartyConstants.SeoRobots.NOINDEX_NOFOLLOW);
        return ControllerConstants.Views.Pages.MultiStepCheckout.UserMessagePage;
    }
    @RequestMapping(value = "/saveUserData")
    public String saveUserData(final Model model,final UserMessageForm userMessageForm) throws Exception   {
        System.out.println("name"+"11111111111111111111111111111111111111111111111111111111111111111111");
        boolean b = validateOrderForm(userMessageForm,model);
        if(b==false){
            model.addAttribute("userMessageForm",userMessageForm);
            storeCmsPageInModel(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
            setUpMetaDataForContentPage(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
            model.addAttribute(BREADCRUMBS_ATTR, accountBreadcrumbBuilder.getBreadcrumbs(TEXT_ACCOUNT_PROFILE));
            model.addAttribute(ThirdPartyConstants.SeoRobots.META_ROBOTS, ThirdPartyConstants.SeoRobots.NOINDEX_NOFOLLOW);
            return ControllerConstants.Views.Pages.MultiStepCheckout.UserMessagePage;
        }
        UserMessageData userMessageData = new UserMessageData();
        String longtime = String.valueOf(new Date().getTime());
        userMessageData.setUserMessageID(String.valueOf(new Date().getTime()));
        userMessageData.setBirthday(userMessageForm.getBirthday());
        userMessageData.setHobby(userMessageForm.getHobby());
        userMessageData.setMoney(userMessageForm.getMoney());
        userMessageData.setRemark(userMessageForm.getRemark());
        userMessageData.setSex(userMessageForm.getSex());
        userMessageData.setTelphone(userMessageForm.getTelphone());
        userMessageData.setUserName(userMessageForm.getUserName());

        model.addAttribute(new UserMessageForm());
        System.out.println("name:"+userMessageData.getUserName()+"11111111111111111111111111111111111111111111111111111111111111111111");
        userMessageFacade.doUserMessage(userMessageData);
        storeCmsPageInModel(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        setUpMetaDataForContentPage(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        model.addAttribute(BREADCRUMBS_ATTR, accountBreadcrumbBuilder.getBreadcrumbs(TEXT_ACCOUNT_PROFILE));
        model.addAttribute(ThirdPartyConstants.SeoRobots.META_ROBOTS, ThirdPartyConstants.SeoRobots.NOINDEX_NOFOLLOW);
//        return ControllerConstants.Views.Pages.MultiStepCheckout.UserMessageSuccessPage; //对应的接口里添加相应的变量  String MikeDetailPage = "pages/account/MKDetailPage";
        
return "redirect:" +  "/userMessagePageList/listusers"; //对应的接口里添加相应的变量  String MikeDetailPage = "pages/account/MKDetailPage";
    
}
    protected boolean validateOrderForm(final UserMessageForm userMessageForm, final Model model) {
//        final String securityCode = userMessageForm.getSecurityCode();
        
boolean invalid = false;
        //校验用户名
        
if(null==userMessageForm.getUserName() ||  "".equals(userMessageForm.getUserName())){
            GlobalMessages.addErrorMessage(model, "checkForm.error.userName");
            return invalid;
        }
        /**
         * 正则表达式:验证手机号
         */
         
final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
        if(!Pattern.matches(REGEX_MOBILE, userMessageForm.getTelphone())){
            GlobalMessages.addErrorMessage(model, "checkForm.error.mobile");
            return invalid;
         }
        //校验生日
        
final String REGEX_BRITHDAY = "YYYY/MM/DD";
        final String birthday = userMessageForm.getBirthday();
        if (null==birthday || "".equals(birthday) || birthday.length()!=10 || birthday.split("/").length!=3){
            GlobalMessages.addErrorMessage(model, "checkForm.error.birthday");
            return invalid;
        }
        String year = birthday.substring(0,4);
        String month = birthday.substring(5,7);
        String day = birthday.substring(8,10);
        if(Integer.parseInt(year)<1900 || Integer.parseInt(year)>2018){
            GlobalMessages.addErrorMessage(model, "checkForm.error.year");
            return invalid;
        }
        if(Integer.parseInt(month)<=0 || Integer.parseInt(month)>12){
            GlobalMessages.addErrorMessage(model, "checkForm.error.month");
            return invalid;
        }
        if(Integer.parseInt(day)<=0 || Integer.parseInt(day)>31){
            GlobalMessages.addErrorMessage(model, "checkForm.error.day");
            return invalid;
        }
        if(null==userMessageForm.getMoney() || "".equals(userMessageForm.getMoney())){
            GlobalMessages.addErrorMessage(model, "checkForm.error.money");
            return invalid;
        }
        if(null==userMessageForm.getHobby() || "".equals(userMessageForm.getHobby())){
            GlobalMessages.addErrorMessage(model, "checkForm.error.hobby");
            return invalid;
        }
//        if (getCheckoutFlowFacade().hasNoDeliveryAddress()) {
//            GlobalMessages.addErrorMessage(model, "checkout.deliveryAddress.notSelected");
//            invalid = true;
//        }
        
invalid = true;
        return invalid;
    }
    @RequestMapping(value = "/getUserMessage")
    @PreValidateQuoteCheckoutStep
    @RequireHardLogIn
    public String getUserMessage(@ModelAttribute("userMessageForm") final UserMessageForm userMessageForm, final Model model,
                   final HttpServletRequest request, final RedirectAttributes redirectModel) throws CMSItemNotFoundException, // NOSONAR
            
InvalidCartException, CommerceCartModificationException{
//        return redirectToOrderConfirmationPage(userMessageData);
        
return "";
    }
}

2. DefaultUserMessageFacade

package org.training.facades.userMessage.impl;

import de.hybris.platform.commercefacades.order.data.OrderHistoryData;
import de.hybris.platform.commercefacades.order.data.UserMessageData;
import de.hybris.platform.commercefacades.order.impl.DefaultCheckoutFacade;
import de.hybris.platform.commerceservices.search.pagedata.PageableData;
import de.hybris.platform.commerceservices.search.pagedata.SearchPageData;
import de.hybris.platform.converters.Converters;
import de.hybris.platform.core.enums.OrderStatus;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.core.model.user.CustomerModel;
import de.hybris.platform.servicelayer.dto.converter.Converter;
import de.hybris.platform.servicelayer.exceptions.UnknownIdentifierException;
import de.hybris.platform.servicelayer.model.ModelService;
import de.hybris.platform.store.BaseStoreModel;
import org.training.core.model.UserMessageCodeModel;
import org.training.core.userservice.UserMessageService;
import org.training.facades.populators.userPopulator.UserMessagePopulator;
import org.training.facades.userMessage.UserMessageFacade;

public class DefaultUserMessageFacade  extends DefaultCheckoutFacade implements UserMessageFacade {
    private ModelService modelService ;
    private UserMessageService userMessageService ;
    private UserMessagePopulator userMessagePopulator;
    @Override
    public ModelService getModelService() {
        return modelService;
    }
    @Override
    public void setModelService(ModelService modelService) {
        this.modelService = modelService;
    }
    private Converter<UserMessageCodeModel, UserMessageData> userMessagePageListtConverter;
    public Converter<UserMessageCodeModel, UserMessageData> getUserMessagePageListtConverter() {
        return userMessagePageListtConverter;
    }
    public void setUserMessagePageListtConverter(Converter<UserMessageCodeModel, UserMessageData> userMessagePageListtConverter) {
        this.userMessagePageListtConverter = userMessagePageListtConverter;
    }
    public UserMessageService getUserMessageService() {
        return userMessageService;
    }
    public void setUserMessageService(UserMessageService userMessageService) {
        this.userMessageService = userMessageService;
    }
    public UserMessagePopulator getUserMessagePopulator() {
        return userMessagePopulator;
    }
    public void setUserMessagePopulator(UserMessagePopulator userMessagePopulator) {
        this.userMessagePopulator = userMessagePopulator;
    }
    @Override
    public UserMessageCodeModel doUserMessage(UserMessageData userMessageData) {
        UserMessageCodeModel userMessageCodeModel = new UserMessageCodeModel();      userMessageCodeModel.setUserMessageID(userMessageData.getUserMessageID());
        userMessageCodeModel.setBirthday(userMessageData.getBirthday());
        userMessageCodeModel.setHobby(userMessageData.getHobby());
        userMessageCodeModel.setMoney(userMessageData.getMoney());
        userMessageCodeModel.setRemark(userMessageData.getRemark());
        userMessageCodeModel.setSex(userMessageData.getSex());
        userMessageCodeModel.setTelphone(userMessageData.getTelphone());
        userMessageCodeModel.setUserName(userMessageData.getUserName());
        modelService.save(userMessageCodeModel);
        return userMessageCodeModel;
    }
    @Override
    public SearchPageData<UserMessageData> getPagedUserMessageListForStatuses(final PageableData pageableData,final String userMessageID,final String userName)
    {
        final SearchPageData<UserMessageCodeModel> userMessageResults = getUserMessageService().getUserMessagePageList(pageableData,userMessageID,userName);
       return convertPageData(userMessageResults, getUserMessagePageListtConverter());
    }
    protected <S, T> SearchPageData<T> convertPageData(final SearchPageData<S> source, final Converter<S, T> converter)
    {
        final SearchPageData<T> result = new SearchPageData<T>();
        result.setPagination(source.getPagination());
        result.setSorts(source.getSorts());
        result.setResults(Converters.convertAll(source.getResults(), converter));
        return result;
    }
    private static final String USERMESSAGE_NOT_FOUND_FOR_USER_AND_BASE_STORE = "USERMESSAGE with userMessageID %s not found for current user in current BaseStore";

    @Override
    public UserMessageData getUsserMessageDetailByID(String userMessageID) {
        final UserMessageCodeModel userMessageCodeModel = userMessageService.getUsserMessageDetailByID(userMessageID);
        if (userMessageCodeModel == null)
        {
            throw new UnknownIdentifierException(String.format(USERMESSAGE_NOT_FOUND_FOR_USER_AND_BASE_STORE, userMessageID));
        }
        UserMessageData userMessageData = new UserMessageData();
        userMessagePopulator.populate(userMessageCodeModel,userMessageData);
        return userMessageData;
    }
}

3. trainingfacades-spring.xml

<alias name="defaultUserMessagePopulator" alias="userMessagePopulator"/>
<bean id="defaultUserMessagePopulator" class="org.training.facades.populators.userPopulator.UserMessagePopulator"  >
</bean>
<bean id="userMessagePageListtConverter" parent="abstractPopulatingConverter">
   <property name="targetClass" value="de.hybris.platform.commercefacades.order.data.UserMessageData"/>
   <property name="populators">
      <list>
         <ref bean="userMessagePopulator"/>
      </list>
   </property>
</bean>

4. UserMessageServiceImpl

package org.training.core.userservice.impl;

import de.hybris.platform.commercefacades.order.data.UserMessageData;
import de.hybris.platform.commerceservices.search.pagedata.PageableData;
import de.hybris.platform.commerceservices.search.pagedata.SearchPageData;
import de.hybris.platform.core.enums.OrderStatus;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.core.model.user.CustomerModel;
import de.hybris.platform.store.BaseStoreModel;
import org.training.core.model.UserMessageCodeModel;
import org.training.core.userDao.UserMessageDao;
import org.training.core.userservice.UserMessageService;
import static de.hybris.platform.servicelayer.util.ServicesUtil.validateParameterNotNull;
public class UserMessageServiceImpl implements UserMessageService {
    private UserMessageDao userMessageDao;
    public UserMessageDao getUserMessageDao() {
        return userMessageDao;
    }
    public void setUserMessageDao(UserMessageDao userMessageDao) {
        this.userMessageDao = userMessageDao;
    }
    public SearchPageData<UserMessageCodeModel> getUserMessagePageList( final PageableData pageableData,final String userMessageID,final String userName)
    {
        return getUserMessageDao().findUserMessagePageListAndStore( pageableData,userMessageID,userName);
    }
    @Override
    public UserMessageCodeModel getUsserMessageDetailByID(String userMessageID) {
        UserMessageCodeModel userMessageCodeModel = userMessageDao.getUsserMessageDetailByIDAndStore(userMessageID);
        return userMessageCodeModel;
    }
}

5. UserMessageDaoImpl

package org.training.core.userDao.impl;

import com.ctc.wstx.util.StringUtil;
import de.hybris.platform.commercefacades.order.data.UserMessageData;
import de.hybris.platform.commerceservices.search.flexiblesearch.PagedFlexibleSearchService;
import de.hybris.platform.commerceservices.search.flexiblesearch.data.SortQueryData;
import de.hybris.platform.commerceservices.search.pagedata.PageableData;
import de.hybris.platform.commerceservices.search.pagedata.SearchPageData;
import de.hybris.platform.core.enums.OrderStatus;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.core.model.user.CustomerModel;
import de.hybris.platform.servicelayer.internal.dao.AbstractItemDao;
import de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
import de.hybris.platform.store.BaseStoreModel;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.training.core.jalo.UserMessageCode;
import org.training.core.model.UserMessageCodeModel;
import org.training.core.userDao.UserMessageDao;
import java.util.*;
import static de.hybris.platform.servicelayer.util.ServicesUtil.validateParameterNotNull;

public class UserMessageDaoImpl extends AbstractItemDao implements UserMessageDao {
    private static final String SORT_ORDERS_BY_DATE = " ORDER BY {" + UserMessageCode.BIRTHDAY+ "} DESC, {" + UserMessageCode.PK + "}";
    private static final String SORT_ORDERS_BY_CODE = " ORDER BY {" + UserMessageCode.USERNAME + "}  DESC, {" + UserMessageCode.PK + "}";
    private static final String FIND_USERMESSAGE_BY_CUSTOMER_STORE_QUERY = "SELECT { PK  } FROM {  UserMessageCode  }" ;
    private static final String FIND_USERMESSAGE_DETAIL_BY_CUSTOMER_STORE_QUERY = "SELECT { PK  } FROM {  UserMessageCode  } where {UserMessageCode.userMessageID}=?userMessageID" ;
    private static final String FIND_BY_ID_OR_NAME = "WHERE 1=1 " + " AND {" + UserMessageCode.USERMESSAGEID + "} = ?userMessageID " + " AND {" + UserMessageCode.USERNAME + "} like ?userName ";
    private static final String FIND_BY_NAME = "WHERE 1=1 " +   " AND {" + UserMessageCode.USERNAME + "} like ?userName ";
    private static final String FIND_BY_ID = "WHERE 1=1 " + " AND {" + UserMessageCode.USERMESSAGEID + "} = ?userMessageID "  ;
    private PagedFlexibleSearchService pagedFlexibleSearchService;
    public PagedFlexibleSearchService getPagedFlexibleSearchService() {
        return pagedFlexibleSearchService;
    }
    public void setPagedFlexibleSearchService(PagedFlexibleSearchService pagedFlexibleSearchService) {
        this.pagedFlexibleSearchService = pagedFlexibleSearchService;
    }
    @Override
    public SearchPageData<UserMessageCodeModel> findUserMessagePageListAndStore( final PageableData pageableData,final String userMessageID,final String userName) {
        final Map<String, Object> queryParams = new HashMap<String, Object>();
        final List<SortQueryData> sortQueries;
        String filterClause = StringUtils.EMPTY;
        if(StringUtils.isEmpty(userMessageID) && StringUtils.isNotEmpty(userName)){
            filterClause = FIND_BY_NAME;
            queryParams.put("userName", "%"+userName+"%");
        }else if(StringUtils.isEmpty(userName) && StringUtils.isNotEmpty(userMessageID)){
            filterClause = FIND_BY_ID;

 queryParams.put("userMessageID", userMessageID);
        } else if(StringUtils.isNotEmpty(userName) && StringUtils.isNotEmpty(userMessageID)){
            filterClause = FIND_BY_ID_OR_NAME;
            queryParams.put("userName", "%"+userName+"%");
            queryParams.put("userMessageID", userMessageID);
        }
        sortQueries = Arrays .asList( createSortQueryData("byDate",  createQuery(FIND_USERMESSAGE_BY_CUSTOMER_STORE_QUERY, filterClause, SORT_ORDERS_BY_DATE)),
                        createSortQueryData("byOrderNumber",                              createQuery(FIND_USERMESSAGE_BY_CUSTOMER_STORE_QUERY, filterClause, SORT_ORDERS_BY_CODE)));
        return getPagedFlexibleSearchService().search(sortQueries, "byDate", queryParams, pageableData);
    }
    protected SortQueryData createSortQueryData(final String sortCode, final String query) {
        final SortQueryData result = new SortQueryData();
        result.setSortCode(sortCode);
        result.setQuery(query);
        return result;
    }
    protected String createQuery(final String... queryClauses) {
        final StringBuilder queryBuilder = new StringBuilder();
       for (final String queryClause : queryClauses)  {
            queryBuilder.append(queryClause);
        }
        return queryBuilder.toString();
    }
    @Override
    public UserMessageCodeModel getUsserMessageDetailByIDAndStore(final String userMessageID) {
        final Map<String, Object> queryParams = new HashMap<String, Object>();
        queryParams.put("userMessageID", userMessageID);
        final UserMessageCodeModel result = getFlexibleSearchService()  .searchUnique(  new FlexibleSearchQuery(FIND_USERMESSAGE_DETAIL_BY_CUSTOMER_STORE_QUERY ,  queryParams));
        return result;
    }
}

6. 

 

 

 

扩展一个字段操作步骤

1.trainingcore-item.xml文件中找到typegroup和相应的itemtype,例如

<typegroup name="UserMessage">
    <itemtype code="UserMessageCode" autocreate="true" generate="true" >
        <description>UserMessageTable</description>
        <deployment table="usermessageinfo" typecode="30001"></deployment>
        <attributes>
            <attribute qualifier="userMessageID" type="java.lang.String" >
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true" unique="true"/>
            </attribute>
            <attribute qualifier="userName" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="sex" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="birthday" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="money" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="hobby" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="telphone" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="remark" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
        </attributes>
    </itemtype>
</typegroup>

2. model中添加字段

            <attribute qualifier="userMessageID" type="java.lang.String" >
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true" unique="true"/>
            </attribute>

3. data中添加字段,打开trainingfacades-bean.xml文件,找到对应的data标签,添加相应的字段属性

<bean class="de.hybris.platform.commercefacades.order.data.UserMessageData">
   <property name="userMessageID" type="String" />
   <property name="userName" type="String"/>
   <property name="sex" type="String"/>
   <property name="birthday" type="String"/>
   <property name="money" type="String"/>
   <property name="hobby" type="String"/>
   <property name="telphone" type="String"/>
   <property name="remark" type="String"/>
</bean>

4. populator中也要加上相应的字段

public class UserMessagePopulator implements  Populator<UserMessageCodeModel, UserMessageData> {

.........(其他字段此处已省略)

...........

//userMessageCodeModel中的unique ID
if(null != userMessageCodeModel.getUserMessageID()){
    userMessageData.setUserMessageID(userMessageCodeModel.getUserMessageID());
}

}

5. 

6. 运行ant allhybrisserver.bat启动服务,登录http://127.0.0.1:9001,执行update,只勾选第一项

7. controller中设置该字段的值到data,facade层将data转为model

8. 在页面增加对应显示该字段的标签

<ycommerce:testId code="orderHistoryItem_orderDetails_link">
    <td>
       <a href="${userDetailURL}/${userMessage.userMessageID}">    ${userMessage.userMessageID}  </a>
    </td>

<spring:url value="/userMessagePageList/userDetail" var="userDetailURL"/>

 

 

 

 

 

 

 

详情页操作步骤

1. list列表页面上找到要加超链接的字段,加上超链接的URL地址以及所携带的参数,例如

<ycommerce:testId code="orderHistoryItem_orderDetails_link">
    <td>
       <a href="${userDetailURL}/${userMessage.userMessageID}">    ${userMessage.userMessageID}  </a>
    </td>

<spring:url value="/userMessagePageList/userDetail" var="userDetailURL"/>

2. controller中添加方法,例如userDetail();

@RequestMapping(value = "/userDetail/" + UserMessage_CODE_PATH_VARIABLE_PATTERN, method = RequestMethod.GET)
@RequireHardLogIn
public String userDetail(@PathVariable("userMessageID") final String userMessageID, final Model model,
                         final RedirectAttributes redirectModel) throws CMSItemNotFoundException{
    final UserMessageData userMessageData = userMessageFacade.getUsserMessageDetailByID(userMessageID);
    model.addAttribute("userMessageData", userMessageData);
    storeCmsPageInModel(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
    setUpMetaDataForContentPage(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
    model.addAttribute(BREADCRUMBS_ATTR, accountBreadcrumbBuilder.getBreadcrumbs(TEXT_ACCOUNT_PROFILE));
    model.addAttribute(ThirdPartyConstants.SeoRobots.META_ROBOTS, ThirdPartyConstants.SeoRobots.NOINDEX_NOFOLLOW);
    return ControllerConstants.Views.Pages.MultiStepCheckout.UserMessageDetailPage; //对应的接口里添加相应的变量  String MikeDetailPage = "pages/account/MKDetailPage";
}

private static final String UserMessage_CODE_PATH_VARIABLE_PATTERN = "{userMessageID:.*}";

 

3. controller中调用facade中的方法,例如getUsserMessageDetailByID()

private static final String USERMESSAGE_NOT_FOUND_FOR_USER_AND_BASE_STORE = "USERMESSAGE with userMessageID %s not found for current user in current BaseStore";
@Override
public UserMessageData getUsserMessageDetailByID(String userMessageID) {
    final UserMessageCodeModel userMessageCodeModel = userMessageService.getUsserMessageDetailByID(userMessageID);
    if (userMessageCodeModel == null)
    {
        throw new UnknownIdentifierException(String.format(USERMESSAGE_NOT_FOUND_FOR_USER_AND_BASE_STORE, userMessageID));
    }
    UserMessageData userMessageData = new UserMessageData();
    userMessagePopulator.populate(userMessageCodeModel,userMessageData);
    return userMessageData;
}

4. facade中注入populater,并生成gettersetter方法;并将userMessagePopulator注入到spring的配置文件中,例如在trainingfacades-spring.xml中加入userMessagePopulator属性

private UserMessagePopulator userMessagePopulator;

trainingfacades-spring.xml中加入userMessagePopulator属性

    <bean id="defaultUserMessageFacade" class="org.training.facades.userMessage.impl.DefaultUserMessageFacade" parent="defaultCheckoutFacade">
      <property name="modelService" ref="modelService" />
      <property name="userMessageService" ref="userMessageService" />
      <property name="userMessagePageListtConverter" ref="userMessagePageListtConverter" />
      <property name="userMessagePopulator" ref="userMessagePopulator"/>
</bean>

5. facade中调用service,service又调用了dao,dao从数据库中取出一个model对象来,facade层调用populaterpopulate()方法,model转为data,然后将data返回给controller,controllerdata中的数据存放到model,例如model.addAttribute("userMessageData", userMessageData);然后返回到详情页面,

6. 在详情页面使用 ${userMessageData.userMessageID}将数据展示出来

7. Service层的方法

@Override
public UserMessageCodeModel getUsserMessageDetailByID(String userMessageID) {
    UserMessageCodeModel userMessageCodeModel = userMessageDao.getUsserMessageDetailByIDAndStore(userMessageID);
    return userMessageCodeModel;
}

8. dao层的方法

@Override
public UserMessageCodeModel getUsserMessageDetailByIDAndStore(final String userMessageID) {
    final Map<String, Object> queryParams = new HashMap<String, Object>();
    queryParams.put("userMessageID", userMessageID);
    final UserMessageCodeModel result = getFlexibleSearchService()
            .searchUnique(
                    new FlexibleSearchQuery(FIND_USERMESSAGE_DETAIL_BY_CUSTOMER_STORE_QUERY ,
                            queryParams));
    return result;
}

private static final String FIND_USERMESSAGE_DETAIL_BY_CUSTOMER_STORE_QUERY = "SELECT { PK  } FROM {  UserMessageCode  } where {UserMessageCode.userMessageID}=?userMessageID" ;

9. 运行ant allhybrisserver.bat启动服务

10. 浏览器访问列表页https://electronics.local:9002/trainingstorefront/userMessagePageList/listusers然后再点击列表中的序号ID即可跳转到详情页面,可看到详情页面地址为例如

https://electronics.local:9002/trainingstorefront/electronics/zh/userMessagePageList/userDetail/1511489591750

 

 

条件搜索操作步骤

 

1. list列表页面添加搜索form表单,添加搜索框和搜索按钮,提交地址仍为分页列表的分页方法,注意:提交方式为get方式,以下是通过userMessageIDuserName这俩个字段来条件查询的,因为ID是唯一的,所以可以通过ID来查询唯一,也可通过name来模糊查询多个记录,也可以什么都不输入查询所有,也可同时输入两个字段后来查询满足此条件的唯一记录.

<div>
<form:form action="${searchUserMessageURL}" id="userMessageSearchForm" commandName="userMessageSearchForm" method="get">
    <spring:theme code="checkout.summary.userMessageID" />
    <input type="text" id="userMessageID" name="userMessageID"  value="${userMessageID}" />
    <spring:theme code="checkout.summary.userName" text="userName"/>
    <input type="text" id="userName" name="userName"   value="${userName}"  />
    <label>
        <input  class="btn btn-primary btn-place-order btn-block" type="submit" id="submit" value="搜索"  />
    </label>
</form:form>
</div>

在分页工具条的jsp标签内新定义一个提交的URLset标签,此时searchUrl引用该地址即可,地址仍为分页列表的方法地址,只是要带上新加的这两个参数

<spring:url value="/userMessagePageList/listusers" var="searchUserMessageURL"/>

<c:set var="searchUrl" value="/userMessagePageList/listusers?userName=${userName}&userMessageID=${userMessageID}"/>

<div class="account-orderhistory-pagination">
<nav:pagination top="true" msgKey="text.account.orderHistory.page" showCurrentPageInfo="true" hideRefineButton="true" supportShowPaged="${isShowPageAllowed}" supportShowAll="${isShowAllAllowed}" searchPageData="${searchPageData}" searchUrl="${searchUrl}"  numberPagesShown="${numberPagesShown}"/>
</div>

 

2. controller中分页列表的方法中新加这两个参数,并且把 required = false设为默认不需要,并且将传过来的两个参数addmodel中去,使得页面参数在分页时数据回显,

@RequestMapping(value = "/listusers", method = RequestMethod.GET)
@RequireHardLogIn
public String listusers(@RequestParam(value = "page", defaultValue = "0") final int page,
                     @RequestParam(value = "show", defaultValue = "Page") final ShowMode showMode,
                     @RequestParam(value = "sort", required = false) final String sortCode, final Model model,
                        @RequestParam(value = "userMessageID", required = false) final String userMessageID,
                        @RequestParam(value = "userName",  required = false) final String userName)
        throws CMSItemNotFoundException

model.addAttribute("userMessageID", userMessageID);
model.addAttribute("userName", userName);

final PageableData pageableData = createPageableData(page, 3, sortCode, showMode);
final SearchPageData<UserMessageData> searchPageData = userMessageFacade.getPagedUserMessageListForStatuses(pageableData,userMessageID,userName);
populateModel(model, searchPageData, showMode);

3. facade,service,dao层 的方法上均加上这两个字段的参数,例如service中的方法如下,

public SearchPageData<UserMessageCodeModel> getUserMessagePageList( final PageableData pageableData,final String userMessageID,final String userName)
{
    return getUserMessageDao().findUserMessagePageListAndStore( pageableData,userMessageID,userName);
}

4. dao层的方法中进行逻辑判断并且将传过来的参数的值进行赋值,拼接到where条件之后

@Override
public SearchPageData<UserMessageCodeModel> findUserMessagePageListAndStore( final PageableData pageableData,final String userMessageID,final String userName){
    final Map<String, Object> queryParams = new HashMap<String, Object>();
    final List<SortQueryData> sortQueries;
    String filterClause = StringUtils.EMPTY;
    if(StringUtils.isEmpty(userMessageID) && StringUtils.isNotEmpty(userName)){
        filterClause = FIND_BY_NAME;
        queryParams.put("userName", "%"+userName+"%");
    }else if(StringUtils.isEmpty(userName) && StringUtils.isNotEmpty(userMessageID)){
        filterClause = FIND_BY_ID;
        queryParams.put("userMessageID", userMessageID);
    } else if(StringUtils.isNotEmpty(userName) && StringUtils.isNotEmpty(userMessageID)){
        filterClause = FIND_BY_ID_OR_NAME;
        queryParams.put("userName", "%"+userName+"%");
        queryParams.put("userMessageID", userMessageID);
    }
    sortQueries = Arrays
            .asList(
                    createSortQueryData("byDate",
                            createQuery(FIND_USERMESSAGE_BY_CUSTOMER_STORE_QUERY, filterClause, SORT_ORDERS_BY_DATE)),
                    createSortQueryData("byOrderNumber",
                            createQuery(FIND_USERMESSAGE_BY_CUSTOMER_STORE_QUERY, filterClause, SORT_ORDERS_BY_CODE)));
    return getPagedFlexibleSearchService().search(sortQueries, "byDate", queryParams, pageableData);
}

private static final String FIND_BY_ID_OR_NAME = "WHERE 1=1 " + " AND {" + UserMessageCode.USERMESSAGEID + "} = ?userMessageID " + " AND {" + UserMessageCode.USERNAME + "} like ?userName ";
private static final String FIND_BY_NAME = "WHERE 1=1 " +   " AND {" + UserMessageCode.USERNAME + "} like ?userName ";
private static final String FIND_BY_ID = "WHERE 1=1 " + " AND {" + UserMessageCode.USERMESSAGEID + "} = ?userMessageID "  ;

private static final String FIND_USERMESSAGE_BY_CUSTOMER_STORE_QUERY = "SELECT { PK  } FROM {  UserMessageCode  }" ;

 

5. 运行ant all,起服务hybrisserver.bat debug

6. 在地址栏中输入访问列表页面的路径https://electronics.local:9002/trainingstorefront/userMessagePageList/listusers在打开的列表页面上输入相关条件进行搜索,即可查询出相应的记录并且带着分页显示的.

 

 

表单信息的录入与提交保存操作步骤

 

1. 新建JSP页面,并引入页面的模板与组件,userMessagePage.jsp的内容如下

<%@ page trimDirectiveWhitespaces="true"   contentType="text/html;charset=UTF-8"  %>
<%@ taglib prefix="template" tagdir="/WEB-INF/tags/responsive/template"%>
<%@ taglib prefix="cms" uri="http://hybris.com/tld/cmstags"%>
<%@ taglib prefix="multi-checkout" tagdir="/WEB-INF/tags/responsive/checkout/multi"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<spring:url value="/checkout/multi/summary/placeOrder" var="placeOrderUrl"/>
<spring:url value="/checkout/multi/termsAndConditions" var="getTermsAndConditionsUrl"/>
<%@ taglib prefix="ycommerce" uri="http://hybris.com/tld/ycommercetags" %>
<%--  --%>
<template:page pageTitle="${pageTitle}">
    <div class="account-section">
        <cms:pageSlot position="UserMessageComponent" var="feature" element="div" class="account-section-content">
            <cms:component component="${feature}" />
        </cms:pageSlot>
    </div>
</template:page>

2. 新建组件页面,内容如下userComponentPage.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page trimDirectiveWhitespaces="true"  contentType="text/html;charset=UTF-8" %>
  
<spring:url value="/checkout/multi/userMessage/saveUserData" var="saveUserDataURL"/>
<div>
<form:form action="${saveUserDataURL}" id="userForm" commandName="userMessageForm">
 
<div class="checkbox">
  <label>
   <spring:theme code="checkout.summary.userName" text="userName"/>
   <form:input type="text" id="userName" path="userName" />
   <input type="hidden" name="userNameNotNULL" id="userNameNotNULL" value="${model}">
  </label>
 </div>
 <div class="checkbox">
  <label>  <spring:theme code="checkout.summary.sex" text="sex"/>  </label>
  <label>
   <spring:theme code="checkout.summary.sex1" text="man"/>
   
<input type="radio" name="sex"  value="1" checked />
   <spring:theme code="checkout.summary.sex2" text="woman"/>
   
<input type="radio" name="sex" value="2" />
   <spring:theme code="checkout.summary.sex3" text="security"/>
   
<input type="radio" name="sex" value="3" />
  
</label>
 </div>
 <div class="checkbox">
  <label>
   <spring:theme code="checkout.summary.birthday" text="birthday"/>
   <form:input type="text" id="birthday" path="birthday"/>
   
<input type="hidden" name="birthdayNotNULL" id="birthdayNotNULL" value="${model}">
    </label>
</div>
 <div class="checkbox">
  <label>  <spring:theme code="checkout.summary.money" text="money"/>   </label>
   
<select type="select" id="money" name="money" />
   <option value="1">1000-2000</option>
   <option value="2"/>2000-3000</option>
   <option value="3"/>3000-4000</option>
   <option value="4"/>4000-5000</option>
   </select>
 </div>
 <div class="checkbox">
  <label>   <spring:theme code="checkout.summary.hobby" text="hobby"/>  </label>
  <label>  <spring:theme code="checkout.summary.hobby1" text="football"/>   </label>
  <label>  <input type="checkbox" id="hobby1" name="hobby" value="足球"/>  </label>
  <label>  <spring:theme code="checkout.summary.hobby2" text="basketball"/>   </label>
  <label>  <input type="checkbox" id="hobby2" name="hobby" value="篮球"/>  </label>
  <label> <spring:theme code="checkout.summary.hobby3" text="pingpang"/>   </label>
  <label>  <input type="checkbox" id="hobby3" name="hobby" value="乒乓球"/> </label>
  <label>  <spring:theme code="checkout.summary.hobby4" text="yumaoqiu"/>  </label>
  <label>  <input type="checkbox" id="hobby4" name="hobby" value="羽毛球"/>    </label>
  
</div>
  <div class="checkbox">
   <label>
    <spring:theme code="checkout.summary.telphone" text="telphone"/>    <form:input path="telphone" type="text" />
   
</label>
  </div>
  <div class="checkbox">
   <label>
     <spring:theme code="checkout.summary.remark" text="remark"/>  <form:input path="remark" type="text" />
   
</label>
  </div>
  <div class="checkbox">
   <label>
    <input  class="btn btn-primary btn-place-order btn-block" type="submit" id="submit" value="提交"  />
   </label>
   <label>   <input  class="btn btn-primary btn-place-order btn-block" type="reset" id="cancel"  value="取消"/>   </label>
 </div>
</form:form>
</div>

 

3. 当点击提交按钮时,将表单内容提交至UserMessageController,在接收到表单数据后要校验数据合法性,

@Controller
@RequestMapping(value = "/checkout/multi/userMessage")
public class UserMessageController extends AbstractCheckoutStepController {
    private final String QUOTE_DETAILS_CMS_PAGE = "userMessagePageID";
    private final String TEXT_ACCOUNT_PROFILE = "text.account.profile";
    private static final String BREADCRUMBS_ATTR = "breadcrumbs";
    @Resource(name = "accountBreadcrumbBuilder")
    private ResourceBreadcrumbBuilder accountBreadcrumbBuilder;
    @Resource(name="defaultUserMessageFacade")
    private UserMessageFacade userMessageFacade;
    @Override
    public String enterStep(Model model, RedirectAttributes redirectAttributes) throws CMSItemNotFoundException, CommerceCartModificationException {    return null;   }
    @Override
    public String back(RedirectAttributes redirectAttributes) {   return null;  }
    @Override
    public String next(RedirectAttributes redirectAttributes) {   return null;  }

    @RequestMapping(value="/toUserMessagePage")
    public String toUserMessagePage(final Model model) throws Exception    {
        UserMessageForm userMessageForm = new UserMessageForm();
        model.addAttribute("userMessageForm",userMessageForm);
        storeCmsPageInModel(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        setUpMetaDataForContentPage(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        model.addAttribute(BREADCRUMBS_ATTR, accountBreadcrumbBuilder.getBreadcrumbs(TEXT_ACCOUNT_PROFILE));
        model.addAttribute(ThirdPartyConstants.SeoRobots.META_ROBOTS, ThirdPartyConstants.SeoRobots.NOINDEX_NOFOLLOW);
        return ControllerConstants.Views.Pages.MultiStepCheckout.UserMessagePage;
    }

    @RequestMapping(value = "/saveUserData")
    public String saveUserData(final Model model,final UserMessageForm userMessageForm) throws Exception   {
        boolean b = validateOrderForm(userMessageForm,model);
        if(b==false){
            model.addAttribute("userMessageForm",userMessageForm);
            storeCmsPageInModel(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
            setUpMetaDataForContentPage(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
            model.addAttribute(BREADCRUMBS_ATTR, accountBreadcrumbBuilder.getBreadcrumbs(TEXT_ACCOUNT_PROFILE));
            model.addAttribute(ThirdPartyConstants.SeoRobots.META_ROBOTS, ThirdPartyConstants.SeoRobots.NOINDEX_NOFOLLOW);
            return ControllerConstants.Views.Pages.MultiStepCheckout.UserMessagePage;
        }
        UserMessageData userMessageData = new UserMessageData();
        String longtime = String.valueOf(new Date().getTime());
        userMessageData.setUserMessageID(String.valueOf(new Date().getTime()));
        userMessageData.setBirthday(userMessageForm.getBirthday());
        userMessageData.setHobby(userMessageForm.getHobby());
        userMessageData.setMoney(userMessageForm.getMoney());
        userMessageData.setRemark(userMessageForm.getRemark());
        userMessageData.setSex(userMessageForm.getSex());
        userMessageData.setTelphone(userMessageForm.getTelphone());
        userMessageData.setUserName(userMessageForm.getUserName());
        model.addAttribute(new UserMessageForm()); System.out.println("name:"+userMessageData.getUserName()+"1111111111111111111111111111111111111111111111111111111111111");
        userMessageFacade.doUserMessage(userMessageData);
        storeCmsPageInModel(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        setUpMetaDataForContentPage(model, getContentPageForLabelOrId(QUOTE_DETAILS_CMS_PAGE));
        model.addAttribute(BREADCRUMBS_ATTR, accountBreadcrumbBuilder.getBreadcrumbs(TEXT_ACCOUNT_PROFILE));
        model.addAttribute(ThirdPartyConstants.SeoRobots.META_ROBOTS, ThirdPartyConstants.SeoRobots.NOINDEX_NOFOLLOW);
//        return ControllerConstants.Views.Pages.MultiStepCheckout.UserMessageSuccessPage; //对应的接口里添加相应的变量  String MikeDetailPage = "pages/account/MKDetailPage";
        
return "redirect:" +  "/userMessagePageList/listusers"; //对应的接口里添加相应的变量  String MikeDetailPage = "pages/account/MKDetailPage";
    
}

4. controller中引入facade,并在spring配置文件中也引入(trainingfacades-spring.xml),并定义要跳转到的页面的pageID即页面模板的ID

    <bean id="defaultUserMessageFacade" class="org.training.facades.userMessage.impl.DefaultUserMessageFacade" parent="defaultCheckoutFacade">
      <property name="modelService" ref="modelService" />
      <property name="userMessageService" ref="userMessageService" />
      <property name="userMessagePageListtConverter" ref="userMessagePageListtConverter" />
      <property name="userMessagePopulator" ref="userMessagePopulator"/>
</bean>

 

5. controller调用UserFacade中的代码,data转为model,service调用save()方法进行保存到数据库

@Override
public UserMessageCodeModel doUserMessage(UserMessageData userMessageData) {
    UserMessageCodeModel userMessageCodeModel = new UserMessageCodeModel();
    userMessageCodeModel.setUserMessageID(userMessageData.getUserMessageID());
    userMessageCodeModel.setBirthday(userMessageData.getBirthday());
    userMessageCodeModel.setHobby(userMessageData.getHobby());
    userMessageCodeModel.setMoney(userMessageData.getMoney());
    userMessageCodeModel.setRemark(userMessageData.getRemark());
    userMessageCodeModel.setSex(userMessageData.getSex());
    userMessageCodeModel.setTelphone(userMessageData.getTelphone());
    userMessageCodeModel.setUserName(userMessageData.getUserName());
    modelService.save(userMessageCodeModel);
    return userMessageCodeModel;
}

6. UserFacade中引入service,并将service加入spring配置文件中(trainingfacades-spring.xml)(trainingfacades-beans.xml)

  <bean id="defaultUserMessageFacade" class="org.training.facades.userMessage.impl.DefaultUserMessageFacade" parent="defaultCheckoutFacade">
      <property name="modelService" ref="modelService" />
      <property name="userMessageService" ref="userMessageService" />
      <property name="userMessagePageListtConverter" ref="userMessagePageListtConverter" />
      <property name="userMessagePopulator" ref="userMessagePopulator"/>
</bean>

trainingfacades-beans.xml中的配置如下

<bean class="de.hybris.platform.commercefacades.order.data.UserMessageData">
   <property name="userMessageID" type="String" />
   <property name="userName" type="String"/>
   <property name="sex" type="String"/>
   <property name="birthday" type="String"/>
   <property name="money" type="String"/>
   <property name="hobby" type="String"/>
   <property name="telphone" type="String"/>
   <property name="remark" type="String"/>
</bean>

7. trainingcore-items.xml中创建数据库的data

<typegroup name="UserMessage">
    <itemtype code="UserMessageCode" autocreate="true" generate="true" >
        <description>UserMessageTable</description>
        <deployment table="usermessageinfo" typecode="30001"></deployment>
        <attributes>
            <attribute qualifier="userMessageID" type="java.lang.String" >
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true" unique="true"/>
            </attribute>
            <attribute qualifier="userName" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="sex" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="birthday" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="money" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="hobby" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="telphone" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
            <attribute qualifier="remark" type="java.lang.String">
                <persistence type="property"></persistence>
                <modifiers optional="true" write="true" read="true"/>
            </attribute>
        </attributes>
    </itemtype>
</typegroup>

8. trainingcore-spring.xml中加入i18n

<alias alias="userMessageService" name="userMessageService"/>
<bean id="userMessageService"
     class="org.training.core.userservice.impl.UserMessageServiceImpl"
>
   <property name="userMessageDao" ref="userMessageDao"/>
</bean>
<bean name="userMessageDao" class="org.training.core.userDao.impl.UserMessageDaoImpl">
   <property name="pagedFlexibleSearchService" ref="pagedFlexibleSearchService"/>
   
<property name="flexibleSearchService" ref="flexibleSearchService"/>
   <property name="modelService" ref="modelService"/>
</bean>

9. 创建完data,要运行ant all,起服务hybrisserver.bat  debug

10. 浏览器访问https://electronics.local:9002/trainingstorefront/checkout/multi/userMessage/toUserMessagePage页面即可填写用户信息进行提交,提交地址为https://electronics.local:9002/trainingstorefront/checkout/multi/userMessage/saveUserData

成功后到成功页面或列表页面

 

 

 

搭建B2C商城步骤

 

1. 解压文件HYBRISCOMM6500P_3-80003045.ZIP

2. 进入解压目录,cd C:\hybrise65003\hybris\bin\platform

3. 运行setantenv.bat设置环境变量

4. 执行 ant clean 出现下图

5. 选择develop回车,基本的开发模块如config等文件随即生成在hybris目录下了,bin目录同级.

6. 结果如下图,

7. 安装b2c商城,installer文件夹下执行(cd C:\hybrise65003\installer)install.bat -r b2c_acc

8. 生成扩展,回到bin目录下(cd C:\hybrise65003\hybris\bin\platform),运行ant modulegen,接下来会看到如下图所示,要求你选择模板为[accelerator]后回车然后选择输入新建项目名称以traing开头的,回车输入包名,默认新建的包名是org.traing,回车,你将看到如下结果

9. 控制台结果为:删除C:\hybrise65003\hybris\config/localextensions.xml这个文件中的yacceleratorfulfilmentprocess,yacceleratorcockpits,yacceleratorcore,yacceleratorfacades,yacceleratortest,yacceleratorinitialdata,yacceleratorstorefront,apparelstore(最后这个模块是与卖服装有关的,在这里也去掉)这几个部分,并且添加以下7个模块

<extension name='trainingfulfilmentprocess' />

    <extension name='trainingcockpits' />

    <extension name='trainingcore' />

    <extension name='trainingfacades' />

    <!--  <extension name='trainingtest' />  -->此行注掉,因为他里面有依赖服装的东西

    <extension name='traininginitialdata' />

<extension name='trainingstorefront' />

10. 重新运行ant clean all

11. 初始化数据,运行ant initialize -Dtenant=master(参数为主线程)

12. 启动服务运行hybrisserver.bat

13. 浏览器访问https://electronics.local:9002/trainingstorefront打开商城首页如图

猜你喜欢

转载自blog.csdn.net/baidu_20876831/article/details/79593920
今日推荐