我最近被安排在一个项目中,为现有的jsf页面添加一些新功能。事情一直顺利进行到此为止。在过去一两周内,我一直在咨询谷歌和其他堆栈溢出条目,以试图正确使用此功能。
我的xhtml页面上有数据表,其中包含许多条目,其中一些条目中包含h:selectmanycheckbox。表和复选框都是动态创建的。我可以毫无困难地创建复选框。我还可以根据数据库条目将其初始状态设置为选中或取消选中。但是,在提交表单时,我无法从用户那里获取任何更改。无论用户输入了什么,返回的值始终等于初始状态。
AddRemoveSkills.xhtml
<h:panelGrid id="allSkills" style=" width : 706px;">
<ui:repeat var="cat" value="#{skillsController.masterCategories}"
varStatus="status">
<h:form
rendered="#{cat.toString().equalsIgnoreCase(skillsController.mode)||skillsController.mode.equalsIgnoreCase('Show All Skills')}">
<h3 class="arSkillsHeader">
<h:outputLabel value="#{cat.toString()}"
style="font-weight:bold" />
</h3>
<h:dataTable style="margin-left:15px; margin-right:15px"
class="suggestionsTable" var="skill"
rowClasses="gray, lightgraybg"
columnClasses="null, hCol3, null, null"
value="#{skillsController.getSkillsByCategory(cat)}">
<h:column>
<h:graphicImage value="/resources/images/success.png"
style="height:20px"
rendered="#{skillsController.hasSkill(cat.toString(), skill.name.toString())}" />
</h:column>
<h:column>
<h:outputText value="#{skill.name.toString()}" />
</h:column>
<h:column>
<!-- CheckBoxProblems lie here -->
<h:selectManyCheckbox id="versions"
layout ="lineDirection"
style = "text-align: left;"
value = "#{skill.checkedVersions}">
<f:selectItems value="#{skillsController.getVersions(skill.getName(), skill.getCategoryName())}"/>
</h:selectManyCheckbox>
</h:column>
<h:column>
<h:selectOneMenu value="#{skill.proficiency}">
<f:selectItem
itemValue="#{skillsController.timeList.get(0)}"
itemLabel="Select Experience Level" />
<f:selectItems
value="#{skillsController.timeList.subList(1, skillsController.timeList.size())}" />
<f:ajax listener="#{skill.setModified(true)}"/>
<f:ajax event="click" render="@this" />
</h:selectOneMenu>
</h:column>
</h:dataTable>
<h:panelGroup layout="block" style="height:20px">
<h:commandButton value="Update Category" style="float:right; margin-right:15px;"
action="#{skillsController.updateCategorySkills(cat)}"
onclick="updatePro(this.id);">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
</h:panelGroup>
</h:form>
</ui:repeat>
</h:panelGrid>
Skill.java
public class Skill implements Comparable<Skill> {
protected String skill;
protected String category;
private String proficiency;
private List<String> checkedVersions = new ArrayList<String>();
private boolean modified;
Logger logger = Logger.getLogger(Skill.class);
...
/**
* Gets a list of versions for this user's skill
*
* @return Returns a string list containing the versions of this skill that the user has
*/
public List<String> getCheckedVersions() {
return checkedVersions;
}
/**
* Sets a list of versions for this user's skills
*
*
* @param checkedVersions A string list of checked versions
*/
public void setCheckedVersions(List<String> checkedVersions) {
if(checkedVersions != null){
this.checkedVersions = checkedVersions;
logger.info("Inside Skill, setCheckedVersions " + checkedVersions.toString()+ "skill name is: " + this.skill );
}
}
SkillsController.java
@ManagedBean
@SessionScoped
public class SkillsController implements Serializable {
private static final long serialVersionUID = 1270888906016432185L;
@ManagedProperty(value = "#{activeUser}")
private ActiveUser user;
private TreeMap<String, Skill> allSkillMap;
private Map<String, Map<String, List<String>>> versionList;
private Map<String, Map<String, List<String>>> checkedVersionList;
public Skill getUserSkillByName(String name) {
for (Skill skill : user.getSelfEmployee().getSkills()) {
if (skill.getName().equals(name)) {
if(checkedVersionList.containsKey(skill.getCategoryName())){
if(checkedVersionList.get(skill.getCategoryName()).containsKey(skill.getName())){
skill.setCheckedVersions(checkedVersionList.get(skill.getCategoryName()).get(skill.getName()));
}
}
return skill;
}
}
return null;
}
/**
* Get Versions for Skill
*
* @param skillName
* @param categoryName
*
* @return returns a list containing all versions for this particular skill/category
*/
public List<String> getVersions(String skillName, String categoryName) {
if(versionList.containsKey(categoryName)){
if( versionList.get(categoryName).containsKey(skillName)){
return versionList.get(categoryName).get(skillName);
}
}
return null;
}
ActiveUser.java
@ManagedBean
@SessionScoped
public class ActiveUser {
private Employee selfEmployee; // the current employee object
Employee.java
@RequestScoped
public class Employee implements Comparable<Employee>, Serializable {
private static final long serialVersionUID = 4875706805440817545L;
private TreeSet<Skill> skills;
我试图展示我的所有类是如何划分范围的,而不会因为多余的代码而混乱。如果您还想要我添加更多内容,请告诉我们。
在此事先感谢您给予的任何帮助,我在这个问题上已经结束了。
答案 0 :(得分:0)
请尝试仅使用一个表单,而不要遍历h:表单。就像你在这里一样:
<ui:repeat var="cat" value="#{skillsController.masterCategories}"
varStatus="status">
<h:form
rendered="#{cat.toString().equalsIgnoreCase(skillsController.mode)||skillsController.mode.equalsIgnoreCase('Show All Skills')}">
所以你可以使用它:
<h:form>
<ui:repeat var="cat" value="#{skillsController.masterCategories}"
varStatus="status">