0

私はこれがバグではないことを知っています。しかし、提案が必要です。チェックされた行のチェックされた知識を失わないようにするにはどうすればよいですか?

JSF ページ:

<h:form prependId="false" id="searchUserFormTable" > 
                    <p:dataTable  id="selectUserTable" var="user" 
                    value="#{userListController.lazyDataModel}" paginator="true"
                    paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                    rows="2" paginatorPosition="bottom" rowKey="#{user}"
                    lazy="true"
                    rowsPerPageTemplate="2,10,20,30,40,50"
                    rendered="#{userListController.lazyDataModel != null}" selection="#{systemMessageEditController.receiverList}"
                    scrollable="true" scrollHeight="250" resizableColumns="false" >


                    <p:column selectionMode="multiple" width="18" />

                    <f:facet name="header">
                        <h:outputText value=" Users (#{userListController.lazyDataModel.rowCount})"  />
                    </f:facet>

                    <p:column filterBy="#{user.name}" headerText="Name" filterMatchMode="contains" width="80">
                        #{user.name}
                    </p:column>
                    <p:column filterBy="#{user.surname}" headerText="Surname" filterMatchMode="contains" width="80">
                        #{user.surname}
                    </p:column>   
                    <p:column headerText="Gender" width="80">
                        #{user.gender}
                    </p:column>

                    <p:column headerText="City" width="80">                             
                        #{user.address.city.name}
                    </p:column>

                    <p:column headerText="Status" width="80">                               
                        #{user.userStatus}
                    </p:column>

                    <p:column headerText="User Detail" width="80">
                        <h:link value="User Detail" outcome="/view/admin/usermanagement/userInfo.jsf">
                            <f:param name="userId" value="#{user.id}" />
                        </h:link>
                    </p:column>



                </p:dataTable>
                        <p:commandButton value="Tamam" oncomplete="userListDlg.hide();" update=":newMessageForm"></p:commandButton>
            </h:form>

すべてのコントローラー:

    @ManagedBean(name="systemMessageEditController")
@ViewScoped
public class SystemMessageEditController {

    @ManagedProperty(value = "#{systemMessageService}")
    SystemMessageService systemMessageService;

    @ManagedProperty(value = "#{securityBean}")
    SecurityBean securityBean;

    @ManagedProperty(value = "#{systemMessageReceiverService}")
    SystemMessageReceiverService systemMessageReceiverService;

    @ManagedProperty(value = "#{systemMessageAnswerService}")
    SystemMessageAnswerService systemMessageAnswerService;

    private SystemMessage systemMessage = new SystemMessage();

    private SystemMessageAnswer systemMessageAnswer = new SystemMessageAnswer();

    private SystemMessageReceiver systemMessageReceiver = new SystemMessageReceiver();

    private User[] receiverList;
    private boolean dummy;


    public void prepareToEdit(){
        systemMessage = systemMessageService.findById(systemMessage.getId());
    }

    public void prepareToSendMessage(){
        systemMessage = new SystemMessage();
        receiverList = null ;

    }

