2016-07-19 2 views
4

문서 오브젝트 목록이있는 트리 작성 클래스 문서가 있습니다. 변경 노드의 JSF 트리 유효성 검사 양식

public class Document implements Serializable { 

    private String name; 

    private String size; 
    private List<Field> fields; 

    public Document(String name, String size, String type) { 
     this.name = name; 
     this.size = size; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getSize() { 
     return size; 
    } 

    public void setSize(String size) { 
     this.size = size; 
    } 

    public List<Field> getFields() { 
     return fields; 
    } 

    public void setFields(List<Field> fields) { 
    this.fields = fields; 
    } 
} 

또한 나는

public class Field implements Serializable { 
private int fieldIndex; 
private String label; 
private String value; 

private List<Values> list; 

public Field() { 
} 

public int getFieldIndex() { 
    return fieldIndex; 
} 

public void setFieldIndex(int fieldIndex) { 
    this.fieldIndex = fieldIndex; 
} 

public Field(String label) { 
    this.label = label; 
} 

public String getLabel() { 
    return label; 
} 

public void setLabel(String label) { 
    this.label = label; 
} 

public String getValue() { 
    return value; 
} 

public void setValue(String value) { 
    this.value = value; 
} 


public List<Values> getList() { 
    return list; 
} 


public void setList(List<Values> list) { 
    this.list = list; 
} 
} 

내 ManagedBean은 어떤 문서와 트리를 만들고 각 문서에 대한 몇 가지 데이터를 저장하는 문서에 저장 관련 정보에 대한 필드 클래스가 있습니다. 트리 노드를 선택하면 모든 필드와 입력이있는 동적 양식이 표시되어 일부 값을 입력합니다. 나는 각 필드에 제출 값이 제출 버튼 및 저장을 누르면, 또한 검증이 해고

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
<title>Default title</title> 
</h:head> 
<h:body> 
<h:panelGrid columns="2"> 
<h:form id="treeForm"> 
    <p:panel id="panel22" header="Documents" style="height:400px"> 
     <p:growl id="msgs" showDetail="true" /> 
     <p:tree value="#{treeSelectionView.root1}" var="doc" selectionMode="single" selection="#{treeSelectionView.selectedNode}" > 
      <p:ajax process="@this" event="select" update=":myForm:dymanicForm" listener="#{treeSelectionView.onNodeDocumentSelect}" />  
      <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed"> 
       <h:outputText value="#{doc.name}"/> 
      </p:treeNode> 
      <p:treeNode type="document" icon="ui-icon-document" > 
       <h:outputText value="#{doc.name}" /> 
      </p:treeNode> 

     </p:tree> 
    </p:panel> 
</h:form> 
<h:form id="myForm"> 
<p:panel id="panel222" header="Info Doccs" style="height:400px"> 

