具体来说,我对 JEE6 和 JSF 很陌生,所以我知道我缺乏一些知识来运行它。我试图上班超过两天知道 - 这很绝望......
我的问题是什么:我有一个用户、技能和级别,例如“Frank (The Cook)”有技能“Cooking”和“expert”级别。因此,我尝试创建一个用户可以管理其技能的表单。我可以设法显示相应级别的技能。级别是 SelectOneMenu 的选定值。当我更改值并提交表单时,它什么也不做,我不知道为什么:-(
到目前为止我的代码:
配置文件.xhtml
<h5>General skills</h5>
<h:panelGroup>
<h:form>
<h:dataTable value="#{userBean.userskills}" var="userskill">
<h:column>
<f:facet name="header">Skill</f:facet>
<span><h:outputText value="#{userskill.skill.description}" /></span>
</h:column>
<h:column>
<f:facet name="header">Level</f:facet>
<span>
<h:selectOneMenu value="#{userskill.level}" >
<f:selectItem itemValue="#{null}"
itemLabel="#{msg.ChooseOption}"
noSelectionOption="true" />
<f:selectItems value="#{userskill.skill.levels}"
var="level"
itemValue="#{level}"
itemLabel="#{level.description}" />
<f:converter converterId="levelConverter" />
</h:selectOneMenu>
</span>
</h:column>
</h:dataTable>
<h:commandButton value="#{msg.Save}"
action="#{userBean.testAction}" />
</h:form>
</h:panelGroup>
用户Bean.java
@ManagedBean
@SessionScoped
public class UserBean implements Serializable {
private static final long serialVersionUID = 1L;
private User user;
@ManagedProperty(value="#{authBean}")
private AuthenticationBean authBean;
@EJB IUserDao userDao;
@EJB ICategoryDao categoryDao;
@EJB IUserSkillLevelDao uskDao;
List< UserSkillLevel > userskills;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public void setAuthBean(AuthenticationBean authBean) {
this.authBean = authBean;
}
public List<UserSkillLevel> getUserskills() {
return userskills;
}
public void setUserskills(List<UserSkillLevel> userskills) {
this.userskills = userskills;
}
public String getProfile(Long userId) {
// is called when clicking on the "Show user profile" link on an other page
User auth_user = this.authBean.getUser();
if ( auth_user.getId() == userId ) {
this.user = auth_user;
} else {
this.user = userDao.findById(userId);
}
this.userskills = findUserskills(null, false);
return "/pages/profile?faces-redirect=true";
}
public List< UserSkillLevel > findUserskills(Category category, boolean skillIsWithStandardLevelSet) {
if ( category == null ) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("description", "General");
category = categoryDao.findOneByConditions(Category.FIND_BY_DESCRIPTION, parameters);
}
return uskDao.findByUserAndCategory(this.user, category, skillIsWithStandardLevelSet);
}
public String testAction() {
System.out.println("-------- worked --------");
return "";
}
}
一切正常。级别(来自 DB)在启动时显示,转换器正在转换反之亦然,并且 SelectOneMenu 包含为该技能指定的级别。
我认为由于自动生成的 SelectOneMenus,commandButton 不起作用。我对吗?在调试我的代码时,我发现它userBean.userskills.level
从初始值更改为 null,但在更改后我无法确定它是否包含选定的值。一旦我删除 SelectOneMenu,commandButton 就会testAction
按预期调用。
我究竟做错了什么?我错过了一些东西,但我不知道是什么 :-( 有没有更简单的方法来完成我想要的?另外:我必须坚持使用普通的 JSF,这意味着不使用 Primefaces、Omnifaces 等。
问候,斯特菲
- 更新 -
h:message
我添加了一个SelectOneMenu
并遇到了“值无效”-错误;试图弄清楚它为什么会出现......
- 更新 -
它正在工作 ;-) 只为那些像我一样绝望的人:我只是忘了为我的实体实现一个 equals 方法!!!