    public void sendMessage(){
        if(Util.isNotNull(systemMessage.getTitle())){
            boolean success = false;
            systemMessageAnswer.setUser(securityBean.getUser());
            systemMessage.getSystemMessageAnswerList().add(systemMessageAnswer);
            systemMessage.setUserSender(securityBean.getUser());
            systemMessageAnswer.setSystemMessage(systemMessage);
            if(!systemMessage.isSendAll()){
                addMessageReceiver();   
            }


            systemMessage = systemMessageService.save(systemMessage);

            systemMessageAnswer = new SystemMessageAnswer();

            success = true;
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, FacesUtils.getMessageByKey("systemmessage.send.success"), FacesUtils.getMessageByKey("systemmessage.send.success"));
            FacesContext.getCurrentInstance().addMessage("", message);
            RequestContext context = RequestContext.getCurrentInstance();
            context.addCallbackParam("success", success);
        }
        else{
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, FacesUtils.getMessageByKey("systemmessage.null.title"), FacesUtils.getMessageByKey("systemmessage.null.title"));
            FacesContext.getCurrentInstance().addMessage("", message);
        }
    }

    public void setRead(SystemMessage message){
        message.setReaded(true);
        systemMessageService.save(message);
    }


    public void addMessageReceiver(){
        for(User user : receiverList){
            SystemMessageReceiver messageReceiver = new SystemMessageReceiver();
            messageReceiver.setReceiver(user);
            messageReceiver.setSystemMessage(systemMessage);
            messageReceiver.setReaded(false);
            systemMessage.getSystemMessageReceiverList().add(messageReceiver);
        }

    }

    public void deleteMessage(){
        boolean success = false;
        systemMessageService.delete(systemMessageService.findById(systemMessage.getId()));

        success = true;
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, FacesUtils.getMessageByKey("systemmessage.delete.success"), FacesUtils.getMessageByKey("systemmessage.delete.success"));
        FacesContext.getCurrentInstance().addMessage("", message);
        RequestContext context = RequestContext.getCurrentInstance();
        context.addCallbackParam("success", success);
    }
    public void sendMessageAnswer(){
        systemMessageAnswer.setUser(securityBean.getUser());
        systemMessageAnswer.setSystemMessage(systemMessage);
        systemMessageAnswerService.save(systemMessageAnswer);

        if(!systemMessage.isSendAll()){
            systemMessage.setSystemMessageReceiverList(systemMessageService.getReceiverListOfMessage(systemMessage));
            for(SystemMessageReceiver systemMessageReceiver : systemMessage.getSystemMessageReceiverList()){
                if(!systemMessageReceiver.getReceiver().getId().equals(securityBean.getUser().getId())){
                    systemMessageReceiver.setReaded(false);
                    systemMessageReceiver.setShowed(false);
                    systemMessageReceiverService.save(systemMessageReceiver);
                }
            }
        }

        systemMessage.getSystemMessageAnswerList().add(systemMessageAnswer);

        systemMessageAnswer = new SystemMessageAnswer();
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, FacesUtils.getMessageByKey("systemmessage.send.success"), FacesUtils.getMessageByKey("systemmessage.send.success"));
        FacesContext.getCurrentInstance().addMessage("", message);
        RequestContext context = RequestContext.getCurrentInstance();
        context.addCallbackParam("success", true);
    }



    public SystemMessageService getSystemMessageService() {
        return systemMessageService;
    }

    public void setSystemMessageService(SystemMessageService systemMessageService) {
        this.systemMessageService = systemMessageService;
    }

    public SystemMessage getSystemMessage() {
        return systemMessage;
    }

    public void setSystemMessage(SystemMessage systemMessage) {
        ArrayList<String> fetchedAttributes = new ArrayList<String>();
        fetchedAttributes.add("systemMessageAnswerList");
        this.systemMessage = systemMessageService.loadWithFetchedAttributes(systemMessage.getId(),fetchedAttributes);
    }

    public SystemMessageAnswer getSystemMessageAnswer() {
        return systemMessageAnswer;
    }

    public void setSystemMessageAnswer(SystemMessageAnswer systemMessageAnswer) {
        this.systemMessageAnswer = systemMessageAnswer;
    }
    public SecurityBean getSecurityBean() {
        return securityBean;
    }
    public void setSecurityBean(SecurityBean securityBean) {
        this.securityBean = securityBean;
    }
    public SystemMessageReceiverService getSystemMessageReceiverService() {
        return systemMessageReceiverService;
    }
    public void setSystemMessageReceiverService(
            SystemMessageReceiverService systemMessageReceiverService) {
        this.systemMessageReceiverService = systemMessageReceiverService;
    }
    public SystemMessageAnswerService getSystemMessageAnswerService() {
        return systemMessageAnswerService;
    }
    public void setSystemMessageAnswerService(
            SystemMessageAnswerService systemMessageAnswerService) {
        this.systemMessageAnswerService = systemMessageAnswerService;
    }
    public SystemMessageReceiver getSystemMessageReceiver() {
        return systemMessageReceiver;
    }
    public void setSystemMessageReceiver(SystemMessageReceiver systemMessageReceiver) {
        this.systemMessageReceiver = systemMessageReceiver;
    }
    public User[] getReceiverList() {
        return receiverList;
    }
    public void setReceiverList(User[] receiverList) {
        this.receiverList = receiverList;
    }

あるページ番号を別のページ番号にジャンプしているときに、チェックされた情報を失います。いくつかの行をチェックした後、データテーブルで別のページ番号をジャンプし、古いページ番号に戻ります。チェックされた情報が失われ、何も変更されていません。

4

3 に答える 3

1

これが仕組み@ViewScopedです。BalusC からの次の回答を参照してください。

ビュー スコープの Bean は、同じビューを操作している限り存続します (つまり、Bean アクション メソッドで void または null を返します)。リンクをクリックするか、別のアクション結果を返すなどして、別のビューに移動すると、ビュー スコープの Bean はレンダリング レスポンスの終わりまでに破棄され、次のリクエストで使用できなくなります。

これは、あなたのような場合(選択を失う前に別のページにジャンプするというコメントの1つを読んだだけです。質問にも注意する必要があります!)、Beanが破棄されるため、元に戻るとdataTableビューが再び再構築されます。receiverListこれが空=>選択なしの理由です。

異なるビュー間を移動しているときにデータを保存する場合は、@ViewScoped よりも広い範囲の Bean を使用するか、単に選択を DB のテーブルに保存します。

編集

問題はrowKey属性にある可能性があります。現在のコードでは、ユーザー オブジェクトを指しています。この場合、このオブジェクトに適切な と 実装があることを確認しhashCodeequalsくださいtoStringuserクラスに実際にキーか何かがある場合は、に変更rowKeyする方が簡単rowKey="#{user.id}"です。

于 2013-01-09T09:39:57.163 に答える
0

おそらくajaxリクエストを介してデータを送信しているので、processdataTable自体であることを確認する必要があります

于 2013-01-09T09:22:43.490 に答える
0

ショーケースをチェックしてください。私はそれがあなたが望むように機能すると思います。

于 2013-01-09T09:15:34.057 に答える