我已经在即将出版的PrimeFaces Cookbook 2版中写了一篇关于食谱的博客。 在这篇文章中,我想发表第二篇关于一个名为Dialog Framework的小型框架的文章。 我个人喜欢它,因为我记得我为使用Struts框架付出同样的努力而付出的代价。 当您想将外部页面加载到弹出窗口中并向该页面提交一些数据时,您必须使用隐藏表单调用window.open ,将传递的值设置为隐藏字段,通过JavaScript将表单提交给外部页面,然后等到该页面已准备好在window.onloaddocument.ready 。 很多繁琐的工作。 PrimeFaces可以为您完成这项工作,此外, p:dialog还提供了漂亮的用户界面来替代弹出窗口。

PrimeFaces对话框的常规用法是使用p:dialog的声明方法。 除了这种声明式方法之外,还有一种编程方法。 编程方法基于编程API,其中在运行时创建和销毁对话框。 它称为Dialog Framework 。 对话框框架用于在动态生成的对话框中打开外部页面。 用法很简单, RequestContext提供两个方法: openDialogcloseDialog允许打开和关闭动态对话框。 此外,对话框架使将数据从对话中显示的页面传回至调用者页面成为可能。

在本食谱中,我们将演示Dialog Framework中可用的所有功能。 我们将以编程方式打开一个带有选项的对话框,并将参数传递给该对话框中显示的页面。 我们还将满足在源(调用方)页面和对话框之间进行通信的可能性。

做好准备

Dialog Framework在faces-config.xml需要以下配置:

<application><action-listener>org.primefaces.application.DialogActionListener</action-listener><navigation-handler>org.primefaces.application.DialogNavigationHandler</navigation-handler><view-handler>org.primefaces.application.DialogViewHandler</view-handler>
</application>

怎么做…

我们将开发一个带有单选按钮的页面,以选择一本可用的PrimeFaces图书进行评级。 单击按钮“ Rate the selected book后,评分本身将在对话框中发生。

屏幕快照的XHTML代码段在下面列出。

<p:messages id="messages" showSummary="true" showDetail="false"/><p:selectOneRadio id="books" layout="pageDirection" value="#{dialogFrameworkBean.bookName}"><f:selectItem itemLabel="PrimeFaces Cookbook" itemValue="PrimeFaces Cookbook"/><f:selectItem itemLabel="PrimeFaces Starter" itemValue="PrimeFaces Starter"/><f:selectItem itemLabel="PrimeFaces Beginner's Guide" itemValue="PrimeFaces Beginner's Guide"/><f:selectItem itemLabel="PrimeFaces Blueprints" itemValue="PrimeFaces Blueprints"/>
</p:selectOneRadio><p:commandButton value="Rate the selected book"process="@this books"actionListener="#{dialogFrameworkBean.showRatingDialog}"style="margin-top: 15px"><p:ajax event="dialogReturn" update="messages" listener="#{dialogFrameworkBean.onDialogReturn}"/>
</p:commandButton>

对话框中的页面是整页bookRating.xhtml其中包含Rating组件p:rating 。 它还显示选择进行评级的书的名称。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://xmlns.jcp.org/jsf/core"xmlns:h="http://xmlns.jcp.org/jsf/html"xmlns:p="http://primefaces.org/ui">
<f:view contentType="text/html" locale="en"><f:metadata><f:viewParam name="bookName" value="#{bookRatingBean.bookName}"/></f:metadata><h:head><title>Rate the book!</title></h:head><h:body><h:form>What is your rating for the book <strong>#{bookRatingBean.bookName}</strong>?<p/><p:rating id="rating"><p:ajax event="rate" listener="#{bookRatingBean.onrate}"/><p:ajax event="cancel" listener="#{bookRatingBean.oncancel}"/></p:rating></h:form></h:body>
</f:view>
</html>

下一个屏幕截图演示了对话框的外观。

单击等级星级或取消符号将关闭对话框。 源(呼叫者)页面显示一条消息,其中所选的评级值在0到5之间。

