Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单击Primefaces菜单项时使用AJAX动态加载xhtml页面_Primefaces - Fatal编程技术网

单击Primefaces菜单项时使用AJAX动态加载xhtml页面

单击Primefaces菜单项时使用AJAX动态加载xhtml页面,primefaces,Primefaces,当在左侧部分选择菜单项时,我需要在主内容部分动态加载xhtml页面,从而避免页面刷新 我在左边创建了一个Prime Faces动态面板菜单,其中包含子菜单列表和每个子菜单的菜单项。根据登录用户的角色动态加载菜单。选择菜单项时,会调用相应的操作侦听器,但不会加载或显示页面 该应用程序是使用Prime Faces 3.4.1/JSP 2.0/Spring Framework 3.1.1开发的 有关应用程序背景的更多信息 屏幕布局分为四个部分 标题-所有人通用的徽标和图标 页脚-包含页脚信息 左侧栏-

当在左侧部分选择菜单项时,我需要在主内容部分动态加载xhtml页面,从而避免页面刷新

我在左边创建了一个Prime Faces动态面板菜单,其中包含子菜单列表和每个子菜单的菜单项。根据登录用户的角色动态加载菜单。选择菜单项时,会调用相应的操作侦听器,但不会加载或显示页面

该应用程序是使用Prime Faces 3.4.1/JSP 2.0/Spring Framework 3.1.1开发的

有关应用程序背景的更多信息 屏幕布局分为四个部分

标题-所有人通用的徽标和图标 页脚-包含页脚信息 左侧栏-包含菜单。这是根据登录用户的角色动态填充的 主要内容-显示与左侧所选菜单项对应的实际.xhtml页面

我使用了Facelet模板来定义布局和内容。下面是定义的模板

layoutTemplate.xhtml

射频
主屏幕布局 以下是包含上述模板的主屏幕布局。我已经包括了header.xhtml、footer.xhtml和rfleft.xhtml,其中包含动态填充的菜单。在中,我将从JSF支持bean加载页面

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core">

<h:body>
    <ui:composition template="/pages/protected/templates/layoutTemplate.xhtml">

        <ui:define name="pageHeader">
            <ui:include src="/pages/protected/templates/loginHeader.xhtml">
            </ui:include>
        </ui:define>
        <ui:define name="leftPanel">
            <ui:include src="/pages/protected/templates/rfleft.xhtml">
            </ui:include>
        </ui:define>
        <ui:define name="mainContent">
              <ui:include id="mainPage" src="#{menuMB.screenName}">
              </ui:include>
        </ui:define>
        <ui:define name="footer">
            <ui:include src="/pages/protected/templates/footer.xhtml">
            </ui:include>
        </ui:define>

    </ui:composition>

</h:body>

</html>

Left菜单动态加载菜单(rfleft.xhtml)

