簡體   English   中英

異常后保持對話(在Pages.xml中處理)

[英]Maintain Conversation After Exception (Handled in Pages.xml)

我正在一個我最初沒有開始的項目中工作,所以有很多工件和約定我需要付出大量努力才能更改。 無論如何,這就是問題所在。 我需要將多個文件上傳(在“主”父頁面上正在編輯的實體的“孩子”)上傳到服務器上,以便在用戶提交時將其發送到其他地方。 上載的文件還包括用戶輸入的元數據。 我想做到這一點的最好方法是渲染一個“對話”,該對話具有一個iframe進行上傳並具有元數據的輸入。 然后,我創建了Seam的多部分過濾器的覆蓋(使用安裝優先級),該過濾器使用Apache文件上傳jar和自定義請求包裝器,該包裝器將我的信息攜帶到服務器上的操作調用中。 除非我將異常從過濾器中拋出,否則一切都會順利進行,例如,如果請求大小太大。 異常是由pages.xml聲明捕獲並處理的。

<exception class="org.jboss.seam.web.FileUploadException">
     <redirect view-id="#{facesContext.externalContext.requestServletPath}">
          <message severity='ERROR'>#{org.jboss.seam.handledException.message}</message> 
     </redirect>
</exception>

當我通常在對話框框架中提交表單時,框架中的對話(根據我的意願)仍然存在,當捕獲到異常時,我得到了一個新對話(如我所願)。 我希望通過框架的全局消息區域中顯示的異常傳遞的錯誤消息,但是我需要保持與以前相同的對話,因為在對話框中添加的“孩子”是“父”實體的孩子在主頁上。 這是框架代碼中的表格。 我嘗試了s:button(不提交表單),嘗試過的參數以及嘗試了帶有對話ID的隱藏輸入。

<h:form id="attachmentModalForm" enctype="multipart/form-data" autocomplete="off" style="background-color: #FFFFFF;">
     <ui:include src="layout/messages.xhtml" />
     <div id="attachmentModalMain" class="modalMain">
          <s:decorate id="attachmentDescriptionDecoration" template="layout/edit.xhtml" styleClass="twoCol">
               <ui:define name="label">#{messages['contents.attachmentDialog.label.description']}<s:span styleClass="required">*</s:span></ui:define>
               <h:inputText id="attachmentDescription" value="#{attachmentAction.description}" styleClass="textbox" />
          </s:decorate>
          <s:decorate id="attachmentFileDecoration" template="layout/edit.xhtml" styleClass="twoCol">
               <ui:define name="label">#{messages['contents.attachmentDialog.label.file']}<s:span styleClass="required">*</s:span></ui:define>
               <input id="attachmentFile" name="attachmentFile" type="file" />
          </s:decorate>
     </div>
     <div id="attachmentModalSubmit" class="modalSubmit">
          <h:commandButton id="attachmentSubmitButton" value="#{messages['action.text.submit']}" action="#{attachmentAction.addAttachment()}" onclick="attachmentSubmit();" />
          <button id="attachmentCancelButton" type="button" value="#{messages['action.text.cancel']}" onclick="window.parent.hideAttachmentModal();">#{messages['action.text.cancel']}</button>
     </div>
     <input type="hidden" name="cid" value="#{conversation.id}" />
</h:form>

這是覆蓋Seam多部分過濾器的過濾器。

package XXXXXXXXXXXXX.attachment;  

import java.io.File;  
import java.io.IOException;  
import java.rmi.server.UID;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  

import javax.servlet.FilterChain;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  

import org.apache.commons.fileupload.FileItem;  
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;  
import org.apache.commons.fileupload.FileUploadException;  
import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
import org.apache.commons.fileupload.servlet.ServletFileUpload;  
import org.jboss.seam.ScopeType;  
import org.jboss.seam.annotations.Install;  
import org.jboss.seam.annotations.Name;  
import org.jboss.seam.annotations.Scope;  
import org.jboss.seam.annotations.intercept.BypassInterceptors;  
import org.jboss.seam.annotations.web.Filter;  
import org.jboss.seam.web.AbstractFilter;  

