diff options
author | elmot <elmot@vaadin.com> | 2015-09-25 16:40:44 +0300 |
---|---|---|
committer | elmot <elmot@vaadin.com> | 2015-09-25 16:40:44 +0300 |
commit | a1b265c318dbda4a213cec930785b81e4c0f7d2b (patch) | |
tree | b149daf5a4f50b4f6446c906047cf86495fe0433 /documentation/application/application-resources.asciidoc | |
parent | b9743a48a1bd0394f19c54ee938c6395a80f3cd8 (diff) | |
download | vaadin-framework-a1b265c318dbda4a213cec930785b81e4c0f7d2b.tar.gz vaadin-framework-a1b265c318dbda4a213cec930785b81e4c0f7d2b.zip |
Framework documentation IN
Change-Id: I767477c1fc3745f9e1f58075fe30c9ac8da63581
Diffstat (limited to 'documentation/application/application-resources.asciidoc')
-rw-r--r-- | documentation/application/application-resources.asciidoc | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/documentation/application/application-resources.asciidoc b/documentation/application/application-resources.asciidoc new file mode 100644 index 0000000000..b5f5db91f2 --- /dev/null +++ b/documentation/application/application-resources.asciidoc @@ -0,0 +1,245 @@ +--- +title: Images and Other Resources +order: 5 +layout: page +--- + +[[application.resources]] += Images and Other Resources + +Web applications can display various __resources__, such as images, other +embedded content, or downloadable files, that the browser has to load from the +server. Image resources are typically displayed with the [classname]#Image# +component or as component icons. Flash animations can be displayed with +[classname]#Flash#, embedded browser frames with [classname]#BrowserFrame#, and +other content with the [classname]#Embedded# component, as described in +<<dummy/../../../framework/components/components-embedded#components.embedded,"Embedded +Resources">>. Downloadable files are usually provided by clicking a +[classname]#Link#. + +There are several ways to how such resources can be provided by the web server. +Static resources can be provided without having to ask for them from the +application. For dynamic resources, the user application must be able to create +them dynamically. The resource request interfaces in Vaadin allow applications +to both refer to static resources as well as dynamically create them. The +dynamic creation includes the [classname]#StreamResource# class and the +[interfacename]#RequestHandler# described in +<<dummy/../../../framework/advanced/advanced-requesthandler#advanced.requesthandler,"Request +Handlers">>. + +Vaadin also provides low-level facilities for retrieving the URI and other +parameters of a HTTP request. We will first look into how applications can +provide various kinds of resources and then look into low-level interfaces for +handling URIs and parameters to provide resources and functionalities. + +Notice that using request handlers to create "pages" is not normally meaningful +in Vaadin or in AJAX applications generally. Please see +<<dummy/../../../framework/architecture/architecture-technology#architecture.technology.ajax,"AJAX">> +for a detailed explanation. + +[[application.resources.api]] +== Resource Interfaces and Classes + +The resource classes in Vaadin are grouped under two interfaces: a generic +[classname]#Resource# interface and a more specific +[classname]#ConnectorResource# interface for resources provided by the servlet. + +[[figure.resource.classdiagram]] +.Resource Interface and Class Diagram +image::img/resource_classdiagram-hi.png[] + + +[[application.resources.file]] +== File Resources + +File resources are files stored anywhere in the file system. As such, they can +not be retrieved by a regular URL from the server, but need to be requested +through the Vaadin servlet. The use of file resources is typically necessary for +persistent user data that is not packaged in the web application, which would +not be persistent over redeployments. + +A file object that can be accessed as a file resource is defined with the +standard [classname]#java.io.File# class. You can create the file either with an +absolute or relative path, but the base path of the relative path depends on the +installation of the web server. For example, with Apache Tomcat, the default +current directory would be the installation path of Tomcat. + +In the following example, we provide an image resource from a file stored in the +web application. Notice that the image is stored under the [filename]#WEB-INF# +folder, which is a special folder that is never accessible using an URL, unlike +the other folders of a web application. This is a security solution - another +would be to store the resource elsewhere in the file system. + + +[source, java] +---- +// Find the application directory +String basepath = VaadinService.getCurrent() + .getBaseDirectory().getAbsolutePath(); + +// Image as a file resource +FileResource resource = new FileResource(new File(basepath + + "/WEB-INF/images/image.png")); + +// Show the image in the application +Image image = new Image("Image from file", resource); + +// Let the user view the file in browser or download it +Link link = new Link("Link to the image file", resource); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#application.resources.fileresource[on-line example, window="_blank"]. + +The result, as well as the folder structure where the file is stored under a +regular Eclipse Vaadin project, is shown in +<<figure.application.resources.file>>. + +[[figure.application.resources.file]] +.File Resource +image::img/resource-fileresource.png[] + + +[[application.resources.class]] +== Class Loader Resources + +The [classname]#ClassResource# allows resources to be loaded from the class path +using Java Class Loader. Normally, the relevant class path entry is the +[filename]#WEB-INF/classes# folder under the web application, where the Java +compilation should compile the Java classes and copy other files from the source +tree. + +The one-line example below loads an image resource from the application package +and displays it in an [classname]#Image# component. + + +[source, java] +---- +layout.addComponent(new Image(null, + new ClassResource("smiley.jpg"))); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#application.resources.classresource[on-line example, window="_blank"]. + + +[[application.resources.theme]] +== Theme Resources + +Theme resources of [classname]#ThemeResource# class are files, typically images, +included in a theme. A theme is located with the path +[filename]#VAADIN/themes/themename# in a web application. The name of a theme +resource is given as the parameter for the constructor, with a path relative to +the theme folder. + + +[source, java] +---- +// A theme resource in the current theme ("mytheme") +// Located in: VAADIN/themes/mytheme/img/themeimage.png +ThemeResource resource = new ThemeResource("img/themeimage.png"); + +// Use the resource +Image image = new Image("My Theme Image", resource); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#application.resources.themeresource[on-line example, window="_blank"]. + +The result is shown in <<figure.application.resources.theme>>, also illustrating +the folder structure for the theme resource file in an Eclipse project. + +[[figure.application.resources.theme]] +.Theme Resources +image::img/resource-themeimage.png[] + +To use theme resources, you must set the theme for the UI. See +<<dummy/../../../framework/themes/themes-overview.asciidoc#themes.overview,"Themes">> +for more information regarding themes. + + +[[application.resources.stream]] +== Stream Resources + +Stream resources allow creating dynamic resource content. Charts are typical +examples of dynamic images. To define a stream resource, you need to implement +the [classname]#StreamResource.StreamSource# interface and its +[methodname]#getStream()# method. The method needs to return an +[classname]#InputStream# from which the stream can be read. + +The following example demonstrates the creation of a simple image in PNG image +format. + + +[source, java] +---- +import java.awt.image.*; + +public class MyImageSource + implements StreamResource.StreamSource { + ByteArrayOutputStream imagebuffer = null; + int reloads = 0; + + /* We need to implement this method that returns + * the resource as a stream. */ + public InputStream getStream () { + /* Create an image and draw something on it. */ + BufferedImage image = new BufferedImage (200, 200, + BufferedImage.TYPE_INT_RGB); + Graphics drawable = image.getGraphics(); + drawable.setColor(Color.lightGray); + drawable.fillRect(0,0,200,200); + drawable.setColor(Color.yellow); + drawable.fillOval(25,25,150,150); + drawable.setColor(Color.blue); + drawable.drawRect(0,0,199,199); + drawable.setColor(Color.black); + drawable.drawString("Reloads="+reloads, 75, 100); + reloads++; + + try { + /* Write the image to a buffer. */ + imagebuffer = new ByteArrayOutputStream(); + ImageIO.write(image, "png", imagebuffer); + + /* Return a stream from the buffer. */ + return new ByteArrayInputStream( + imagebuffer.toByteArray()); + } catch (IOException e) { + return null; + } + } +} +---- + +The content of the generated image is dynamic, as it updates the reloads counter +with every call. The [classname]#ImageIO#. [methodname]#write()# method writes +the image to an output stream, while we had to return an input stream, so we +stored the image contents to a temporary buffer. + +Below we display the image with the [classname]#Image# component. + + +[source, java] +---- +// Create an instance of our stream source. +StreamResource.StreamSource imagesource = new MyImageSource (); + +// Create a resource that uses the stream source and give it a name. +// The constructor will automatically register the resource in +// the application. +StreamResource resource = + new StreamResource(imagesource, "myimage.png"); + +// Create an image component that gets its contents +// from the resource. +layout.addComponent(new Image("Image title", resource)); +---- + +The resulting image is shown in <<figure.application.resource.stream>>. + +[[figure.application.resource.stream]] +.A Stream Resource +image::img/application_streamresource.png[] + +Another way to create dynamic content is a request handler, described in +<<dummy/../../../framework/advanced/advanced-requesthandler#advanced.requesthandler,"Request +Handlers">>. + + + + |