- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的 Vaadin 8 Web 应用程序中,我希望用户能够通过单击按钮在另一个窗口中打开报告。内容将由 Vaadin 应用程序使用纯 HTML5 而不是使用 Vaadin 小部件生成。
Vaadin 8 手册有一页 Handling Browser Windows .它显示了 BrowserWindowOpener
的使用对象打开一个新窗口。但是那个窗口包含一个 Vaadin UI
子类,而我想生成自己的 HTML 内容。
传递信息(例如数据库标识符值)的奖励积分。
最佳答案
这是一个完整的示例应用程序,内置于 Vaadin 8.5.1。我们将 UUID 作为文本呈现在 TextField
中,带有一个按钮,可以打开第二个窗口,显示一个网页,其中包含由我们的 Vaadin 应用程序生成的 HTML,而无需使用 Vaadin 小部件或布局。来自该字段的 id 被传递到新窗口,在实际应用程序中可用于数据库查找。
如手册中该页面所示,您确实需要使用 BrowserWindowOpener
(或 Link
)。由于浏览器常见的安全限制,这必须在用户单击按钮之前提前配置。因此,与其在按钮的单击监听器中编写代码,我们必须更早地配置 BrowserWindowOpener
对象,并与按钮相关联。
定义用户单击以生成报告的按钮。
Button webPageButton = new Button( "Generate Person report" );
String servletPath = VaadinServlet.getCurrent().getServletContext().getContextPath(); // URL for this web app at runtime.
Person
要从数据库加载的对象。所以我们发明了
person.html
作为在我们的 URL 中请求的资源。
ExternalResource
类(class)。
Resource resource = new ExternalResource( servletPath + "/person.html" ); // Defining an external resource as a URL that is not really so external -- will call back into this same web app.
Resource
对象在手,我们准备定义
BrowserWindowOpener
.
BrowserWindowOpener webPageOpener = new BrowserWindowOpener( resource );
webPageOpener.setWindowName( "Person ID: " + personUuid.getValue() ); // Set title of the new window to be opened.
person.html?person_id= f0e32ddc-18ed-432c-950b-eda3f3e4a80d
.该值必须是文本值,因此我们使用规范的 36 字符十六进制字符串表示
UUID 的 128 位。作为我们的数据库标识符。我们给这个值一个任意的键名,比如
person_id
.
String param = "person_id";
webPageOpener.setParameter( param , personUuid.getValue() );
width=800,height=600,resizable
.我们将在运行时插入该宽度和高度。
String windowFeaturesString = String.format( "width=%d,height=%d,resizable" , Page.getCurrent().getBrowserWindowWidth() , Page.getCurrent().getBrowserWindowHeight() ) ; // Same size as original window.
webPageOpener.setFeatures( windowFeaturesString ); // Example: "width=800,height=600,resizable".
webPageOpener.extend( webPageButton ); // Associate opener with button.
System.out.println( "TRACE BrowserWindowOpener URL: " + webPageOpener.getUrl() );
person.html
的传入 URL。我们在上面指定的 URL。我们通过实现
RequestHandler
来做到这一点。界面。见
the manual .
RequestHandler
我们做四件事:
UUID
来自该十六进制字符串的对象。 UUID
对象生成要在此新窗口中显示的 HTML 的例程。 VaadinResponse
在新窗口中显示该 HTML通过 Java Servlet 技术传递回用户 Web 浏览器的对象。 RequestHandler
实现,并将实例注册到用户的 session 中,一个
VaadinSession
目的。
VaadinSession.getCurrent().addRequestHandler(
new RequestHandler() {
@Override
public boolean handleRequest ( VaadinSession session ,
VaadinRequest request ,
VaadinResponse response )
throws IOException {
if ( "/panel.html".equals( request.getPathInfo() ) ) {
// Retrieve the hex-string of the UUID from the URL’s query string parameter.
String uuidString = request.getParameter( "person_id" ); // In real-work, validate the results here.
UUID uuid = UUID.fromString( uuidString ); // Reconstitute a `UUID` object from that hex-string. In real-work, validate the results here.
System.out.println( "UUID object reconstituted from string passed as parameter in query string of URL opened in new window: " + uuid );
// Build HTML.
String html = renderHtml( uuid );
// Send out the generated text as HTML, in UTF-8 character encoding.
response.setContentType( "text/html; charset=utf-8" );
response.getWriter().append( html );
return true; // We wrote a response
} else
return false; // No response was written
}
} );
// Generate the HTML to report on the details of a `person` from the database, given the UUID of that database row.
private String renderHtml ( UUID uuid ) {
String eol = "\n"; // End-of-line character(s) to use in the HTML.
StringBuilder html = new StringBuilder();
html.append( "<!DOCTYPE html>" ).append( eol );
html.append( "<html>" ).append( eol );
html.append( "<head>" ).append( eol );
html.append( "<title>Person</title>" ).append( eol );
html.append( "</head>" ).append( eol );
html.append( "<body style='color:DarkSlateGray' >" ).append( eol );
html.append( "<h1>Demo</h1>" ).append( eol );
html.append( "<p>This is a drill. This is only a drill.</p>" ).append( eol );
html.append( "<p>If this had been a real application, you would have seen some data.</p>" ).append( eol );
html.append( "<p>Person ID: " ).append( uuid.toString() ).append( ".</p>" ).append( eol );
html.append( "<p style='color:DimGray ; font-family: Pragmata Hack Menlo monospaced' >Report generated " ).append( Instant.now() ).append( ".</p>" ).append( eol );
html.append( "</body>" ).append( eol );
html.append( "</html>" ).append( eol );
String s = html.toString();
return s;
}
<!DOCTYPE html>
<html>
<head>
<title>Person</title>
</head>
<body style='color:DarkSlateGray' >
<h1>Demo</h1>
<p>This is a drill. This is only a drill.</p>
<p>If this had been a real application, you would have seen some data.</p>
<p>Person ID: cc5e975b-2632-4c92-a1cb-b25085c60e60.</p>
<p style='color:DimGray ; font-family: Pragmata , Hack , Menlo , monospace' >Report generated 2018-08-05T02:33:13.028594Z.</p>
</body>
</html>
MyUI.java
的内容文件首先由 Vaadin Ltd 公司提供的最简单的 Maven 原型(prototype)生成。
package com.basilbourque.example;
import javax.servlet.annotation.WebServlet;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.*;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import java.io.IOException;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.UUID;
/**
* This UI is the application entry point. A UI may either represent a browser window
* (or tab) or some part of an HTML page where a Vaadin application is embedded.
* <p>
* The UI is initialized using {@link #init(VaadinRequest)}. This method is intended to be
* overridden to add component to the user interface and initialize non-component functionality.
*/
@Theme ( "mytheme" )
public class MyUI extends UI {
@Override
protected void init ( VaadinRequest vaadinRequest ) {
final VerticalLayout layout = new VerticalLayout();
TextField personUuid = new TextField( "UUID of Person:" );
personUuid.setWidth( 22 , Unit.EM );
personUuid.setValue( UUID.randomUUID().toString() );
personUuid.setReadOnly( true );
Button webPageButton = new Button( "Generate Person report" );
webPageButton.setWidthUndefined();
webPageButton.addClickListener( e -> {
System.out.println( "Button clicked. " + ZonedDateTime.now() );
} );
// Configure web page opener object. Must be done *before* user clicks on button, not after.
String servletPath = VaadinServlet.getCurrent().getServletContext().getContextPath(); // URL for this web app at runtime.
Resource resource = new ExternalResource( servletPath + "/person.html" ); // Defining an external resource as a URL that is not really so external -- will call back into this same web app.
BrowserWindowOpener webPageOpener = new BrowserWindowOpener( resource );
webPageOpener.setWindowName( "Person ID: " + personUuid.getValue() ); // Set title of the new window to be opened.
String param = "person_id";
webPageOpener.setParameter( param , personUuid.getValue() );
String windowFeaturesString = String.format( "width=%d,height=%d,resizable" , Page.getCurrent().getBrowserWindowWidth() , Page.getCurrent().getBrowserWindowHeight() ); // Same size as original window.
webPageOpener.setFeatures( windowFeaturesString ); // Example: "width=800,height=600,resizable".
webPageOpener.extend( webPageButton ); // Connect opener with button.
System.out.println( "TRACE BrowserWindowOpener URL: " + webPageOpener.getUrl() );
layout.addComponents( personUuid , webPageButton );
setContent( layout );
// A request handler for generating some content
VaadinSession.getCurrent().addRequestHandler(
new RequestHandler() {
@Override
public boolean handleRequest ( VaadinSession session ,
VaadinRequest request ,
VaadinResponse response )
throws IOException {
if ( "/person.html".equals( request.getPathInfo() ) ) {
// Retrieve the hex-string of the UUID from the URL’s query string parameter.
String uuidString = request.getParameter( "person_id" ); // In real-work, validate the results here.
UUID uuid = UUID.fromString( uuidString ); // Reconstitute a `UUID` object from that hex-string. In real-work, validate the results here.
System.out.println( "UUID object reconstituted from string passed as parameter in query string of URL opened in new window: " + uuid );
// Build HTML.
String html = renderHtml( uuid );
// Send out the generated text as HTML, in UTF-8 character encoding.
response.setContentType( "text/html; charset=utf-8" );
response.getWriter().append( html );
return true; // We wrote a response
} else
return false; // No response was written
}
} );
}
// Generate the HTML to report on the details of a `person` from the database, given the UUID of that database row.
private String renderHtml ( UUID uuid ) {
String eol = "\n"; // End-of-line character(s) to use in the HTML.
StringBuilder html = new StringBuilder();
html.append( "<!DOCTYPE html>" ).append( eol );
html.append( "<html>" ).append( eol );
html.append( "<head>" ).append( eol );
html.append( "<title>Person</title>" ).append( eol );
html.append( "</head>" ).append( eol );
html.append( "<body style='color:DarkSlateGray' >" ).append( eol );
html.append( "<h1>Demo</h1>" ).append( eol );
html.append( "<p>This is a drill. This is only a drill.</p>" ).append( eol );
html.append( "<p>If this had been a real application, you would have seen some data.</p>" ).append( eol );
html.append( "<p>Person ID: " ).append( uuid.toString() ).append( ".</p>" ).append( eol );
html.append( "<p style='color:DimGray ; font-family: Pragmata , Hack , Menlo , monospace' >Report generated " ).append( Instant.now() ).append( ".</p>" ).append( eol );
html.append( "</body>" ).append( eol );
html.append( "</html>" ).append( eol );
String s = html.toString();
System.out.println( "\n\n" + s + "\n\n" );
return s;
}
@WebServlet ( urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true )
@VaadinServletConfiguration ( ui = MyUI.class, productionMode = false )
public static class MyUIServlet extends VaadinServlet {
}
}
关于java - 从 Vaadin 8 应用程序生成 HTML 页面并在新窗口中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51691041/
我有一个示例应用程序,包含以下三个步骤 输入用户详细信息 -> 个人详细信息 -> 完成 当我点击一个链接时,它会调用我的 vaadin 应用程序。问题是一旦我的三步过程完成,当我再次尝试点击我的 v
我希望框架捕获每个未捕获的异常并显示适当的通知消息。 因此我在我的 UI 中设置了一个自定义的 ErrorHandler(灵感来自“Book of Vaadin”:https://vaadin.com
我在 Vaadin 有一张 table 。一列是 String 类型,因此其大小是可变的。因此,我想让列的宽度固定(具有扩展比率),但每行的高度应该是可变的(根据其内容 - 字符串)。 即,这是预期的
有谁知道用于 vaadin 框架的数据可视化(图表、饼图等)的任何 UI 组件库? 最佳答案 我建议 dChart: https://vaadin.com/directory#!addon/dchar
我在 Grid 中使用 BeanItemContainer 来显示我的数据。我需要根据单元格中的数据分别为每个单元格着色。 最佳答案 section about the Grid在 Vaadin 的书
在我的一个应用程序中,我创建了一个页脚: public Footer(){ hl.setHeight("120px"); hl.setWidth("100%");
是否有任何特定方法可以在 Vaadin 表中实现分页/延迟加载。 我试图找到一些文档,但我找不到。 最佳答案 使用Viritin add-on及其 MTable 组件。 I 是最有效的(服务器资源副)
我正在尝试使用 Vaadin Charts 创建饼图。 这段代码为图表添加了漂亮的标签,但小数点 t 后两位数字就足够了。 dataLabels.setFormatter("''+ this.poi
我是 vaadin 框架的新手,一切正常,直到......表头没有正确显示,......我正在开发一个在 exoplatform 上运行的 portlet,我正在使用 vaadin 6,我的表只显示第
我有一个带有基于复杂查询填充数据的表的页面(即使我使用分页也需要很多时间)。我使用 BeanItemcontainer 将数据加载到表中。现在遇到问题,我希望以异步方式将数据加载到表中(在用户屏幕上加
我有一个现有的应用程序(在 WebGuiToolkit.org 中编写),我正在尝试在其中嵌入一个 Vaadin 14 页面。 我看过几个 Vaadin 8 指南,比如 https://vaadin.
更改pom.xml文件的vaadin版本号和vaadin插件版本号后构建失败 7.4.5 7.4.5 然后我尝试清理并重建项目,但显示构建失败: Copying 3 resources --- va
我想通过更改文件列表中元素的外观来设置 Vaadin Upload 组件 (vaadin-upload) 的样式,例如隐藏命令按钮(开始、删除、重试)。文件列表包含 vaadin-upload-fil
如何向文本字段、选项卡、链接、标签等添加悬停文本(即当我将鼠标悬停在组件上时出现的包含一些解释或详细信息的文本框) 我用谷歌搜索并浏览了“Book of Vaadin”和“Building Moder
this.grid.asSingleSelect().addValueChangeListener(event -> { if (!Objects.isNull(event.getVa
在 Vaadin 中,一旦您有了 TabSheet,并且已经打开了一些选项卡,您就不会希望多次打开包含相同内容的同一个 Tab。 如何检查选项卡是否已打开并将其设置为选定的选项卡? 最佳答案 默认情况
我已经使用 vaadin 创建了表格。现在我想为该表格中的特定列内容设置字体大小。是否可以为该表格中的特定列设置字体大小?。 如果是这样,请给我设置字体大小的想法。如果你能提供我一些代码片段。 最佳答
是否可以在 vaadin 中以百分比设置表格的列宽。如果可以,请告诉我如何使用示例代码片段来做到这一点。提前谢谢。 最佳答案 是的。为此使用 Table.setColumnExpandRatio(co
我正在开发 Vaadin 8 UI。目前,每次修改 UI 时,我都必须重新启动我的应用程序。 有没有更好的办法?我曾尝试附加 Java 调试器并使用 IntelliJ 的 Reload Changed
序言:我是Vaadin的高级开发人员(我用过6、7,现在我的所有项目都已迁移到Vaadin 8)。 我开始学习Vaadin 10/Flow,但发现自己在一些热水中。 我实际上在挣扎的是“项目”本身。
我是一名优秀的程序员,十分优秀!