2012-12-19 37 views
5

私はリンクを持つwicketページを持っています追加製品。リンクをクリックすると、モーダルウィンドウが開き、製品情報が表示されます。Wicket:setResponsePageを使用してwicketページにリダイレクト

ProductAddPanel.java

public class ProductAddPanel extends Panel { 

private InlineFrame uploadIFrame = null; 
private ModalWindow window; 
private Merchant merchant; 
private Page redirectPage; 
private List<Component> refreshables; 

public ProductAddPanel(String id,final Merchant mct,ModalWindow window,List<Component> refreshables,Page p) { 
    super(id); 
    this.window = window; 
    merchant = mct; 
    redirectPage = p; 
    this.refreshables = refreshables; 
    setOutputMarkupId(true); 
} 

@Override 
protected void onBeforeRender() { 
    super.onBeforeRender(); 
    if (uploadIFrame == null) { 
     // the iframe should be attached to a page to be able to get its pagemap, 
     // that's why i'm adding it in onBeforRender 
     addUploadIFrame(); 
    } 
} 


// Create the iframe containing the upload widget 
private void addUploadIFrame() { 
    IPageLink iFrameLink = new IPageLink() { 
     @Override 
     public Page getPage() { 
      return new UploadIFrame(window,merchant,redirectPage,refreshables) { 
       @Override 
       protected String getOnUploadedCallback() { 
        return "onUpload_" + ProductAddPanel.this.getMarkupId(); 
       } 


      }; 
     } 
     @Override 
     public Class<UploadIFrame> getPageIdentity() { 
      return UploadIFrame.class; 
     } 
    }; 
    uploadIFrame = new InlineFrame("upload", iFrameLink); 
    add(uploadIFrame); 
} 

}

ProductAddPanel.html

<wicket:panel> 
<iframe wicket:id="upload" frameborder="0"style="height: 600px; width: 475px;overflow: hidden"></iframe> 
</wicket:panel> 

私は、画像をアップロードするにはiFrameを使用しています。 ProductPanel.htmlにiframeを追加しました。なぜなら、ajax submitを使用してファイルをアップロードすることはできないからです。

UploadIframe.java

protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
       DynamicImage imageEntry = new DynamicImage(); 

       if(uploadField.getFileUpload() != null && uploadField.getFileUpload().getClientFileName() != null){ 
        FileUpload upload = uploadField.getFileUpload(); 
        String ct = upload.getContentType(); 

        if (!imgctypes.containsKey(ct)) { 
         hasError = true; 
        } 

        if(upload.getSize() > maximagesize){ 
         hasError = true; 
        } 

        if(hasError == false){ 
         System.out.println("######################## Image can be uploaded ################"); 
         imageEntry.setContentType(upload.getContentType()); 
         imageEntry.setImageName(upload.getClientFileName()); 
         imageEntry.setImageSize(upload.getSize()); 
         if(imageEntry != null){ 
          try { 
           save(imageEntry,upload.getInputStream()); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }else{ 
         target.appendJavaScript("$().toastmessage('showNoticeToast','Please select a valid image!!')"); 
         System.out.println("#################### Error in image uploading ###################"); 
        } 
       }else{ 
        System.out.println("########################### Image not Selected #####################"); 
       } 

       MerchantProduct mp =new MerchantProduct(); 
       Product p = new Product(); 
       Date d=new Date(); 
       try { 

        p.setProductImage(imageEntry.getImageName()); 
        mp.setProduct(p); 

        Ebean.save(mp); 


       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       for(Component r: refreshables){ 
        target.add(r); 
       } 

       window.close(target); 
       setResponsePage(MerchantProductPage.class); 
      } 

public void save(DynamicImage imageEntry, InputStream imageStream) throws IOException{ 
    //Read the image data 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    copy(imageStream,baos); 
    baos.close(); 
    byte [] imageData = baos.toByteArray(); 
    baos = null; 

    //Get the image suffix 
    String suffix = null; 
    if("image/gif".equalsIgnoreCase(imageEntry.getContentType())){ 
     suffix = ".gif"; 
    }else if ("image/jpeg".equalsIgnoreCase(imageEntry.getContentType())) { 
     suffix = ".jpeg"; 
    } else if ("image/png".equalsIgnoreCase(imageEntry.getContentType())) { 
     suffix = ".png"; 
    } 

    // Create a unique name for the file in the image directory and 
    // write the image data into it. 
    File newFile = createImageFile(suffix); 
    OutputStream outStream = new FileOutputStream(newFile); 
    outStream.write(imageData); 
    outStream.close(); 
    imageEntry.setImageName(newFile.getAbsolutePath()); 

    } 

    //copy data from src to dst 
    private void copy(InputStream source, OutputStream destination) throws IOException{ 
     try { 
       // Transfer bytes from source to destination 
       byte[] buf = new byte[1024]; 
       int len; 
       while ((len = source.read(buf)) > 0) { 
        destination.write(buf, 0, len); 
       } 
       source.close(); 
       destination.close(); 
       if (logger.isDebugEnabled()) { 
        logger.debug("Copying image..."); 
       } 
      } catch (IOException ioe) { 
       logger.error(ioe); 
       throw ioe; 
      } 
     } 

    private File createImageFile(String suffix){ 
     UUID uuid = UUID.randomUUID(); 
     File file = new File(imageDir,uuid.toString() + suffix); 
     if(logger.isDebugEnabled()){ 
      logger.debug("File "+ file.getAbsolutePath() + "created."); 
     } 
     return file; 
    } 
} 

}

私はリンクが存在している "製品を追加" れている最初のページにリダイレクトするようにsetResonsePage()を使用しています。だから私は新しい製品情報を持っている更新されたページを取得します。

私の問題は、モーダルウィンドウがwindow.close()上で閉じず、そのウィンドウ内でリフレッシュされたページを取得していることです。

私の要件は、モーダルウィンドウを閉じてページをリフレッシュする必要があるということです。私はsetResponsePage()にParentpage.classを渡しています。

ご協力いただきありがとうございます。前もって感謝します。

答えて

5

モーダルウィンドウが開いているParentPage.classでは、setWindowClosedCallback()メソッドを呼び出しました。ターゲットにgetPage()を追加して、モーダルウィンドウが閉じられたときにページが更新されるようにしました。 これは同じコードです

modalDialog.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() 
    { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void onClose(AjaxRequestTarget target) 
      { 
       target.addComponent(getPage()); 
      } 
    }); 
関連する問題