我正在做一个小课程通过项目,我有一个问题。
manager.xhtml 是一个 JSF 页面,它用于查看数据库中的数据,对它们进行排序、过滤、删除条目和编辑这些条目。当我在 Manager.java 中使用 @ViewScoped 时 - 除了编辑部分之外的所有内容都可以正常工作。“编辑”链接将用户发送到另一个页面 - edit.xhtml。在我使用@ConversationScoped 能够读取从edit.xhtml 中的manager.xhml 发送的数据之后。使用@ConversationScoped 后,条目编辑选项完美运行,但它开始在某些过滤/排序选项中出错 - 按类别排序开始提取错误,如“名称为空”,按价格过滤 - 相同。
这是代码。
管理器.xhtml
这是使用@ConversationScoped 时开始出现问题的形式
<h:form>
<h:panelGrid id="filterPanel" columns="7">
<f:ajax render="filterValue" event="change" execute="filterValue">
#{text.sort}
<h:selectOneMenu value="#{manager.order}">
<f:selectItem itemValue="cargoName" itemLabel="#{text.cargo_name}"/>
<f:selectItem itemValue="price" itemLabel="#{text.cargo_price}"/>
<f:selectItem itemValue="category" itemLabel="#{text.cargo_category}"/>
</h:selectOneMenu>
<h:selectOneMenu id="filterType" value="#{manager.filterType}">
<f:selectItem itemValue="CARGO_NAME" itemLabel="#{text.cargo_name}"/>
<f:selectItem itemValue="PRICE" itemLabel="#{text.cargo_price_filter}"/>
<f:selectItem itemValue="CATEGORY" itemLabel="#{text.cargo_category}"/>
</h:selectOneMenu>
<h:panelGroup id="filterValue">
<h:panelGroup id="filterValues">
<h:inputText id="filterValueInput" value="#{manager.filterValue}" rendered="#{manager.filterType == 'CARGO_NAME'
or manager.filterType == 'PRICE'}"
required="#{manager.filterType == 'PRICE'}"/>
<h:message for="filterValueInput"/>
<h:inputText id="filterValueInput2" value="#{manager.filterValue2}" rendered="#{manager.filterType == 'PRICE'}"
required="#{manager.filterType == 'PRICE'}"/>
<h:message for="filterValueInput2"/>
</h:panelGroup>
<h:selectOneMenu id="cargoForm" value="#{manager.filterValue}" rendered="#{manager.filterType == 'CATEGORY'}">
<f:selectItem itemLabel="#{text.cargo_text_BOOKS}" itemValue="BOOKS"/>
<f:selectItem itemLabel="#{text.cargo_text_CALENDARS}" itemValue="CALENDARS"/>
<f:selectItem itemLabel="#{text.cargo_text_CD}" itemValue="CD"/>
<f:selectItem itemLabel="#{text.cargo_text_EBOOKS}" itemValue="EBOOKS"/>
<f:selectItem itemLabel="#{text.cargo_text_OFFICE}" itemValue="OFFICE"/>
<f:selectItem itemLabel="#{text.cargo_text_VINYL}" itemValue="VINYL"/>
</h:selectOneMenu>
</h:panelGroup>
</f:ajax>
<h:commandButton action="#{manager.filter}" value="#{text.button_refresh}"/>
<h:commandButton action="#{manager.reset}" value="#{text.button_reset}"/>
</h:panelGrid>
编辑.xhtml
版本表格 - 仅在使用 @ConversationScoped 时填充所选条目的数据:
获取 manager.xhtml 发送的 ID
<h:inputHidden value="#{manager.editCargo.id}"/>
在表单中,数据是从经理那里获取的,如下所示:
<h:inputText id="cargoName" value="#{manager.editCargo.cargoName}" required="true">
</h:inputText>
按钮保存更改:
<h:commandButton value="#{text.edit_button}" action="#{manager.update}"/>
Manager.java - 删除了不必要的代码。
@ConversationScoped
@ManagedBean
public class Manager implements Serializable {
@Inject
private CargoRepository repository; // tworzy nową instancję objektu CargoRepository
private List<Cargo> cargos; // tworzy listę obiektów Cargo
private String order = CARGO_NAME; // musi istnieć by zainicjować jakąś zmienną order, ponieważ manager.xhtml już na starcie sortuje po order więc nie może być null.
private FilterType filterType = FilterType.CARGO_NAME;
private String filterValue;
private String filterValue2;
@Inject
private Conversation conversation;
删除了获取器和设置器...
@PostConstruct
public void init() {
cargos = repository.getAll(order);
editCargo = new Cargo();
}
public void filter() {
if (filterType == FilterType.PRICE) {
cargos = repository.getAll(filterType, filterValue, filterValue2, order);
} else {
cargos = repository.getAll(filterType, filterValue, order);
}
}
public void resetFilterValue() {
filterValue = "";
filterValue2 = "";
}
public String edit(Cargo cargo) {
conversation.start();
editCargo = cargo;
return "edit";
}
public String update() {
conversation.end();
repository.update(editCargo);
System.out.println(editCargo.toString());
init();
return "manager";
}
}