我注意到有不同的bean范围,如:
@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Run Code Online (Sandbox Code Playgroud)
每个人的目的是什么?如何为我的bean选择合适的范围?
我正在创建一个Web应用程序,您必须从DB中读取对象/实体列表并在JSF中填充它<h:selectOneMenu>.我无法对此进行编码.有人可以告诉我该怎么做吗?
我知道如何List<User>从数据库中获取数据.我需要知道的是,如何填充此列表<h:selectOneMenu>.
<h:selectOneMenu value="#{bean.name}">
...?
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud) 我有理解如何有效地使用JSF 2中的选择和POJO /实体.例如,我试图Warehouse通过下面的下拉列表选择一个实体:
<h:selectOneMenu value="#{bean.selectedWarehouse}">
<f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
<f:selectItems value="#{bean.availableWarehouses}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
以下托管bean:
@Named
@ViewScoped
public class Bean {
private Warehouse selectedWarehouse;
private List<SelectItem> availableWarehouses;
// ...
@PostConstruct
public void init() {
// ...
availableWarehouses = new ArrayList<>();
for (Warehouse warehouse : warehouseService.listAll()) {
availableWarehouses.add(new SelectItem(warehouse, warehouse.getName()));
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,我使用整个Warehouse实体作为值SelectItem.
当我提交表单时,会失败并显示以下消息:
'null Converter'的转换错误设置值'com.example.Warehouse@cafebabe'.
我希望Warehouse当我将它包装在一个中时,JSF可以将正确的对象设置为我的托管bean SelectItem.将我的实体包装在里面SelectItem意味着跳过Converter为我的实体创建一个.
Converter每当我想在我的实体中使用实体时,我真的必须使用<h:selectOneMenu>吗?JSF应该可以从可用项列表中提取所选项.如果我真的必须使用转换器,那么实际的方法是什么?到目前为止,我想到了这个:
Converter为实体创建实现. …我有一个名为User的域对象.用户的属性包括ssoId,name,email,createdBy,createdDate和userRole.其中,ssoId必须是唯一的,因为没有两个用户可以拥有相同的sso id.所以我的equals方法检查sso id并返回true或false.
@Override public boolean equals(Object o) {
if (!(o instanceof User))
return false;
return user.getSsoId().equals((User)o.getSsoId());
}
Run Code Online (Sandbox Code Playgroud)
我觉得这是一个不正确的实现,尽管就业务规则而言是正确的.对于具有相同sso id但具有不同的名称或电子邮件或两者的值的两个对象,上述实现将返回true.我应该更改我的平等合同以检查所有字段的相等性吗?你的建议是什么?
当我还是用PrimeFaces V2.2.1,我能键入Unicode输入诸如与PrimeFaces输入组件中国如<p:inputText>和<p:editor>,并检索在管理bean方法好形状的输入.
但是,在我升级到PrimeFaces v3.1.1后,所有这些字符都变成了Mojibake或问号.只有拉丁语输入才能正常,中文,阿拉伯语,希伯来语,西里尔语等字符会变得格格不入.
这是怎么造成的,我该如何解决?
我在requestScope中使用managedBean userHome,其中实体'user'将被保留.用户具有以ManyToOne关系映射的leader列.我的代码如下所示
@ManagedBean
@RequestScoped
public class UserHome {
private User user = new User();
// Getters and Setters
private List<SelectItem> selectItems = new ArrayList<SelectItem>();
public UserHome() {
for(User user: availableLeaders) {
selectItems.add(new SelectItem(user.getName(), user));
}
}
public void persis();
}
Run Code Online (Sandbox Code Playgroud)
User.java
public class User {
@Id
@Column
private Integer id;
@Column
privat String name;
@ManyToOne
private User leader;
}
Run Code Online (Sandbox Code Playgroud)
我试图通过h:selectOneMenu这样的方式获得这个领导者的价值
<h:selectOneMenu value="#{userHome.user.leader}" converter="userConverter">
<f:selectItems value="#{userHome.selectItems}"/>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
我的转换器看起来像这样
@FacesConverter(forClass = User.class, value="userConverter")
public class UserConverter implements …Run Code Online (Sandbox Code Playgroud) 我创建了一个带有表单的用户界面,以从用户那里获取信息.提交表单时,它会在服务器日志中显示以下警告:
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=j_idt7:j_idt11[severity=(ERROR 2), summary=(j_idt7:j_idt11: Validation Error: Value is not valid), detail=(j_idt7:j_idt11: Validation Error: Value is not valid)]
Run Code Online (Sandbox Code Playgroud)
我试图解决它,但我不明白怎么做.这个问题是怎么造成的,怎么解决?
我有一个selectMenu,在处理程序中定义的(SelectItems)列表如下
Handler { List(SelectItem) stateList; State state; }
State { String stateCd; }
Run Code Online (Sandbox Code Playgroud)
JSF代码::
<h:selectOneMenu value="#{state.stateCode}">
<f:selectItems value="#{handler.stateList}">
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
现在我的列表在requestScope中,我看到提交的值是字符串并出现在列表中但我仍然得到"验证错误:值无效".可以有人协助.
我正在使用Spring和Hibernate开发JSF项目,其中包括许多Converter遵循相同模式的s:
getAsObject 接收对象id的字符串表示形式,将其转换为数字,并获取给定种类的实体和给定的id
getAsString receive和entity并返回转换为的对象的id String
代码基本上是以下内容(省略检查):
@ManagedBean(name="myConverter")
@SessionScoped
public class MyConverter implements Converter {
private MyService myService;
/* ... */
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
int id = Integer.parseInt(value);
return myService.getById(id);
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
return ((MyEntity)value).getId().toString();
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于大量的ConverterS中的完全一样(除了类型MyService和MyEntity当然的),我想知道,如果它使用一个通用的转换器是值得的.通用本身的实现并不困难,但我不确定声明Beans的正确方法.
可能的解决方案如下:
1 - 编写通用实现,让我们调用它MyGenericConverter,不需要任何Bean注释
2 - 将特定转换器ad写为子类,MyGenericConverter<T>并根据需要对其进行注释:
@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> { …Run Code Online (Sandbox Code Playgroud) 我正在尝试实施两个 <h:selectOneMenu/>
第一个包含Type 1对象.当用户从该列表中选择一个对象时,<h:selectOneMenu/>将显示第二个对象.
这是我的代码
XHTML
<h:form>
<h:selectOneMenu value="#{handler.selectedType1}" valueChangeListener="#{handler.valueChanged}">
<f:selectItems value="#{handler.types1}" var="type1" itemValue="#{type1.name}" itemLabel="#{type1.name}" />
<a4j:ajax event="valueChange" render="type2List" execute="@this"/>
</h:selectOneMenu>
<h:selectOneMenu id="type2List" value="#{handler.selectedType2}" rendered="#{not empty handler.selectedType2}">
<f:selectItems value="#{handler.types2}" var="type2" itemLabel="#{type2.name}" />
</h:selectOneMenu>
</h:form>
Run Code Online (Sandbox Code Playgroud)
托管bean
@ManagedBean
@ViewScoped
public class Handler {
private Type1 selectedType1;
private List<Type1> types1;
private Type2 selectedType2;
private List<Type2> types2;
//getters, setters
public void valueChanged(ValueChangeEvent event) {
variants.clear();
if (event.getNewValue() != null) {
System.out.println("new value: " + event.getNewValue());
// Fill the second list
}
} …Run Code Online (Sandbox Code Playgroud)