无法从h:selectManyCheckbox返回修改后的值

时间:2014-07-07 15:38:26

标签: jsf jsf-2

我最近被安排在一个项目中,为现有的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;

我试图展示我的所有类是如何划分范围的,而不会因为多余的代码而混乱。如果您还想要我添加更多内容,请告诉我们。

在此事先感谢您给予的任何帮助,我在这个问题上已经结束了。

1 个答案:

答案 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">