2011-07-26 1 views
1

Я использую <rich:fileupload>, и мне нужно отправить некоторые дополнительные параметры моему контроллеру. Я попытался использовать для этого <f:param>.JSF + rich: fileupload + param

Вот вид:

<rich:fileUpload 
    fileUploadListener="#{fileUploadController.listener}" 
    maxFilesQuantity="#{fileUploadController.uploadsAvailable}" 
    addControlLabel="Hinzufügen" 
    uploadControlLabel="Hochladen" 
    cancelEntryControlLabel="Abbrechen" 
    doneLabel="Fertig" 
    clearAllControlLabel="Alle entfernen" 
    noDuplicate="true" 
    stopControlLabel="Stop" 
    clearControlLabel="Entfernen" 
    id="upload"        
    immediateUpload="#{fileUploadController.autoUpload}" 
    ajaxSingle="true" 
    acceptedTypes="jpg" 
    allowFlash="#{fileUploadController.useFlash}" 
    rerender="info"> 

    <a4j:support event="onuploadcomplete" reRender="info" status="globalStatus" /> 

    <f:param 
    value="#{imageFormat}" 
    name="#{fileUploadController.imageFormat}"/> 

</rich:fileUpload> 

Вот FileUploadController поддержка боб:

private String imageFormat; 

    public void setImageFormat(String imageFormat) { 
     this.imageFormat = imageFormat; 
    } 

    public String getImageFormat() { 
     return imageFormat; 
    } 

Однако сеттер никогда не вызывается, так что переменная всегда null. #{imageFormat} имеет правильное значение, я проверил его с помощью <h:outputText>.

Я не могу использовать <a4j:param>, потому что нет кнопки для включения.

Мы используем JSF 1.2, а не JSF 2.0.

+0

Я не понял, но если вы хотите знать формат изображения, то все изображение, которое у вас есть в вашем методе слушателя, вы можете легко определить, что такое формат. –

+0

Нет, у меня есть STRING, который находится в # {imageFormat} (Формат должен быть) Я просто хочу знать, как получить параметр от моего богатого: fileupload к моему контроллеру – Joerg

+0

Если такой подход с f: param будет когда-либо работа, она должна быть: <е: пары значение = "# {fileUploadController.imageFormat}" имя = "ImageFormat" /> – Andrey

ответ

2

Чтобы выполнить некоторые операции на определенных этапах загрузки, вы можете подключиться к событию rich: fileUpload. Наряду со стандартными событиями, богатым: FileUpload предусматривает ряд конкретных мероприятий:

  • В «onadd» обработчик события вызывается на операцию добавления файла
  • «onupload», которая дает вам возможность отменить загрузку в стороне клиента
  • «onuploadcomplete», который вызывается после того, как все файлы из списка выгружаются
  • «onuploadcanceled», который вызывается после загрузки была отменена посредством отмены Control
  • «OnError», который вызывается, если загрузка файла была прервана в соответствии с любыми ошибками

Для вызова логики на стороне сервера с помощью AJAX, когда происходит событие, используйте «a4j: статус» или «a4j: Функция JsFunction», для например, с помощью «a4j: статус»:

<rich:fileUpload 
     yourParameters="..."> 
    <a4j:support event="onuploadcomplete" reRender="something" action="#{fileUploadController.setImageFormat(imageFormat)}"/> 
</rich:fileUpload> 

и используя «a4j: Функция JsFunction» (также показано, как использовать setPropertyActionListener, то для случая, если ваш EL распознаватель не поддерживает вызовы методов с параметрами (см BalusC комментарий))

<rich:fileUpload onupload="setImageFormat();" 
     yourParameters="..."></rich:fileUpload> 

<a4j:jsFunction name="setImageFormat"> 
    <f:setPropertyActionListener value="#{imageFormat}" target="#{fileUploadController.imageFormat}"/> 
</a4j:jsFunction> 
+0

Вызов методов не-геттера с аргументами в EL не поддерживается ранее EL 2.2. И поскольку OP использует JSF 1.2, я сомневаюсь, что он поддерживает контейнер с поддержкой EL 2.2 (EL 2.2 является частью Java EE 6, который, в свою очередь, предлагает JSF 2.0). – BalusC

+0

@BalusC Относительно методов с вызовом параметров. Я не хотел перегружать ответ этими деталями, просто хотел продемонстрировать подход. Это может работать так же, как для Йорга, если он использует, например, JBoss EL. Если не в этом конкретном случае, то f: setPropertyActionListener подходит. – Andrey

+0

@Andrey благодарит за помощь - теперь это работает! – Joerg