‹rich:tree› Пример reRender не работает Richfaces 3.3.4 final

я использую Richfaces 3.3.4 final с JSF 1.2 на SAP NetWeaver AS 7.31.

Теперь я столкнулся с некоторыми проблемами с динамическим отображением выбранных узлов из богатого: дерева в h: outputText. ВыбранныйNodeListener вызывается правильно, и имя узла сохраняется в строке, но мой h:outputText обновляется только при обновлении страницы, а не при выборе, как в примере из витрин (http://showcase-rf3.richfaces.org/richfaces/tree.jsf?tab=model&cid=26981).

Кто-нибудь знает, является ли это общей проблемой с вышеуказанной установкой или я просто что-то упустил? Насколько я знаю, SAP NetWeaver не входит в список поддерживаемых серверов, но совместим с JEE5. Может ли это быть причиной?

Я упростил пример из витрин Richfaces, чтобы воспроизвести проблему в небольшой среде. Вот некоторый код:

SimpleTreeBean.java

import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  

import org.richfaces.component.html.HtmlTree;  
import org.richfaces.event.NodeSelectedEvent;  
import org.richfaces.model.TreeNode;  
import org.richfaces.model.TreeNodeImpl;  

public class SimpleTreeBean {  
    private TreeNode rootNode = null;  
    private List<String> selectedNodeChildren = new ArrayList<String>();  

    private String nodeTitle;  


    private void loadTree() {  
            rootNode = new TreeNodeImpl();  
            TreeNodeImpl rt = new TreeNodeImpl();  
            rt.setData("Root");  
            rootNode.addChild(1, rt);  
            for(int i = 1; i <= 5; i++){  
                TreeNodeImpl child = new TreeNodeImpl();  
                child.setData("Child "+i);  
                rt.addChild(i, child);  
            }  
    }  

    public void processSelection(NodeSelectedEvent event) {  
        HtmlTree tree = (HtmlTree) event.getComponent();  
        nodeTitle = (String) tree.getRowData();  
        selectedNodeChildren.clear();  
        TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());  
        if (currentNode.isLeaf()) {  
            selectedNodeChildren.add((String) currentNode.getData());  
        } else {  
            Iterator<Map.Entry<Object, TreeNode>> it = currentNode  
                    .getChildren();  
            while (it != null && it.hasNext()) {  
                Map.Entry<Object, TreeNode> entry = it.next();  
                selectedNodeChildren.add(entry.getValue().getData().toString());  
            }  
        }  
    }  

    public TreeNode getTreeNode() {  
        if (rootNode == null) {  
            loadTree();  
        }  

        return rootNode;  
    }  

    public String getNodeTitle() {  
        return nodeTitle;  
    }  

    public void setNodeTitle(String nodeTitle) {  
        this.nodeTitle = nodeTitle;  
    }  
}  

test.jsp:

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>  
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>  
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>  
<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>  

<html>  
<head>  
<title>TestTree</title>  
</head>  
<body>  
<f:view>  
 <h:form>      
        <h:panelGrid columns="2" width="100%" columnClasses="col1,col2">  

            <rich:tree style="width:300px" nodeSelectListener="#{simpleTreeBean.processSelection}"   
                reRender="selectedNode" ajaxSubmitSelection="true"  switchType="client"  
                value="#{simpleTreeBean.treeNode}" var="item" ajaxKeys="#{null}">  
            </rich:tree>  

            <h:outputText escape="false" value="Selected Node: #{simpleTreeBean.nodeTitle}" id="selectedNode" />  

        </h:panelGrid>  
    </h:form>  
</f:view>  
</body>  
</html>  

Важная часть Faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>  

<faces-config  
    xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"  
    version="1.2">  
    <managed-bean>  
        <managed-bean-name>simpleTreeBean</managed-bean-name>  
        <managed-bean-class>  
            com.realcore.web.beans.SimpleTreeBean  
        </managed-bean-class>  
        <managed-bean-scope>session</managed-bean-scope>  
    </managed-bean>  

</faces-config>  
<</faces-config>/faces-config>  

Кроме того, в моей конфигурации Faces есть несколько валидаторов и конвертеров. Но я думаю, что это не важно для этой проблемы.

А вот и web.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    id="WebApp_ID" version="2.5">  
    <display-name>SstSapWEB</display-name>  
    <welcome-file-list>  
        <welcome-file>index.html</welcome-file>  
        <welcome-file>index.htm</welcome-file>  
        <welcome-file>index.jsp</welcome-file>  
        <welcome-file>login.jsp</welcome-file>  
        <welcome-file>default.html</welcome-file>  
        <welcome-file>default.htm</welcome-file>  
        <welcome-file>default.jsp</welcome-file>  
    </welcome-file-list>  

    <!-- Making the RichFaces skin spread to standard HTML controls -->  
    <context-param>  
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>  
        <param-value>enable</param-value>  
    </context-param>  
    <!-- Defining and mapping the RichFaces filter -->  
    <filter>  
        <display-name>RichFaces Filter</display-name>  
        <filter-name>richfaces</filter-name>  
        <filter-class>org.ajax4jsf.Filter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>richfaces</filter-name>  
        <servlet-name>Faces Servlet</servlet-name>  
        <dispatcher>REQUEST</dispatcher>  
        <dispatcher>FORWARD</dispatcher>  
        <dispatcher>INCLUDE</dispatcher>  
    </filter-mapping>  

    <servlet>  
        <servlet-name>Faces Servlet</servlet-name>  
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>Faces Servlet</servlet-name>  
        <url-pattern>/faces/*</url-pattern>  
    </servlet-mapping>  
</web-app>  

Этот простой пример тоже не работает.

Я не знаю, как исправить или обойти эту проблему. Любая помощь приветствуется.

С уважением,

Даниэль


person Daniel    schedule 20.01.2015    source источник


Ответы (1)


просто на самом деле у кого-то еще есть подобные проблемы: после работы над другими вещами в то же время я понял, как решить эту проблему.

Это было довольно просто, и вся работа выполняется в JSP:

  1. Используйте узел богатого дерева внутри тега богатого дерева
  2. Используйте атрибуты ajaxSubmitSelection и reRender TreeNode
  3. Оберните часть страницы, которая должна быть перерисована, в <a4j:outputPanel/> и установите для ее атрибута ajaxRendered значение «true».
  4. Убедитесь, что значения атрибута id <a4j:outputPanel/> и атрибута reRender узла TreeNode совпадают.

Надеюсь, это поможет другим с похожими проблемами,

Даниэль

person Daniel    schedule 17.02.2015