最有趣的部分是bean中的逻辑。 豆DialogFrameworkBean通过调用方法打开的对话框中的等级页面openDialog()与结果,选项和POST参数上RequestContext实例。 此外,bean定义了一个AJAX侦听器onDialogReturn() ,当对话框关闭后从对话框返回数据(选定的评级)时,将调用该侦听onDialogReturn()

@Named
@ViewScoped
public class DialogFrameworkBean implements Serializable {private String bookName;public void showRatingDialog() {Map<String, Object> options = new HashMap<String, Object>();options.put("modal", true);options.put("draggable", false);options.put("resizable", false);options.put("contentWidth", 500);options.put("contentHeight", 100);options.put("includeViewParams", true);Map<String, List<String>> params = new HashMap<String, List<String>>();List<String> values = new ArrayList<String>();values.add(bookName);params.put("bookName", values);RequestContext.getCurrentInstance().openDialog("/views/chapter11/bookRating", options, params);}public void onDialogReturn(SelectEvent event) {Object rating = event.getObject();FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "You rated the book with " + rating, null);FacesContext.getCurrentInstance().addMessage(null, message);}// getters / setters...
}

Bean BookRatingBeanRating component定义了两个侦听器。 当用户分别单击星号和取消符号时,将调用它们。 我们呼吁有closeDialog()RequestContext实例来触发对话框关闭和额定电流值传递给听众提到onDialogReturn()

@Named
@RequestScoped
public class BookRatingBean {private String bookName;public void onrate(RateEvent rateEvent) {RequestContext.getCurrentInstance().closeDialog(rateEvent.getRating());}public void oncancel() {RequestContext.getCurrentInstance().closeDialog(0);}// getters / setters...
}

怎么运行的…

RequestContext提供了两个同名openDialog方法,可在运行时动态打开对话框。 第一个只有一个参数–用于解决导航案例的逻辑结果。 第二个参数包含三个参数-结果,对话框的配置选项和发送到对话框中显示的视图的参数。 在示例中,我们使用了第二个变体。 选项作为键值对放入Map中。 参数也放入Map 。 在我们的案例中,我们输入所选书籍的名称。 之后,通过f:viewParam在对话框页面bookRating.xhtml接收该名称。 f:viewParam将传输的参数设置到BookRatingBean ,以便在Rating组件上方的标题中可用。

提示:请参阅《 PrimeFaces用户指南》以查看支持的对话框的配置选项的完整列表。

让我们经历一下请求-响应生命周期。 一旦收到由命令按钮引起的请求响应,便会创建一个对话框,其中包含iframeiframe的URL指向整页,在本例中为bookRating.xhtml 。 该页面将向下流并显示在对话框中。 如您所见,总是有两个请求:第一个初始POST和第二个GET由iframe发送。 请注意,对话框框架仅适用于初始AJAX请求。 非AJAX请求将被忽略。 另请注意,对话框的标题取自HTML title元素。

正如我们上面已经提到,这个对话框可以通过编程关闭invoking该方法closeDialogRequestContext实例。 在调用者页面上,触发对话框的按钮需要具有一个dialogReturn事件的AJAX侦听器,以便能够从对话框接收任何数据。 数据作为参数传递给方法closeDialog(Object data) 。 在示例中,我们传递了一个正整数值rateEvent.getRating()0

翻译自: https://www.javacodegeeks.com/2015/01/primefaces-opening-external-pages-in-dynamically-generated-dialog.html

