Jsf p:仪表板关闭后保持分拣顺序

Jsf p:仪表板关闭后保持分拣顺序,jsf,primefaces,jsf-2,Jsf,Primefaces,Jsf 2,我想使用这个primefaces仪表板 dashboard.xhtml <div style="height:500px"> <h:form> <p:growl id="msgs" showDetail="true" /> <p:dashboard id="board" model="#{dashboardView.model}"> <p:ajax event="reorde

我想使用这个primefaces仪表板

dashboard.xhtml

<div style="height:500px">
    <h:form>
        <p:growl id="msgs" showDetail="true" />

        <p:dashboard id="board" model="#{dashboardView.model}">
            <p:ajax event="reorder" listener="#{dashboardView.handleReorder}" update="msgs" />

            <p:panel id="sports" header="Sports">
                <h:outputText value="Sports Content" />
            </p:panel>

            <p:panel id="finance" header="Finance">
                <h:outputText value="Finance Content" />
            </p:panel>

            <p:panel id="lifestyle" header="Lifestyle">
                <h:outputText value="Lifestyle Content"  />
            </p:panel>

            <p:panel id="weather" header="Weather">
                <h:outputText value="Weather Content" />
            </p:panel>

            <p:panel id="politics" header="Politics">
                <h:outputText value="Politics Content" />
            </p:panel>
        </p:dashboard>

        <div style="clear:both" />
    </h:form>
</div>

这是一个非常酷的功能

我做了一些拖拽

然后关闭浏览器的选项卡并再次打开,然后所有内容都变成默认值

我得设法维持秩序

可能以某种方式或任何其他方式使用cookies。有可能吗?如果有,怎么做

重要的是,应该为每个用户保存小部件的顺序。我指的是两个选项之一

  • 每个登录用户都可以在每个设备中看到此顺序
  • 不登录浏览器,但在打开新浏览器时,默认顺序应为。或者其他用户打开该订单,默认情况下应为

  • 当然不是最好的解决方案,而是一个解决方案:

    我想我应该将handleReorder(DashboardReorderEvent事件)中的事件保存到数据库或文件中。并在postconstruct init中加载订单。你觉得怎么样

    像在评论中写的那样编辑,无法为我序列化事件

    我的第二次尝试是这样的:

    public void handleReorder(DashboardReorderEvent event) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_INFO);
            message.setSummary("Reordered: " + event.getWidgetId());
            message.setDetail("Item index: " + event.getItemIndex() + ", Column index: " + event.getColumnIndex() + ", Sender index: " + event.getSenderColumnIndex());
    
            addMessage(message);
    
            serializeEvent(event);
        }
    
    serializeEvent方法没有序列化事件,因为我失败了,但它使用必要的信息序列化了一个对象

    private void serializeEvent(DashboardReorderEvent event) {
            String userName = userBean.getUserName();
            StackoverflowObject e = new StackoverflowObject(event);
            try {
                FileOutputStream fileOut =
                new FileOutputStream("c:/tmp/events"+userName+".txt");
                ObjectOutputStream out = new ObjectOutputStream(fileOut);
                out.writeObject(e);
                //out.writeObject(event.getWidgetId()+";"+  event.getItemIndex()+";"+ event.getColumnIndex());
                out.close();
                fileOut.close();
    
             } catch (Exception i) {
                i.printStackTrace();
             }
        }
    
    在postconstruct init中,您读取序列化对象并决定将小部件放置在何处。这将向您展示这个想法(现在快凌晨1点了,所以我只向您展示一个开始)

    。。对所有其他小部件执行相同的操作

    现在,您还有一个问题,即每个用户都要这样做。方法反序列化事件确定用户并为此用户读取正确的文件

    如果你问自己如何获得用户。在大多数情况下都是这样

    FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()
    
    如果您有一个类似于我的示例中的loginbean,您可以从您的userBean获得它

    编辑stackoverflowObject,如下所示

    public class StackoverflowObject implements Serializable{
    
    
    /**
     * 
     */
    private static final long serialVersionUID = -4921468076398836905L;
    private String widgetId;
    private int columnId;
    private int itenId;
    public StackoverflowObject(DashboardReorderEvent event) {
        this.setWidgetId(event.getWidgetId());
        this.setColumnId(event.getColumnIndex());
        this.setItenId(event.getItemIndex());
    }
    

    //+getter和setter

    当然不是最好的解决方案,而是一个解决方案:

    我想我应该将handleReorder(DashboardReorderEvent事件)中的事件保存到数据库或文件中。并在postconstruct init中加载订单。你觉得怎么样

    像在评论中写的那样编辑,无法为我序列化事件

    我的第二次尝试是这样的:

    public void handleReorder(DashboardReorderEvent event) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_INFO);
            message.setSummary("Reordered: " + event.getWidgetId());
            message.setDetail("Item index: " + event.getItemIndex() + ", Column index: " + event.getColumnIndex() + ", Sender index: " + event.getSenderColumnIndex());
    
            addMessage(message);
    
            serializeEvent(event);
        }
    
    serializeEvent方法没有序列化事件,因为我失败了,但它使用必要的信息序列化了一个对象

    private void serializeEvent(DashboardReorderEvent event) {
            String userName = userBean.getUserName();
            StackoverflowObject e = new StackoverflowObject(event);
            try {
                FileOutputStream fileOut =
                new FileOutputStream("c:/tmp/events"+userName+".txt");
                ObjectOutputStream out = new ObjectOutputStream(fileOut);
                out.writeObject(e);
                //out.writeObject(event.getWidgetId()+";"+  event.getItemIndex()+";"+ event.getColumnIndex());
                out.close();
                fileOut.close();
    
             } catch (Exception i) {
                i.printStackTrace();
             }
        }
    
    在postconstruct init中,您读取序列化对象并决定将小部件放置在何处。这将向您展示这个想法(现在快凌晨1点了,所以我只向您展示一个开始)

    。。对所有其他小部件执行相同的操作

    现在,您还有一个问题,即每个用户都要这样做。方法反序列化事件确定用户并为此用户读取正确的文件

    如果你问自己如何获得用户。在大多数情况下都是这样

    FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()
    
    如果您有一个类似于我的示例中的loginbean,您可以从您的userBean获得它

    编辑stackoverflowObject,如下所示

    public class StackoverflowObject implements Serializable{
    
    
    /**
     * 
     */
    private static final long serialVersionUID = -4921468076398836905L;
    private String widgetId;
    private int columnId;
    private int itenId;
    public StackoverflowObject(DashboardReorderEvent event) {
        this.setWidgetId(event.getWidgetId());
        this.setColumnId(event.getColumnIndex());
        this.setItenId(event.getItemIndex());
    }
    

    //+getter和setter

    为什么这“肯定”不是最好的解决方案?好主意。你能提供一个保存在文件中的示例代码吗?重要的是每个用户都应该保存订单。我可以给你写一个代码示例,但我想我今晚可以做(所以你必须等到今晚,在我工作的时候)。我还将为每个用户制作。重要的是为每个用户/浏览器/会话保存订单。如何将它写入每个设备的文件?为什么“肯定”不是最佳解决方案?好主意。你能提供一个保存在文件中的示例代码吗?重要的是每个用户都应该保存订单。我可以给你写一个代码示例,但我想我今晚可以做(所以你必须等到今晚,在我工作的时候)。我还将为每个用户制作。重要的是为每个用户/浏览器/会话保存订单。如何将它写入每个设备的文件?