2017-10-20 85 views
0

我解釋我的問題:爲什麼portlet是renderRequest.setAttribute返回最後一個變量?

我使用的是Liferay 6.1,我試圖理解Documents and Media控制面板的功能。

  • 在我的portlet視圖中,我有一個顯示文檔列表的表格,其中一個字段是修改日期。默認情況下,這個日期是文件修改日期。

  • 在java代碼中,我需要檢查這個日期字段(可選),如果它是空的,我保留舊代碼(顯示文檔的修改日期)如果它不是空的,那麼我想顯示它的值相反(可選日期的值)。

  • 我創建了一個文檔類型,並在稱爲date(可選)的文檔類型中添加了一個字段來手動添加日期。

  • 其中一件事我不明白,當試圖添加一個字段ddm-date類型的日期字段應該有一個默認值,它不能爲空 我錯了嗎?

我的第一個問題,如何設置ddm-date類型爲空?

  • 在創作現場的時候,我把沒有的首選值的CMS自動更改爲默認值,並在表格(添加新文件時)可選日期的選擇數據不包含我看到一個空的值(默認情況下它包含今天的日期)。

  • 所以我用文本字段作爲類型。

我的主要問題:

我顯示了可選的日期,但它會覆蓋所有的創建日期。在顯示屏中,我只獲取可選日期和最後一個。我解釋了何時從「文檔和媒體」控制面板添加文件,並使用可選日期字段(例如值爲「2012/08/01」),表中的所有值均由此值替換。

我用java代碼使用renderRequest.setAttribute 發送了我的變量,我用JSTL - Core <fmt: formatDate value = "$ {optionalDate}" pattern = "MMM yyyy" />標記在我的視圖中顯示了它。我的portlet也從MVCPortlet擴展而來。

爲什麼doView呈現renderRequest.setAttribute返回最後一個變量?

在我的Java代碼:

for(DLFileEntry file : listFiles){ 
    try { 
    Map<String, Fields> fieldsMap = file.getFieldsMap(file.getFileVersion().getFileVersionId()); 
     if(fieldsMap.values().size() <= 0) 
      listContextFiles.remove(file); 

    for (Fields fields : fieldsMap.values()) { 
    if(...){ 
     if(...){ 
     } 
     else{ 
     if(fields.get("optionaldate") != null) { 
     DateFormat dateFormat1 = new SimpleDateFormat("yyyy/MM/dd"); 
     String _optionalDate = (String) fields.get("optionaldate").getValue(); 
     Date optionalDate = dateFormat1.parse(_optionalDate); 
     file.setModifiedDate(optionalDate); 
     renderRequest.setAttribute("optionalDate", optionalDate); 
     System.out.println(file.getModifiedDate()); 
     listDate.add(dateFormat.format(file.getModifiedDate())); 
     } 
     else{ 
      renderRequest.setAttribute("optionalDate", file.getModifiedDate());     
      if(!listDate.contains(dateFormat.format(file.getModifiedDate()))){ 
      listDate.add(dateFormat.format(file.getModifiedDate())); 
      } 
     } 
     //other conditions 
    } 
... 

在我view.jsp的:

<liferay-ui:search-container iteratorURL="<%=actionURL%>" delta="10" 
     emptyResultsMessage="no-documents"> 
     <liferay-ui:search-container-results total="<%=list.size()%>" 
      results="<%=ListUtil.subList(list, 
             searchContainer.getStart(), 
             searchContainer.getEnd())%>" /> 
     <liferay-ui:search-container-row modelVar="file" 
      className="DLFileEntry"> 

      <!--other code--> 

      <liferay-ui:search-container-column-text name='date' 
       cssClass="txt-capitalize width-10"> 
       <fmt:formatDate value="${optionalDate}" pattern="MMM yyyy" /> 
      </liferay-ui:search-container-column-text> 

      <!--other code--> 

     </liferay-ui:search-container-row> 

    </liferay-ui:search-container> 

有沒有乾淨的方式來做到這一切的?

有人能告訴我我的代碼有什麼問題嗎?

+0

你好,我可以找到一個解決方案。我的問題仍然存在[擱置]。 –

+0

有人能告訴我我的代碼有什麼問題嗎? –

回答

1

如果放鬆所有的循環,首先在Java中,然後在JSP中,你基本上執行這些命令(按照這個順序),給予3個物體顯示:

renderRequest.setAttribute("optionalDate", someDate); 
renderRequest.setAttribute("optionalDate", someOtherDate); 
renderRequest.setAttribute("optionalDate", yetSomeOtherDate); 

其次是閱讀在JSP中值:

renderRequest.getAttribute("optionalDate"); 
renderRequest.getAttribute("optionalDate"); 
renderRequest.getAttribute("optionalDate"); 

由於setAttributepushToQueuegetAttributenextFromQueue(形象地說),你將只能得到yetSomeOtherDate爲你的JSP循環的所有迭代,自然。

您可以

  • 在你的JSP計算值,
  • 商店的對象不適合你的計算,基於對當前對象,
  • 商店使用對象的ID作爲屬性它的關鍵的一部分,例如"optionalDate-" + file.getId()而不僅僅是通用"optionalDate"。然後在JSP中使用相同的鍵構造來讀取正確的值。 (恕我直言,這是相當不雅,但可能務實爲你的用例)
相關問題