PrimeFaces:在动态生成的对话框中打开外部页面相关推荐

  1. primefaces_PrimeFaces:在动态生成的对话框中打开外部页面

    primefaces 我已经在即将出版的PrimeFaces Cookbook版本2中写过一篇食谱的博客. 在这篇文章中,我想发表第二篇关于一个名为Dialog Framework的小型框架的文章. ...

  2. PyQt5在对话框中打开外部链接的方法

    利用PyQt5部分控件的Link属性链接 PyQt5有几个控件带有 setOpenExternalLinks , 如 QLabel.QTextLabel . QTextBrowser 等 当 setO ...

  3. alert获取输入框内容_获取由 AlertDialog 生成的对话框中EditText的文本内容

    在Android开发中,AlertDialog常用于处理用户的登录等.那么如何获取由 AlertDialog 生成的对话框中EditText的文本内容呢? 其实Alertdialog弹出的Activi ...

  4. WebBrowser中打开新页面

    前几天写的网上订舱辅助系统,物流组反馈如果遇到意外情况,网站弹出交互新窗口,可是内容却看不到.测试后发现是由于新窗口打开在IE中,与当前会话失去了联系,所以要求重新登录,流程不能继续,要解决这个问题, ...

  5. html页面中使用 JS 返回上一页及返回上一页并刷新,iframe中打开指定页面,跳转到指定页面

    html页面中使用 JS 返回上一页及返回上一页并刷新,iframe中打开指定页面,跳转到指定页面. 常用方法: window.history.go(-1); //返回上一页 window.histo ...

  6. ajax无法open,ajax中打开新页面使用window.open方法被拦截的解决方法

    $('.testA').unbind('click').bind('click',function(){ var result=""; $.ajax({ url:'http://l ...

  7. c#窗体应用程序链接本地html网页,C#实现Winform中打开网页页面的方法

    本文实例讲述了C#实现Winform中打开网页页面的方法.分享给大家供大家参考.具体实现方法如下: 1.首先比较简单的我们知道有类似的方法如下 System.Diagnostics.Process.S ...

  8. 网页中嵌入外部页面的四种方法

    一.应用框架技术  ---- 要在宿主页面中嵌入外部页面的方法是,在宿主页面中包含外部页面的位置插入"< IFRAME name="XXX" width=X hei ...

  9. 弹出新网页在新的对话框中打开

    首先用VS2008新建基于对话框的MFC应用程序,添加webbrowser控件,Navigate导航! 具体看上篇blog http://blog.csdn.net/LightBoat09/archi ...

最新文章

  1. STM32 基础系列教程 7 - 单脉冲PWM
  2. 跟我学大数据分析:多维度数据分析报告
  3. buu [BJDCTF 2nd]rsa1
  4. Python | numpy | np.split()与np.array_split()函数
  5. XML文档注释(C#)
  6. 如何在开源社区贡献代码_如何在15分钟内从浏览器获得您的第一个开源贡献
  7. MongoDB基本概念和常用操作(二)
  8. Python入门7_抽象进阶
  9. 电磁波考试中可以用计算机吗,计算机考试试题库带答案(8页)-原创力文档
  10. java在未来_如何在java中创建一个完整的未来
  11. 赌一把:整合了30家独立报告后,我发现了2020年的五大安全趋势
  12. 基于模型与不基于模型的深度增强学习_CVPR2018: 基于时空模型无监督迁移学习的行人重识别...
  13. PyTorch 入坑六 数据处理模块Dataloader、Dataset、Transforms
  14. 【转】Linux内存管理(最透彻的一篇)
  15. java题目青蛙跳杯子_历届试题 青蛙跳杯子
  16. 在MacOS Big Sur中使用Safari 翻译功能的方法
  17. 无线覆盖技术的重要性
  18. Java如何在一行内输入若干个整数
  19. android自定义素材拼图,美图秀秀Android新版 拼图排版秀北爱
  20. Chrome插件有哪些?

热门文章

  1. 2020蓝桥杯省赛---java---B---10(整数小拼接)
  2. 生成方法中参数的注释
  3. JDBC8.0 URL配置
  4. mybatis=<>的写法
  5. 19年8月 字母哥 第六章 生命周期内的拦截过滤与监听 用热点公司网不行
  6. linux 提取cpio_15. Linux提取RPM包文件(cpio命令)详解
  7. 字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)
  8. ssh无密码登陆权威指南
  9. i18n国际化登录页面
  10. 并发查询parallel_惯用并发:flatMap()与parallel()– RxJava常见问题解答