如何解决为什么在单击按钮之前会消失f:viewParam中的数据
我正在JSF上开发一个简单的CRUD,我有一个重定向的视图,所以我应该在另一个视图中完成表单并更新元素,但是由于这个原因,视图参数的数据在单击更新按钮之前消失了。
这是我的代码:
StateList.xhtml
...
<p:column headerText="Accion">
<p:button icon="pi pi-pencil"
value="Editar"
styleClass="edit-button rounded-button success-button"
process="@this"
outcome="StateEdit"
>
<f:param name="id" value="#{stateItem.id}"/>
</p:button>
...
StateEdit
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="id" value="#{stateController.recivedId}"/>
</f:metadata>
</ui:define>
<ui:define name="title">Editar estado</ui:define>
<ui:define name="viewname">
<li>Inicio</li>
<li><i class="fa fa-angle-right"/></li>
<li><p:link outcome="/admin/StateList">Lista de Estados</p:link></li>
<li><i class="fa fa-angle-right"/></li>
<li><p:link outcome="/admin/StateList">Editar estado</p:link></li>
</ui:define>
<ui:param name="viewname" value="Editar Estado"/>
<ui:define name="content">
<div class="p-grid form-superfinanciera">
<div class="p-col-12">
<div class="card">
<p:growl id="messages" showDetail="true" />
<h4>Editar Estado</h4>
<h:form>
<p:growl id="growl" showDetail="true" sticky="true" />
<p:outputPanel id="businessProcessContent">
<div class="ui-fluid p-formgrid p-grid">
<div class="p-field p-col-12 p-md-6">
<p:outputLabel for="name" value="Nombre"/>
<p:inputText id="name" required="true" requiredMessage="Nombre requerido" value="#{stateController.newName}"/>
<p:message for="name" display="icon" />
</div>
</div>
</p:outputPanel>
<p:commandButton id="submitButton"
value="Confirmar cambios"
update="businessProcessContent :messages"
process="businessProcessContent @this"
actionListener="#{stateController.updateState()}"
/>
</h:form>
</div>
</div>
</div>
</ui:define>
</ui:composition>
StateController.java
@Named
@ViewScoped
public class StateController {
@Inject
private StateList stateList;
@Inject
private StateStore store;
@Inject
private StateDao stateDao;
@Named
@Produces
private State newState;
@Getter
@Setter
private String newName;
@Getter
@Setter
private Long recivedId;
@Getter
@Setter
private Integer searchID;
@Getter
@Setter
private String searchName;
@PostConstruct
public void initNewState() {
this.newState = new State();
}
public void initExistentState(){
try {
recivedId = Long.valueOf(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"));
this.newState = stateDao.getSingle(recivedId);
}
catch (Exception ex){
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR","" ) );
}
}
public void setCurrentState(State state){
store.set(state);
}
public void setStateResults(List<State> stateResults) {
this.stateResults = stateResults;
}
private List<State> stateResults;
public List<State> getStateResults() {
if(stateResults==null) {
stateResults=stateDao.getAll();
}
return stateResults;
}
public List<State> getFilteredResults(){
stateResults= stateDao.getFiltered(searchID,searchName);
return stateResults;
}
public void deleteState(){
stateDao.delete(stateDao.getSingle(recivedId));
stateList.invalidate();
store.unset();
}
public void createState() {
stateList.invalidate();
stateDao.create(newState);
store.set(newState);
initNewState();
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null,new FacesMessage("Transacción exitosa","Se ha guardado el estado") );
}
public void updateState(){
stateList.invalidate();
State tate = newState;
newState.setName(newName);
stateDao.update(newState);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null,"Actualizacion completada"));
}
}
解决方法
ViewScoped
bean应该实现可序列化,以便可以在同一视图的请求之间持久化它们。否则,每个请求都会创建它们,并且它们的行为类似于RequestScoped
bean。
您的命令按钮是第二个请求,因此数据丢失。您可以使Bean可序列化,也可以在命令按钮中添加必要的参数以使用请求范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。