    <p:panel id="dymanicForm" >  
     <ui:repeat value="#{treeSelectionView.fields}" var="componentMetadata"> 
      <h:panelGrid columns="3"> 
       <h:outputText value="#{componentMetadata.label}"/>: 
       <h:inputText id="field" value="#{componentMetadata.value}" 
       required="true" label="#{componentMetadata.label}"/> 
      <h:message for="field" style="color:red" /></h:panelGrid> 
     </ui:repeat> 
    </p:panel> 
    <h:commandButton value="Submit" action="result" /> 
    </p:panel> 
    </h:form> 
</h:panelGrid> 
</h:body> 
</html> 

처럼

@ManagedBean(name="treeSelectionView") 
@ViewScoped 
public class SelectionView implements Serializable { 

private TreeNode root1; 

private TreeNode selectedNode; 
private String email; 

private List<Field> fields; 

public String getEmail() { 
return email; 
} 

public void setEmail(String email) { 
this.email = email; 
} 

@PostConstruct 
public void init() { 

    TreeNode root = new DefaultTreeNode(new Document("Files", "-", "Folder"), null); 

    TreeNode documents = new DefaultTreeNode(new Document("Documents", "-", "Folder"), root); 

    Field f1=new Field(); 
    Field f2=new Field(); 
    Field f3=new Field(); 

    f1.setLabel("email"); 
    f1.setValue(""); 

    f2.setLabel("doc"); 
    f2.setValue(""); 

    f3.setLabel("otro"); 
    f3.setValue(""); 

    List<Field> fields=new ArrayList<Field>(); 
    fields.add(f1); 
    fields.add(f2); 
    fields.add(f3);   

    List<Field> fields1=new ArrayList<Field>(); 
    f1=new Field(); 
    f2=new Field(); 
    f3=new Field(); 

    f1.setLabel("email"); 
    f1.setValue(""); 

    f2.setLabel("doc"); 
    f2.setValue(""); 

    f3.setLabel("otro"); 
    f3.setValue(""); 

    fields1.add(f1); 
    fields1.add(f2); 
    fields1.add(f3); 

    List<Field> fields2=new ArrayList<Field>(); 

    f1=new Field(); 
    f2=new Field(); 
    f3=new Field(); 

    f1.setLabel("email"); 
    f1.setValue(""); 

    f2.setLabel("doc"); 
    f2.setValue(""); 

    f3.setLabel("otro"); 
    f3.setValue(""); 

    fields2.add(f1); 
    fields2.add(f2); 
    fields2.add(f3);   


    //Documents 
    Document d1= new Document("Expenses.doc", "30 KB", "Word Document"); 
    Document d2=new Document("Resume.doc", "10 KB", "Word Document"); 
    Document d3=new Document("RefDoc.pages", "40 KB", "Pages Document"); 

    d1.setFields(fields); 
    d2.setFields(fields1); 
    d3.setFields(fields2); 


    TreeNode expenses = new DefaultTreeNode("document",d1, documents); 
    TreeNode resume = new DefaultTreeNode("document", d2, documents); 
    TreeNode refdoc = new DefaultTreeNode("document",d3 , documents); 
    documents.setExpanded(true); 
    root1 = root; 
    root1.setExpanded(true); 
} 


public void onNodeDocumentSelect(NodeSelectEvent nodeSelected) { 
// fields=((Document)nodeSelected.getTreeNode().getData()).getFields(); 
    fields=((Document)selectedNode.getData()).getFields(); 
} 

public TreeNode getRoot1() { 
    return root1; 
} 

public TreeNode getSelectedNode() { 
    return selectedNode; 
} 

public void setSelectedNode(TreeNode selectedNode) { 
    this.selectedNode = selectedNode; 
} 

public List<Field> getFields() { 
    return fields; 
} 

public void setFields(List<Field> fields) { 
    this.fields = fields; 
} 
} 

내 JSF 보인다. 하지만 실제로 모든 노드를 잃어 버렸을 때 제출 버튼을 제거하고 양식의 유효성을 검사해야합니다. 예를 들어 첫 번째 노드에서 초점을 잃었을 때만 양식의 유효성을 검사하지만 양식 유효성 검사가 실패하면이 노드에 있어야합니다.

정말 감사드립니다. 미리 감사드립니다.

+0

if iu 당신이 정보를 제출할 때 당신의 질문에 답을 해주세요. 모든 것이 괜찮 으면 나무를 닫아야하고 그렇지 않다면 나무를 열어야합니다. –

+0

@Neel 답장을 보내주십시오. :) –

답변

0

나는 비슷한 생각을하고 싶었고 알아 내기에는 꽤 시간이 걸렸습니다.

트릭하지<p:treeselection 속성을 선언하지만, 단지 selectionMode를 수동으로 만 리스너를 통해 선택을 관리 할 수 ​​있습니다.

이렇게하면 UPDATE_MODEL_VALUES 대신 INVOKE_APPLICATION 단계에서 선택 항목을 바꿔 값 표현식에서 오른쪽 창 참조를 유지합니다.

