`
dontsan
  • 浏览: 40817 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

SelectOneMenu 值的绑定问题

阅读更多
最近一个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());

	}
分享到:
评论

相关推荐

    用selectOneMenu标签开发级联选择

    它接受一个值属性,通常绑定到 backing bean 的某个属性,以便在用户做出选择时更新bean的状态。此外,`&lt;f:selectItems&gt;`标签用于定义下拉列表中的选项。 ```html &lt;h:selectOneMenu value="#{bean.selectedOption}...

    <h:selectOneMenu>与<a4j:support>的集合运用(JSF)

    它的基本用法包括定义`value`属性来绑定选中的值到后台bean的属性,`items`属性则用来填充选项,通常通过EL表达式从bean获取。例如: ```xml &lt;h:selectOneMenu value="#{bean.selectedOption}"&gt; &lt;/h:...

    设置jsf的选择框h:selectOneMenu为不可编辑状态的方法

    3. 如果你需要完全禁止用户在任何情况下修改`h:selectOneMenu`的值,建议结合服务器端验证(如Bean验证)和JavaScript禁用功能来实现。 总之,通过JavaScript或CSS,我们可以轻松地将JSF的`h:selectOneMenu`组件...

    重要知识JSF标签.pdf

    1. **输出(Outputs)**:如`&lt;h:outputText&gt;`,用于显示绑定的值或信息。 2. **输入(Inputs)**:如`&lt;h:inputText&gt;`,为用户提供输入字段。 3. **命令(Commands)**:如`&lt;h:commandButton&gt;`,用于创建按钮或链接。...

    JSF标签详解.docx

    JSF标签的一个强大特性是数据绑定,它可以将UI组件的值直接绑定到Managed Bean的属性。例如,`&lt;h:inputText value="#{bean.property}" /&gt;`将输入字段的值与Bean的`property`属性关联。同样,`...

    jsf 控件说明(很好)

    - `value`:设置组件的值或绑定到值。 - `valueChangeListener`:处理值改变事件。 - `converter`:转换组件的值。 - `validator`:验证用户输入。 - `required`:标志输入是否必需。 - `immediate`:决定组件是否应...

    JSF控件详细说明

    例如,`&lt;h:inputText&gt;`的`value`属性用于指定显示或绑定的值,`required`属性用于设置是否为必填,`validator`属性可以指定自定义验证函数。 ### JSF事件处理 JSF控件支持多种事件,如`action`事件(按钮点击时...

    jsf实用代码

    这些标签允许开发者绑定数据模型到选项,以及处理用户的选中操作。例如: ```html &lt;h:selectOneMenu value="#{bean.selectedOption}"&gt; &lt;/h:selectOneMenu&gt; ``` 在这个例子中,`#{bean.selectedOption}`是模型中的...

    JSF标签(简体中文版,可作为jsf的UI设计人员的参考指南)

    JSF标签共享一些通用属性,如`id`用于唯一标识组件,`binding`可以将组件绑定到一个`UIComponent`实例,`rendered`决定组件是否在页面上渲染,`styleClass`用于设置CSS样式,`value`用于设置或绑定组件的值,`...

    jsf增删改实例

    JSF提供了一种机制叫做`ValueExpression`,可以将UI组件的值绑定到Bean的属性,使得组件的改变能直接影响到Bean的状态。 此外,JSF还依赖于Facelets作为视图层技术,Facelets允许我们使用XML或XHTML语法定义视图,...

    《JSF标签》简体中文版

    - **输出(Outputs)**:此类标签以`output`开头,主要用于显示信息或绑定值,如`&lt;h:outputText&gt;`。 - **输入(Inputs)**:以`input`开头,用于创建输入字段,如`&lt;h:inputText&gt;`。 - **命令(Commands)**:以`...

    jsf【静态】页面的三级级联示例

    每个组件的值将绑定到后台bean的属性,通过`value`属性实现。`&lt;f:selectItems&gt;`标签用来填充下拉选项,这些选项可以从后台bean中获取或者直接在页面上定义。 2. **模型层(Model)**:在Java后台bean中,我们需要...

    jsf生命周期和一部分标签介绍

    - `&lt;h:selectOneMenu&gt;`/`&lt;h:selectManyCheckbox&gt;`:用于创建下拉菜单和多选框。 - `&lt;h:form&gt;`:定义一个表单,所有的JSF组件必须包含在其中。 - `&lt;h:message&gt;`/`&lt;h:messages&gt;`:显示验证错误信息。 每个组件都有...

    JSF1.1入门教程

    6. **Lifecycle Phases**:JSF生命周期包含多个阶段,如恢复视图、应用请求值、处理验证、更新模型值等,这些阶段确保了数据处理的顺序和一致性。 ### JSF 1.1中的标准控件 - **Input components**:例如`h:input...

    jsf控件卡快速查手册

    1. **JSF组件库**:JSF提供了一个标准组件库,包括UIComponent、InputComponent、SelectComponent等基础组件,以及CommandButton、InputText、SelectOneMenu等常用组件。这些组件能够帮助开发者构建网页表单、数据...

    《JSF标签》简体中文版.rar

    - `p:selectOneMenu`:下拉选择框,可以进行动态加载和分页。 - `p:dialog`:弹出对话框,常用于表单提交或信息提示。 3. **JSF生命周期**:理解JSF的生命周期是正确使用标签的关键。主要包括六阶段:恢复视图、...

    jsf常用控件的使用

    - `h:selectOneMenu`和`h:selectManyMenu`:用于创建单选和多选下拉菜单,可以与列表或数组绑定。 2. **按钮和链接控件**: - `h:commandButton`:用于执行服务器端操作,如提交表单。 - `h:commandLink`:类似...

Global site tag (gtag.js) - Google Analytics