最近一个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());
}
分享到:
相关推荐
它接受一个值属性,通常绑定到 backing bean 的某个属性,以便在用户做出选择时更新bean的状态。此外,`<f:selectItems>`标签用于定义下拉列表中的选项。 ```html <h:selectOneMenu value="#{bean.selectedOption}...
它的基本用法包括定义`value`属性来绑定选中的值到后台bean的属性,`items`属性则用来填充选项,通常通过EL表达式从bean获取。例如: ```xml <h:selectOneMenu value="#{bean.selectedOption}"> </h:...
3. 如果你需要完全禁止用户在任何情况下修改`h:selectOneMenu`的值,建议结合服务器端验证(如Bean验证)和JavaScript禁用功能来实现。 总之,通过JavaScript或CSS,我们可以轻松地将JSF的`h:selectOneMenu`组件...
1. **输出(Outputs)**:如`<h:outputText>`,用于显示绑定的值或信息。 2. **输入(Inputs)**:如`<h:inputText>`,为用户提供输入字段。 3. **命令(Commands)**:如`<h:commandButton>`,用于创建按钮或链接。...
JSF标签的一个强大特性是数据绑定,它可以将UI组件的值直接绑定到Managed Bean的属性。例如,`<h:inputText value="#{bean.property}" />`将输入字段的值与Bean的`property`属性关联。同样,`...
- `value`:设置组件的值或绑定到值。 - `valueChangeListener`:处理值改变事件。 - `converter`:转换组件的值。 - `validator`:验证用户输入。 - `required`:标志输入是否必需。 - `immediate`:决定组件是否应...
例如,`<h:inputText>`的`value`属性用于指定显示或绑定的值,`required`属性用于设置是否为必填,`validator`属性可以指定自定义验证函数。 ### JSF事件处理 JSF控件支持多种事件,如`action`事件(按钮点击时...
这些标签允许开发者绑定数据模型到选项,以及处理用户的选中操作。例如: ```html <h:selectOneMenu value="#{bean.selectedOption}"> </h:selectOneMenu> ``` 在这个例子中,`#{bean.selectedOption}`是模型中的...
JSF标签共享一些通用属性,如`id`用于唯一标识组件,`binding`可以将组件绑定到一个`UIComponent`实例,`rendered`决定组件是否在页面上渲染,`styleClass`用于设置CSS样式,`value`用于设置或绑定组件的值,`...
JSF提供了一种机制叫做`ValueExpression`,可以将UI组件的值绑定到Bean的属性,使得组件的改变能直接影响到Bean的状态。 此外,JSF还依赖于Facelets作为视图层技术,Facelets允许我们使用XML或XHTML语法定义视图,...
- **输出(Outputs)**:此类标签以`output`开头,主要用于显示信息或绑定值,如`<h:outputText>`。 - **输入(Inputs)**:以`input`开头,用于创建输入字段,如`<h:inputText>`。 - **命令(Commands)**:以`...
每个组件的值将绑定到后台bean的属性,通过`value`属性实现。`<f:selectItems>`标签用来填充下拉选项,这些选项可以从后台bean中获取或者直接在页面上定义。 2. **模型层(Model)**:在Java后台bean中,我们需要...
- `<h:selectOneMenu>`/`<h:selectManyCheckbox>`:用于创建下拉菜单和多选框。 - `<h:form>`:定义一个表单,所有的JSF组件必须包含在其中。 - `<h:message>`/`<h:messages>`:显示验证错误信息。 每个组件都有...
6. **Lifecycle Phases**:JSF生命周期包含多个阶段,如恢复视图、应用请求值、处理验证、更新模型值等,这些阶段确保了数据处理的顺序和一致性。 ### JSF 1.1中的标准控件 - **Input components**:例如`h:input...
1. **JSF组件库**:JSF提供了一个标准组件库,包括UIComponent、InputComponent、SelectComponent等基础组件,以及CommandButton、InputText、SelectOneMenu等常用组件。这些组件能够帮助开发者构建网页表单、数据...
- `p:selectOneMenu`:下拉选择框,可以进行动态加载和分页。 - `p:dialog`:弹出对话框,常用于表单提交或信息提示。 3. **JSF生命周期**:理解JSF的生命周期是正确使用标签的关键。主要包括六阶段:恢复视图、...
- `h:selectOneMenu`和`h:selectManyMenu`:用于创建单选和多选下拉菜单,可以与列表或数组绑定。 2. **按钮和链接控件**: - `h:commandButton`:用于执行服务器端操作,如提交表单。 - `h:commandLink`:类似...