/** 
* This filter is used to override Seam's multipart filter so that we 
* can have multiple temporary files on the server cued and ready to 
* go to XXXXXXXXX. It uses the Apache Commons FileUpload objects to 
* handle the parsing of the request and the temporary files. 
* 
*/  
@Scope(ScopeType.APPLICATION)  
@Name("org.jboss.seam.web.multipartFilter")  
@Install(precedence = Install.APPLICATION)  
@BypassInterceptors  
@Filter(within={"org.jboss.seam.web.ajax4jsfFilter", "org.jboss.seam.web.exceptionFilter"})  
public class MEDWareMultipartFilter extends AbstractFilter {  

    // This is unused, we always want temp files since we are caching before upload to XXXXXXXXX.  
    // Leaving it in to mirror Seam's multipart filter, in case it gets set from the components.xml.  
    @SuppressWarnings("unused") private boolean createTempFiles = true;  
    private int maxRequestSize = -1;  
    private String acceptedFileExtensions = "txt,pdf,doc,docx,xls,xlsx";  

    public void setCreateTempFiles(boolean createTempFiles) { }  

    public void setMaxRequestSize(int maxFileSize) {  
        this.maxRequestSize = maxFileSize;  
    }  

    public String getAcceptedFileExtensions() {  
        return acceptedFileExtensions;  
    }  

    public void setAcceptedFileExtensions(String acceptedFileExtensions) {  
        this.acceptedFileExtensions = acceptedFileExtensions;  
    }  

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  

        if (!(response instanceof HttpServletResponse)) {  
            chain.doFilter(request, response);  
            return;  
        }  

        HttpServletRequest httpRequest = (HttpServletRequest) request;  

        if (ServletFileUpload.isMultipartContent(httpRequest)) {  
            File repository = (File) this.getServletContext().getAttribute("javax.servlet.context.tempdir");  
            DiskFileItemFactory factory = new DiskFileItemFactory(0, repository);  
            ServletFileUpload upload = new ServletFileUpload(factory);  
            upload.setSizeMax(maxRequestSize);  

            List<FileItem> formItems = null;  

            try {  
                formItems = upload.parseRequest(httpRequest);  
            } catch (SizeLimitExceededException slee) {  
                throw new org.jboss.seam.web.FileUploadException("File size excededs maximum allowed.", slee);  
            } catch (FileUploadException fue) {  
                throw new org.jboss.seam.web.FileUploadException("Error uploading file.", fue);  
            }  

            Map<String, String> parameters = new HashMap<String, String>();  
            Map<String, File> fileParameters = new HashMap<String, File>();  

            if (formItems != null && formItems.size() > 0) {  
                for (FileItem item : formItems) {  
                    if (item.isFormField()) {  
                        parameters.put(item.getFieldName(), item.getString());  
                    } else {  
                        String fileName = item.getName();  

                        // This is for IE7 (and Safari?) which sends the whole path.  
                        fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);  

                        if (!MyMultipartRequestUtils.isValidFileType(acceptedFileExtensions, fileName)) {  
                            throw new org.jboss.seam.web.FileUploadException("The file type is not an accepted file type.");  
                        }  

                        File tempFile = null;  
                        try {  
                            tempFile = File.createTempFile(new UID().toString().replace(":", "-"), ".upload");  
                            tempFile.deleteOnExit();  
                            item.write(tempFile);  
                        } catch (Exception e) {  
                            throw new org.jboss.seam.web.FileUploadException("Error uploading file. Could not write file to server.");  
                        }  
                        fileParameters.put(fileName, tempFile);  
                    }  
                }  
            }  
            MyMultipartRequestWrapper requestWrapper = new MyMultipartRequestWrapper(httpRequest, parameters, fileParameters);  
            chain.doFilter(requestWrapper, response);  
        } else {  
            chain.doFilter(request, response);  
        }  
    }  

}  

因此,重申一下,如果我使用框架上傳文件,那么一切正常,框架繼續進行相同的對話,將每個孩子添加到父級,如果我上傳的文件太大,則會在全局消息中得到正確的消息框的最大面積,但是對話會增加,然后顯然會將子級添加到新對話中的新父實體中。 任何幫助將不勝感激。

我剛剛在自定義請求包裝器中添加了一個字段,以攜帶要處理的所有異常,然后在

#{attachmentAction.addAttachment()}

動作調用進一步拉高了請求鏈。 現在一切正常,我只是從那里添加我的面孔消息,並且對話沒有像我成功上傳一樣增加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM