У меня есть форма редактирования продукта, которая предварительно заполнена значениями из БД.Пользователь может изменить одно или несколько значений и опубликовать форму обратно.Одно поле ввода с именем t: inputFileUpload отображается только после запроса ajax, если пользователь решает изменить изображение продукта. Во время последней обратной передачи формы редактирования с помощью кнопки сохранения бин не обновляется со значением поля t: inputFileUploadСоответствующая часть формы приведена ниже:
<h:form>
<tr>
<td>Product Image*:</td>
<td>
<h:graphicImage url="#{addItem.prodFileName}" width="100" height="100"/>
<br /><h:commandLink value="change image" >
<f:ajax render="uploadimage" execute="@this" listener="#{addItem.ChangeImage}"/>
</h:commandLink>
</td>
</tr>
<tr >
<td>
<h:panelGroup id="uploadimage">
<t:inputFileUpload rendered="#{addItem.editImgChange}" label="editImage" value="#{addItem.uploadedFile}" />
<h:messages for="prodimage"/>
<h:inputHidden id="hiddeneditimgchange" value="#{addItem.editImgChange}" />
</h:panelGroup>
</td>
</tr>
<h:commandButton value="save" action="#{addItem.EditItem}" />
</h:form>
Bean-компонент AddItem находится в области запроса, и соответствующая часть его кода:
@ManagedBean
public class AddItem extends AbstractBean{
boolean editImgChange;
private UploadedFile uploadedFile;
//..
//getters and setters
public void ChangeImage(){
this.editImgChange=true;
}
public String EditItem() {
//some logic
}
}
Я прочитал несколько похожих вопросов.некоторые из ответов были для создания bean-компонента viewscoped. Я пытался создать bean-компонент ViewScoped, но это нарушает мою первоначальную логику предварительного заполнения значений формы.Так как я доволен RequestScoped, я сохранил состояние флага editImgChange, если его отключение влияет на обновление t: inputFileUpload.Когда я посмотрел на свойства bean-компонента, все в порядке, флаг имеет значение true, но свойство uploadedFile имеет значение null.