또한 선택 스와핑 전에 유효성이 검사되고 실패 할 경우 선택 스왑이 방지됩니다.

<h:form> 
    <p:layout fullPage="false" stateful="false" style="height:400px"> 
     <p:layoutUnit position="center"> 
      <p:tree id="tree" var="data" nodeVar="node" value="#{testTreeBean.root}" 
       selectionMode="single" dynamic="true" animate="true" highlight="true" 
       style="border: 0"> 

       <p:ajax event="select" listener="#{testTreeBean.onSelect}" process="@form" 
        update="@this @form:details" /> 
       <p:ajax event="expand" process="@this" /> 
       <p:ajax event="collapse" process="@this" /> 

       <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed"> 
        <p:outputPanel id="node"> 
         <h:outputText value="#{data.someText1} - #{data.someText2}" /> 
        </p:outputPanel> 
       </p:treeNode> 
      </p:tree> 
     </p:layoutUnit> 

     <p:layoutUnit position="east" size="65%" minSize="150"> 
      <p:outputPanel id="details" style="padding: 1em"> 
       <p:panelGrid columns="3" rendered="#{testTreeBean.data != null}"> 
        <p:outputLabel value="someLabel1" for="@next" /> 
        <p:inputText value="#{testTreeBean.data.someText1}" required="true" /> 
        <p:message for="@previous" /> 

        <p:outputLabel value="someLabel2" for="@next" /> 
        <p:inputText value="#{testTreeBean.data.someText2}" required="true" /> 
        <p:message for="@previous" /> 
       </p:panelGrid> 

       <h:outputText value="please select a node in the left pane" 
        rendered="#{testTreeBean.data == null}" /> 
      </p:outputPanel> 
     </p:layoutUnit> 
    </p:layout> 
</h:form> 

빈 :

@javax.faces.bean.ManagedBean 
@javax.faces.bean.ViewScoped 
public class TestTreeBean implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 
    private TreeNode root; 
    private TreeNode selected; 

    // build a dummy tree...  
    @PostConstruct 
    public void init() 
    { 
     root = new DefaultTreeNode(); 
     for(int i = 0; i < 5; i++) 
     { 
      SomeData data = new SomeData("node " + i, String.valueOf(System.currentTimeMillis())); 
      TreeNode node = new DefaultTreeNode(data, root); 
      for(int j = 0; j < 5; j++) 
      { 
       SomeData subData = new SomeData("subNode " + i + "." + j, String.valueOf(System.currentTimeMillis())); 
       @SuppressWarnings("unused") 
       TreeNode subNode = new DefaultTreeNode(subData, node); 
      } 
     } 
    } 

    // handle selection swap manually 
    public void onSelect(NodeSelectEvent event) 
    { 
     if(selected != null) 
     { 
      selected.setSelected(false); 
     } 

     selected = event.getTreeNode(); 

     if(selected != null) 
     { 
      selected.setSelected(true); 
     } 
    } 

    // shortcut for getting the selected node data 
    public Object getData() 
    { 
     return selected == null ? null : selected.getData(); 
    } 

    public TreeNode getSelected() 
    { 
     return selected; 
    } 

    public TreeNode getRoot() 
    { 
     return root; 
    } 
} 

마지막으로, 완전성, 더미 데이터 클래스 :

나는 이것이 당신이 찾고있는 정확하게 생각

public class SomeData implements Serializable 
{ 
    private String someText1; 
    private String someText2; 

    public SomeData() 
    { 
     super(); 
    } 

    public SomeData(String someText1, String someText2) 
    { 
     super(); 
     this.someText1 = someText1; 
     this.someText2 = someText2; 
    } 

    public String getSomeText1() 
    { 
     return someText1; 
    } 

    public void setSomeText1(String someText1) 
    { 
     this.someText1 = someText1; 
    } 

    public String getSomeText2() 
    { 
     return someText2; 
    } 

    public void setSomeText2(String someText2) 
    { 
     this.someText2 = someText2; 
    } 
} 

해피 원예 :