单击Primefaces菜单项时使用AJAX动态加载xhtml页面
当在左侧部分选择菜单项时,我需要在主内容部分动态加载xhtml页面,从而避免页面刷新 我在左边创建了一个Prime Faces动态面板菜单,其中包含子菜单列表和每个子菜单的菜单项。根据登录用户的角色动态加载菜单。选择菜单项时,会调用相应的操作侦听器,但不会加载或显示页面 该应用程序是使用Prime Faces 3.4.1/JSP 2.0/Spring Framework 3.1.1开发的 有关应用程序背景的更多信息 屏幕布局分为四个部分 标题-所有人通用的徽标和图标 页脚-包含页脚信息 左侧栏-包含菜单。这是根据登录用户的角色动态填充的 主要内容-显示与左侧所选菜单项对应的实际.xhtml页面 我使用了Facelet模板来定义布局和内容。下面是定义的模板 layoutTemplate.xhtml单击Primefaces菜单项时使用AJAX动态加载xhtml页面,primefaces,Primefaces,当在左侧部分选择菜单项时,我需要在主内容部分动态加载xhtml页面,从而避免页面刷新 我在左边创建了一个Prime Faces动态面板菜单,其中包含子菜单列表和每个子菜单的菜单项。根据登录用户的角色动态加载菜单。选择菜单项时,会调用相应的操作侦听器,但不会加载或显示页面 该应用程序是使用Prime Faces 3.4.1/JSP 2.0/Spring Framework 3.1.1开发的 有关应用程序背景的更多信息 屏幕布局分为四个部分 标题-所有人通用的徽标和图标 页脚-包含页脚信息 左侧栏-
射频
主屏幕布局
以下是包含上述模板的主屏幕布局。我已经包括了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) {
}
}
}