1

我有一个带有两个日期字段和一个绑定到视图的重复控件的 XPage。当在每个日期字段中选择日期时,我的代码会创建一个日期范围并使用视图的“keys”参数仅返回两个日期之间视图中的文档。这完美地工作。当一个人离开视图然后返回时,就会出现问题。我有一个 pagerSaveState 控件,它应该将视图恢复到导航回视图时的状态,但会发生错误:com.ibm.xsp.FacesExceptionEx: Unknown or unsupported object type in Vector

视图的 XML 如下所示:

<xp:this.data>
    <xp:dominoView var="view1" viewName="ByDeliveryDate"
        keysExactMatch="true"
        keys="#{javascript:sessionScope.selectedDateRange}">

    </xp:dominoView>
</xp:this.data>

创建日期范围并将其放入 sessionScope 变量的 SSJS 如下所示:

function doDateRangeSearch() {

var vValStart = @Date(getComponent('StartDate').getValue());
if(vValStart==null||vValStart=='')vValStart = @Date(@Year(@Today()),1,1,0,0,0);

var vValEnd = @Date(getComponent('EndDate').getValue());
if(vValEnd==null||vValEnd=='')vValEnd = @Today();

var vDateRange = session.createDateRange(vValStart, vValEnd);
var vDateVector:java.util.Vector = new java.util.Vector();
vDateVector.addElement(vDateRange);
if(vDateVector.isEmpty())vDateVector = null;

sessionScope.selectedStartDate = vValStart;
sessionScope.selectedEndDate = vValEnd;
sessionScope.selectedDateRange = vDateVector;

/* reset the pager to the first page because if there is only one search 
 * result to display and if the pager was on anything except the first 
 * page the search result is not displayed
 */
var pager:com.ibm.xsp.component.xp.XspPager = getComponent("pager1"); 
pager.gotoPage(0);
}

谁能告诉我为什么返回视图会导致此错误?

更新:

根据 Panu 的建议,我将以下代码添加到视图的 queryOpen 事件中:

print("queryOpen: opening date range view");
if(sessionScope.selectedDateRange == null){
    print("selectedDateRange is null")
}else{
    for (var s in sessionScope.selectedDateRange) print(s);
}
print("queryOpen: completed");

在我的网络浏览器中,我导航到视图。该视图在第一页上显示最新文档,因为这是我在此会话中第一次访问该视图。这是控制台上出现的内容:18/10/2013 10:45:23 HTTP JVM:queryOpen:打开日期范围视图
18/10/2013 10:45:23 HTTP JVM:selectedDateRange 为空
18/10/2013 10: 45:23 HTTP JVM:queryOpen:完成

接下来,我在两个日期字段中选择了一些日期,然后单击了调用我的 SSJS 函数的按钮。搜索已正确执行,仅显示日期范围内的文档。这是控制台上出现的内容:
18/10/2013 10:45:48 HTTP JVM: queryOpen: 打开日期范围视图
18/10/2013 10:45:48 HTTP JVM: 01/08/2013 00:00:00 GDT - 18/10/2013 00:00:00 GDT
18/10/2013 10:45:48 HTTP JVM:查询打开:完成

我单击其中一个文档将其打开,然后返回视图。相反,我看到了错误页面。这是控制台上出现的内容:
18/10/2013 10:46:16 HTTP JVM: queryOpen: 打开日期范围视图
18/10/2013 10:46:16 HTTP JVM: null
18/10/2013 10:46: 16 HTTP JVM:queryOpen:完成
18/10/2013 10:46:16 HTTP JVM:com.ibm.xsp.webapp.FacesServlet$ExtendedServletException:com.ibm.xsp.FacesExceptionEx:Vector 中的对象类型未知或不受支持

基于上述情况, sessionScope.selectedDateRange 似乎仍然存在,但已丢失所有内容。

4

2 回答 2

2

我想出了如何让它工作。感谢 Julian 和 Panu 的建议。以下是我解决问题的方法。我把它贴在这里,以防其他人想做类似的事情。

首先,创建一个视图,其中第一个排好序的列包含日期。使其成为日期/时间列。

其次,在显示视图的自定义控件上,添加两个日期字段,如下所示:

开始日期字段:

<xe:djDateTextBox
    id="StartDate"
    defaultValue="#{javascript:sessionScope.selectedStartDate}"
    value="#{sessionScope.selectedStartDate}">
    <xp:this.converter>
        <xp:convertDateTime type="date"
            dateStyle="full">
        </xp:convertDateTime>
    </xp:this.converter>
</xe:djDateTextBox>

结束日期字段:

<xe:djDateTextBox
    id="EndDate"
    defaultValue="#{javascript:sessionScope.selectedEndDate}"
    value="#{sessionScope.selectedEndDate}">
    <xp:this.converter>
        <xp:convertDateTime type="date"
            dateStyle="full">
        </xp:convertDateTime>
    </xp:this.converter>
</xe:djDateTextBox>

请注意,这些字段绑定到 sessionScope 变量。

第三,将数据源添加到您的自定义控件中:

<xp:this.data>
        <xp:dominoView var="view1" viewName="ByDeliveryDate"
            keysExactMatch="true">

            <xp:this.keys><![CDATA[#{javascript:try {
    if(sessionScope.selectedStartDate == null) return;
    if(sessionScope.selectedStartDate == "") return;
    if(sessionScope.selectedEndDate == null) return;
    if(sessionScope.selectedEndDate == "") return;

    var vDateRange = session.createDateRange(sessionScope.selectedStartDate, sessionScope.selectedEndDate);
    return [vDateRange]

}catch(e){
    print("view filter error: " + e.toString())
}}]]></xp:this.keys>
        </xp:dominoView>
</xp:this.data>

最后,添加一个除了刷新视图之外什么都不做的按钮:

<xp:button value="Go" id="FirstColumnSearchButton"
    styleClass="lotusBtn goButton">
    <xp:eventHandler event="onclick"
        submit="false" refreshMode="partial" refreshId="viewHolder">
    </xp:eventHandler>
</xp:button>

如果需要,您还可以添加“重置”按钮以将视图恢复到原始状态:

<xp:button value="Reset"
    id="FirstColumnSearchResetButton">
    <xp:eventHandler event="onclick"
        submit="false" refreshMode="partial" refreshId="viewHolder">
        <xp:this.action><![CDATA[#{javascript:sessionScope.selectedStartDate = "";
sessionScope.selectedEndDate = "";}]]>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>

请注意,它不使用doDateRangeSearch()我在原始问题中发布的功能。

于 2013-10-24T10:14:03.910 回答
0

要调试将此代码作为keys参数的第一行:

print(sessionScope.selectedDateRange);

你也可以试试这些:

for (var s in sessionScope.selectedDateRange) print(s);
for (var s in sessionScope.selectedDateRange) print(typeof s);

这样,当您收到错误时,您将看到 Vector 中的内容。

可能 DateRange 已从 sessionScope 中消失,您需要再次将其放在那里。如果需要,您可以将其放在keys参数中。

更新

当您发现您的日期范围从 sessionScope 中消失时。发生这种情况是因为DateRange它是一个lotus.domino对象。它们是不可序列化的,并且不会保留在作用域变量中。作为一种解决方法,您可以将日期存储到 sessionScope 作为java.util.Date(或Calendar),并DateRange在每次访问页面时基于这些日期创建。

于 2013-10-18T09:01:57.460 回答