JSF支持Bean
@SessionScoped
@ManagedBean(name=“menuMB”)
公共类MenuMB实现了可序列化{
@ManagedProperty(value=“#{LoginService}”)
ILoginService登录服务;
私有字符串screenName=“”;
字符串menuUrl=“”;
用户loggedUser=null;
私有列表fmList=null;
private MenuModel mnuModel=new DefaultMenuModel();
公共菜单(){
loggedUser=(用户)RFContextUtil.getSessionFromContext(“用户”);
}
@施工后
公共void加载菜单(){
if(loggedUser!=null){
//加载要由登录用户执行的操作。加载为菜单项
fmList=loginService.getMenuForUser(loggedUser.getUserID());
}
创建菜单(fmList);
}
私有void创建菜单(列表fmList){
试一试{
如果(fmList!=null){
用于(FunctionMaster子模块:fmList){
if(sub.getParentFunctionID()==0){
子菜单rfSubMenu=新建子菜单();
rfSubMenu.setLabel(sub.getScreenDisplayName());
getMnuModel().addSubmenu(rfSubMenu);
对于(FunctionMaster项:fmList){
if(item.getParentFunctionID()!=0){
if(item.getParentFunctionID()=子.getFunctionID()){
MenuItem rfSubItem=new MenuItem();
rfSubItem.setId(item.getFunctionName()+item.getFunctionID().toString());
rfSubItem.setValue(item.getScreenDisplayName());
rfSubItem.setImmediate(true);
rfSubItem.setProcess(“@form”);
rfSubItem.setPartialSubmit(true);
rfSubItem.setUpdate(“:mainOutputPanel”);
rfSubItem.setAjax(true);
rfSubItem.setRendered(true);
//添加操作侦听器
ExpressionFactory=FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
MethodExpression methodExpr=factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(),“#{menuMB.loadScreenFromMenu}”,Void.class,新类[]{ActionEvent.class});
MethodExpressionActionListener actionListener=新的MethodExpressionActionListener(methodExpr);
rfSubItem.addActionListener(actionListener);
rfSubMenu.getChildren().add(rfSubItem);
}
}
}
}
}
}
}捕获(例外情况除外){
字符串EXEP=ex.getMessage();
}
}
public void loadScreenFromMenu(操作事件){
MenuItem MenuItem=(MenuItem)事件。getComponent();
字符串属性名;
试一试{
if(menuItem!=null){
screenName=RequestFactoryContextUtil.getResourceBundleString(menuItem.getId());
//设置需要显示的屏幕。这是主屏幕布局中使用的属性
设置屏幕名称(屏幕名称);
}
}捕获(异常exc){
}
}
}
感谢您的帮助

-Baskar

看看这个答案“[将JSF页面加载到另一个JSP页面][1]”,它将帮助您。[1]:
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core">

<h:body>
    <ui:composition template="/pages/protected/templates/layoutTemplate.xhtml">

        <ui:define name="pageHeader">
            <ui:include src="/pages/protected/templates/loginHeader.xhtml">
            </ui:include>
        </ui:define>
        <ui:define name="leftPanel">
            <ui:include src="/pages/protected/templates/rfleft.xhtml">
            </ui:include>
        </ui:define>
        <ui:define name="mainContent">
              <ui:include id="mainPage" src="#{menuMB.screenName}">
              </ui:include>
        </ui:define>
        <ui:define name="footer">
            <ui:include src="/pages/protected/templates/footer.xhtml">
            </ui:include>
        </ui:define>

    </ui:composition>

</h:body>

</html>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core">


<h:body>

    <h:form id="leftMainForm">
        <p:panelMenu style="width:200px" model="#{menuMB.mnuModel}">
        </p:panelMenu>
    </h:form>

</h:body>
</html>
@SessionScoped
@ManagedBean(name = "menuMB")
public class MenuMB implements Serializable {

@ManagedProperty(value = "#{LoginService}")
ILoginService loginService;

private String screenName = "";

String menuUrl = "";

User loggedUser = null;
private List<FunctionMaster> fmList = null;
private MenuModel mnuModel = new DefaultMenuModel();

public MenuMB() {
    loggedUser = (User) RFContextUtil.getSessionFromContext("user");
}

@PostConstruct
public void loadMenu() {
    if (loggedUser != null) {

       //Load the actions to be performed by the logged user . Loading as menu item
        fmList = loginService.getMenuForUser(loggedUser.getUserID());
    }

    createMenu(fmList);
}

private void createMenu(List<FunctionMaster> fmList) {

    try {
        if (fmList != null) {
            for (FunctionMaster sub : fmList) {
                if (sub.getParentFunctionID() == 0) {
                    Submenu rfSubMenu = new Submenu();
                    rfSubMenu.setLabel(sub.getScreenDisplayName());
                    getMnuModel().addSubmenu(rfSubMenu);

                    for (FunctionMaster item : fmList) {
                        if (item.getParentFunctionID() != 0) {
                            if (item.getParentFunctionID() == sub.getFunctionID()) {
                                MenuItem rfSubItem = new MenuItem();

                                rfSubItem.setId(item.getFunctionName() + item.getFunctionID().toString());
                                rfSubItem.setValue(item.getScreenDisplayName());

                                rfSubItem.setImmediate(true);
                                rfSubItem.setProcess("@form");
                                rfSubItem.setPartialSubmit(true);
                                rfSubItem.setUpdate(":mainOutputPanel");
                                rfSubItem.setAjax(true);
                                rfSubItem.setRendered(true);

                                //Adding Action Listener

                                ExpressionFactory factory =                FacesContext.getCurrentInstance().getApplication().getExpressionFactory();

                                 MethodExpression methodExpr = factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), "#{menuMB.loadScreenFromMenu}", Void.class, new Class[]{ActionEvent.class});

                                 MethodExpressionActionListener actionListener = new MethodExpressionActionListener(methodExpr);

                                 rfSubItem.addActionListener(actionListener);
                                 rfSubMenu.getChildren().add(rfSubItem);

                            }
                        }
                    }
                }

            }
        }
    } catch (Exception ex) {
        String excep = ex.getMessage();
    }

}


public void loadScreenFromMenu(ActionEvent event) {
    MenuItem menuItem = (MenuItem) event.getComponent();
    String attrName;

    try {
        if (menuItem != null) {

            screenName = RequestFactoryContextUtil.getResourceBundleString(menuItem.getId());

             //Set the screen that needs to be displayed. This is the property that is used in the Main Screen layout

            setScreenName(screenName);

        }
    } catch (Exception exc) {

    }

}
}