最近一个SelectOneMenu的问题忙了差不多一天。
我的web页面如下:
<h:selectOneMenu id="cateoty" required="true"
value="#{skuHome.instance.category}">
<f:selectItems value="#{categoryList.categoriesSelectItems}"/>
</h:selectOneMenu>
<ui:define name="label">Sku:</ui:define>
<h:inputText id="name" required="true"
value="#{skuHome.instance.sku}" />
EJB Bean:
public class CategoryList extends EntityQuery
{
private List<Category> categoryList;
private List<SelectItem> categoriesSelectItems;
@Override
public String getEjbql()
{
return "select category from Category category";
}
@Create
public void validate()
{
setCategoriesSelectItems(new ArrayList<SelectItem>());
setCategoryList(super.getResultList());
getCategoriesSelectItems().add(new SelectItem("All Categories","All Categories"));
for (Category c:getCategoryList()){
getCategoriesSelectItems().add(new SelectItem(c,c.getName() ));
}
}
public void setCategoriesSelectItems(List<SelectItem> categoriesSelectItems) {
this.categoriesSelectItems = categoriesSelectItems;
}
public List<SelectItem> getCategoriesSelectItems() {
return categoriesSelectItems;
}
public void setCategoryList(List<Category> categoryList) {
this.categoryList = categoryList;
}
public List<Category> getCategoryList() {
return categoryList;
}
}
Converter:
@org.jboss.seam.annotations.Name("categoryConverter")
@org.jboss.seam.annotations.faces.Converter(forClass = Category.class)
public class CategoryConverter implements javax.faces.convert.Converter {
@In(create = true)
CategoryList categoryList;
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
List<Category> categories = categoryList.getCategoryList();
if (arg2 == null)
return null;
for (Category c : categories)
if (arg2.equals(c.toString()))
return c;
return null;
}
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
if (arg2 != null)
return arg2.toString();
return null;
}
}
实体Bean:
@Entity
public class Category implements Serializable {
private Long id;
private Integer version;
private String name;
@Id @GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Version
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
@Length(max=20)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString()
{
return getName();
}
每次打开这个页面的时候SelectOneMenu没有值,其他组件例如InputText能正常显示值。选择一项,然后保存,确实更新了数据库。通过断点查看Converter转换也正确。
实在不知道所以然。后来只好改正这样,虽然有点别扭:
<h:selectOneMenu id="cateoty" required="true"
value="#{skuHome.instance.category.id}">
<f:selectItems value="#{categoryList.categoriesSelectItems}"/>
</h:selectOneMenu>
EJB:
getCategoriesSelectItems().add(new SelectItem(c.getId(),c.getName() ));
这样SelectOneMenu不是绑定到Category而是Category.id,保存的时候要从Category.id查找到Category,然后保存到Sku的Category属性里。破坏了OO,很不优雅。
后来重载了Category的equals方法,问题解决。
public boolean equals(Object o)
{
if (!(o instanceof Category))
return false;
return ((Category)o).getId().equals(this.getId());
}
分享到:
相关推荐
NULL 博文链接:https://yuexiangcheng007-sina-com.iteye.com/blog/444415
Column 內 selectOneMenu 位置 與其他東西 位置不太一致 的處理方法問題原因selectOneMenu就是比同一排的高解決方式。
NULL 博文链接:https://fdrgbs.iteye.com/blog/554687
本文为大家详细介绍下如何设置jsf的选择框h:selectOneMenu为不可编辑状态,具体实现代码如下,希望对大家有所帮助
素面Selenium 基于JUnit5,Selenium和页面对象/碎片概念的PrimeFaces测试支持。 它还支持JUnit5并行测试执行,以加快测试速度。 PrimeFaces-Selenium提供了一个挂钩,以启动本地服务器,使用远程地址并实例化...
設定Style讓標準的JSF元件比較像PrimefacesShared by: Jackson Lee在Primefaces下使用h:selectOneMenu
UI Components模块:提供拥有Rich Web用户体验的各种JSF组件,PrimeFaces提供的组件能够处理JavaScript Rendering在服务器端的集成问题。其中包括HtmlEditor、ImageCropper、Dialog、AutoComplete、 Flash based ...
某些组件(如 selectOneMenu、spinner、inputNumeric、calendar、splitbutton、带有下拉按钮的自动完成)需要额外的样式版本才能响应。 文件 /PrimefacesBootstrap/src/main/webapp/resources/css/style.css 包含我...
<h:selectOneMenu id="myParamId" value="#{myBean.myParam}" required="true"> </h:selectOneMenu> action="#{myBean.processMyFile}"/> 其中tags.jsp文件如下: Faces-...
合同形式JSF + Primefaces 中的表单Ajax 和部分渲染部分处理使用日历输入日期和时间SelectOneMenu 和 Ajax 的相关选择菜单带有 SelectOneRadio 的单选按钮带有 SelectManyCheckbox 的多个复选框带有 AutoComplete 的...
TheryFaces ... SelectOneDetail(多功能框 + selectOneMenu + 所选项目的详细信息) 盒子(带斜角的盒子,重复N次有用) 实用程序(函数,例如 #{util:someFunction('parameter')}): 枚举列表