Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id BE7A3200BAA for ; Thu, 27 Oct 2016 19:20:51 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id BCEB6160AE6; Thu, 27 Oct 2016 17:20:51 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 8EA40160B01 for ; Thu, 27 Oct 2016 19:20:49 +0200 (CEST) Received: (qmail 97286 invoked by uid 500); 27 Oct 2016 17:20:48 -0000 Mailing-List: contact commits-help@tapestry.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@tapestry.apache.org Delivered-To: mailing list commits@tapestry.apache.org Received: (qmail 97277 invoked by uid 99); 27 Oct 2016 17:20:48 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Oct 2016 17:20:48 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 3B99D1A94C7 for ; Thu, 27 Oct 2016 17:20:48 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0.001 X-Spam-Level: X-Spam-Status: No, score=0.001 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, KAM_LINEPADDING=1.2, RP_MATCHES_RCVD=-2.999] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id zYiVydoYPYLt for ; Thu, 27 Oct 2016 17:20:35 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTP id 0A32F5FB6B for ; Thu, 27 Oct 2016 17:20:34 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 25E4EE7FA6 for ; Thu, 27 Oct 2016 17:20:30 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 009013A3A5E for ; Thu, 27 Oct 2016 17:20:30 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r999994 [10/11] - in /websites/production/tapestry/content: ./ cache/ Date: Thu, 27 Oct 2016 17:20:28 -0000 To: commits@tapestry.apache.org From: buildbot@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20161027172030.009013A3A5E@svn01-us-west.apache.org> archived-at: Thu, 27 Oct 2016 17:20:51 -0000 Modified: websites/production/tapestry/content/specific-errors-faq.html ============================================================================== --- websites/production/tapestry/content/specific-errors-faq.html (original) +++ websites/production/tapestry/content/specific-errors-faq.html Thu Oct 27 17:20:26 2016 @@ -46,18 +46,13 @@
- +
-

Specific Errors FAQ

+

Specific Errors FAQ

@@ -69,46 +64,25 @@
-
- - - - - - - - -

Related Articles

- - -

Why do I get the exception "No service implements the interface org.apache.tapestry5.internal.InternalComponentResources" when trying to use the BeanEditForm component?

This can occur when you choose the wrong package for your data object, the object edited by the BeanEditForm component. If you place it in the same package as your pages, Tapestry will treat it like a page, and perform a number of transformation on it, including adding a new constructor.

Only component classes should go in the Tapestry-controlled packages (pages, components, mixins and base under your application's root package). By convention, simple data objects should go in a data package, and Hibernate entities should go in an entities package.

This is likely a bit different in 5.3 than in 5.2 (because 5.3 builds a very different constructor into the component) and needs to be tested in 5.3 to see what exact exception will occur.

I get an error about "Page did not generate any markup when rendered." but I have a template, what happened?

The most common error here is that the case of the page class did not match the case of the template. For example, you might name your class ViewOrders, but name the template vieworders.tml. The correct name for the template is ViewOrders.tml, matching the case of the Java class name.

Worse, you may fi nd that your application works during development (under Windows, which is case insensitive) but does not work when deployed on a Linux or Unix server, which may be case sensitive.

The other cause of this may be that your template files simply are not being packaged up correctly with the rest of your application. When in doubt, use the Java jar command to see exactly whats inside your WAR file. Your page templates should either be in the root folder of the WAR, or package with the corresponding .class file.

My application fails with the error PermGen, how do I fix this?

PermGen refers to the part of the Java memory space devoted to permanent objects, which are mostly loaded classes. When developing under Tapestry, many more classes and class loaders are created than normal; this is part of live class reloading. Because of this, you will want to increase the a mount of memory Java devotes to this.

The solution is to add -XX:MaxPermSize=512m to your command line. You may also want to increase the regular amount of heap space with -Xmx600M. Of course, you may need to adjust the amount of memory in each category to match your actual application, but these are good starting values.

Java Virtual Machine arguments can be specified inside an Eclipse launch configuration:

Why do I sometimes get a java.lang.NoSuchMethodError exception after reloading my page?

Tapestry's live class reloading is not perfect. It tends to use a lot of Java ClassLoaders on top of the normal Class Loaders used by the Java Virtual Machine and the servlet container. When you change non-component classes and interfaces that are referenced by components and pages, such as to add or change a method, only the component classes are reloaded. The non-component classes are frozen as they were when they were first loaded.

Unfortunately, this is one of the areas where you must restart your application entirely in order to force the new versions of the non-component classes to be loaded into memory.

Why do my logs contain "java.lang.RuntimeException: Forms require that the request method be POST and that the t:formdata query parameter have values"?

This is caused by someone (or something) submitting the URL of your form using an HTTP GET instead of POST. Tapestry forms must always use POST actions.

Some known scenarios that cause this error:

  • Bots crawling your site
  • Web browser auto-complete functions trying to be helpful
  • Users with browser developer tools manually modifying the form from a POST to a GET to see what will happen.
  • Users getting a validation error on a form, then re-submitting the form by clicking in the URL address field and hitting Enter.
  • In Tapestry versions before 5.4, (rarely) the use of property names for form fields where the property name matches a JavaScript property (see TAP5-2066).

In every known scenario except the last, these errors are harmless and you probably want to redirect the user to the page the form is on – and avoid logging an error. That's not too hard to do. Just add code like the following to your module c lass (usually AppModule.java):

AppModule.java (partial)
+

Related Articles

Why do I get the exception "No service implements the interface org.apache.tapestry5.internal.InternalComponentResources" when trying to use the BeanEditForm component?

This can occur when you choose the wrong package for your data object, the object edited by the BeanEditForm component. If you place it in the same package as your pages, Tapestry will treat it like a page, and perform a number of transformation on it, including adding a new constructor.

Only component classes should go in the Tapestry-controlled packages (pages, components, mixins and base under your application's root package). By convention, simple data objects should go in a data package, and Hibernate entities should go in an entities package.

This is likely a bit different in 5.3 than in 5.2 (because 5.3 builds a very different constructor into the component) and needs to be tested in 5.3 to see what exact exception will occur.

I get an error about "Page did not generate any markup when rendered." but I have a template, what happened?

The most common error here is that the case of the page class did not match the case of the template. For example, you might name your class ViewOrders, but name the template vieworders.tml. The correct name for the template is ViewOrders.tml, matching the case of the Java class name.

< p>Worse, you may find that your application works during development (under Windows, which is case insensitive) but does not work when deployed on a Linux or Unix server, which may be case sensitive.

The other cause of this may be that your template files simply are not being packaged up correctly with the rest of your application. When in doubt, use the Java jar command to see exactly whats inside your WAR file. Your page templates should either be in the root folder of the WAR, or package with the corresponding .class file.

My application fails with the error PermGen, how do I fix this?

PermGen refers to the part of the Java memory space devoted to permanent objects, which are mostly loaded classes. When developing under Tapestry, many more classes and class loaders are created than normal; this is part of live class reloading. Because of this, you will wan t to increase the amount of memory Java devotes to this.

The solution is to add -XX:MaxPermSize=512m to your command line. You may also want to increase the regular amount of heap space with -Xmx600M. Of course, you may need to adjust the amount of memory in each category to match your actual application, but these are good starting values.

Java Virtual Machine arguments can be specified inside an Eclipse launch configuration:

Why do I sometimes get a java.lang.NoSuchMethodError exception after reloading my page?

Tapestry's live class reloading is not perfect. It tends to use a lot of Java ClassLoaders on top of the normal ClassLoaders used by the Java Virtual Machine and the servlet container. When you change non-component classes and interfaces that are referenced by components and pages, such as to add or change a method, only the component classes are reloaded. The non-component classes are frozen as they were when they were first loaded.

Unfortunately, this is one of the areas where you must restart your application entirely in order to force the new versions of the non-component classes to be loaded into memory.

Why do my logs contain "java.lang.RuntimeException: Forms require that the request method be POST and that the t:formdata query parameter have values"?

This is caused by someone (or something) submitti ng the URL of your form using an HTTP GET instead of POST. Tapestry forms must always use POST actions.

Some known scenarios that cause this error:

  • Bots crawling your site
  • Web browser auto-complete functions trying to be helpful
  • Users with browser developer tools manually modifying the form from a POST to a GET to see what will happen.
  • Users getting a validation error on a form, then re-submitting the form by clicking in the URL address field and hitting Enter.
  • In Tapestry versions before 5.4, (rarely) the use of property names for form fields where the property name matches a JavaScript property (see TAP5-2066).

In every known scenario except the last, these errors are harmless and you probably want to redirect the user to the page the form is on – and avoid logging an error. That's not too hard to do. Just add code like the followi ng to your module class (usually AppModule.java):

AppModule.java (partial)
    /**
      * Redirect the user to the intended page when browsing through
      * tapestry forms through browser history or over-eager autocomplete

Modified: websites/production/tapestry/content/starting-the-ioc-registry.html
==============================================================================
--- websites/production/tapestry/content/starting-the-ioc-registry.html (original)
+++ websites/production/tapestry/content/starting-the-ioc-registry.html Thu Oct 27 17:20:26 2016
@@ -44,18 +44,13 @@
 
   
- +
-

Starting the IoC Registry

+

Starting the IoC Registry

@@ -79,8 +74,7 @@ registry.performRegistryStartup();

Added in 5.2

-
-

 

As of version 5.2 the class RegistryBuilder has convenience methods to build and start a Registry. The static method RegistryBuilder.buildAndStartupRegistry(Class...) constructs a registry, adds a number of modules to the registry and performs registry startup. The returned registry is ready to use.

+

 

As of version 5.2 the class RegistryBuilder has convenience methods to build and start a Registry. The static method RegistryBuilder.buildAndStartupRegistry(Class...) constructs a registry, adds a number of modules to the registry and performs registry startup. The returned registry is ready to use.

Registry registry = RegistryBuilder.buildAndStartupRegistry(AppModule.class, UtilModule.class);
 

Building the Default Registry

The default registry is available by invoking the static method IOCUtilities.buildDefaultRegistry(). This method builds a Registry using autoloading logic, where modules to load are identified via a JAR Manifest entry.

In addition, the JVM system property tapestry.modules (if specified) is a list of additional module classes to load. This is often used in development, where tests may be executed against the local classes, not JARs, and so there is no manifest to read.

Shutting down the Registry

The method Registry.shutdown() will shutdown the Registry. This immediately invalidates all service proxies. Some services may have chosen to register for shutdown notification (for example, to do cleanup work such as closing a database connection).

Once the Registry is shutdown, it may not be used again: it will not be possible to access services within the Registry, or invoke methods on services previously acquired. All you can do is release the Registry to the garbage collector.

 

Modified: websites/production/tapestry/content/switching-cases.html ============================================================================== --- websites/production/tapestry/content/switching-cases.html (original) +++ websites/production/tapestry/content/switching-cases.html Thu Oct 27 17:20:26 2016 @@ -46,18 +46,13 @@
- +
-

Switching Cases

+

Switching Cases

Modified: websites/production/tapestry/content/tapestry-inversion-of-control-faq.html ============================================================================== --- websites/production/tapestry/content/tapestry-inversion-of-control-faq.html (original) +++ websites/production/tapestry/content/tapestry-inversion-of-control-faq.html Thu Oct 27 17:20:26 2016 @@ -46,18 +46,13 @@
- +
-

Tapestry Inversion of Control FAQ

+

Tapestry Inversion of Control FAQ

@@ -69,55 +64,31 @@
-

Tapestry Inversion of Control Container

Main article: Tapestry IoC

 

- - - - - - - - -

Related Articles

- - -

Why do I need to define an interface for my services? Why can't I just use the class itself?

First of all: you can do exactly this, but you lose some of the functionality that Tapestry's IoC container provides.

The reason for the split is so that Tapestry can provide functionality for your service around the core service implementation. It does this by creating proxies: Java classes that implement the service interface. The methods of the proxy will ultimately invoke the methods of your service implementation.

One of the primary purposes for proxies is to encapsulate the service's life cycle: most services are singletons that are created just in time. Just in time means only as soon as you invoke a method. What's going on is that the life cycle proxy (the object that gets injected into pages, components or other service implemen tations) checks on each method invocation to see if the actual service exists yet. If not, it instantiates and configures it (using proper locking to ensure thread safety), then delegates the method invocation to the service.

If you bind a service class (not a service interface and class), then the service is fully instantiated the first time it is injected, rather than at that first method invocation. Further, you can't use decorations or method advice on such a service.

The final reason for the service interface / implementation split is to nudge you towards always coding to an interface, which has manifest benefits for code structure, robustness, and testability.

My service starts a thread; how do I know when the application is shutting down, to stop that thread?

This same concern applies to any long-lived resource (a thread, a database connection, a JMS queue connection) that a service may hold onto. Your code needs to know when the application has been undeployed and shutdown. This is actually quite easy, by adding some post-injection logic to your implementation class.

+

Tapestry Inversion of Control Container

Main article: Tapestry IoC

 

Related Articles

Why do I need to define an interface for my services? Why can't I just use the class itself?

First of all: you can do exactly this, but you lose some of the functionality that Tapestry's IoC container provides.

The reason for the split is so that Tapestry can provide functionality for your service around the core service implementation. It does this by creating proxies: Java classes that implement the service interface. The methods of the proxy will ultimately invoke the methods of your service implementation.

One of the primary purposes for proxies is to encapsulate the service's life cycle: most services are singletons that are created just in time. Just in time means only as soon as you invoke a method. What's going on is that the life cycle proxy (the object that gets injected into pages, components or oth er service implementations) checks on each method invocation to see if the actual service exists yet. If not, it instantiates and configures it (using proper locking to ensure thread safety), then delegates the method invocation to the service.

If you bind a service class (not a service interface and class), then the service is fully instantiated the first time it is injected, rather than at that first method invocation. Further, you can't use decorations or method advice on such a service.

The final reason for the service interface / implementation split is to nudge you towards always coding to an interface, which has manifest benefits for code structure, robustness, and testability.

My service starts a thread; how do I know when the application is shutting down, to stop that thread?

This same concern applies to any long-lived resource (a thread, a database connection, a JMS queue connection) that a service may hold onto. Your code needs to know when the application has been undeployed and shutdown. This is actually quite easy, by adding some post-injection logic to your implementation class.

public class MyServiceImpl implements MyService
 {
   private boolean shuttingDown;

Modified: websites/production/tapestry/content/tapestry-ioc-configuration.html
==============================================================================
--- websites/production/tapestry/content/tapestry-ioc-configuration.html (original)
+++ websites/production/tapestry/content/tapestry-ioc-configuration.html Thu Oct 27 17:20:26 2016
@@ -44,18 +44,13 @@
 
   
- +
-

Tapestry IoC Configuration

+

Tapestry IoC Configuration

@@ -67,73 +62,43 @@
-

Tapestry IOC Configuration is the configuration of both the IOC services provided by Tapestry and those you write yourself. Both are configured in the same way: using Java, not XML.

- - - - - - - - -

Related Articles

- - -

One of the key concepts in Tapestry IoC is distributed configuration. The distributed part refers to the fact that any module may configure a service. Distributed configuration is the key feature of Tapestry IoC that supports extensibility and modularity.

Modules configure a service by contributing to service configurations. This may seem esoteric but is really pretty simple. We'll explain with an example.

Let's say you've written a bunch of different services, each of which does something specific for a particular type of file (identified by the file's extension), and each implements the same interface, which we'll call FileServicer. And now let's say you need a central service that selects the one of your FileServicer implementations based on a given file extension. You start by providing a service builder method:

+

Tapestry IOC Configuration is the configuration of both the IOC services provided by Tapestry and those you write yourself. Both are configured in the same way: using Java, not XML.

Related Articles

One of the key concepts in Tapestry IoC is distributed configuration. The distributed part refers to the fact that any module may configure a service. Distributed configuration is the key feature of Tapestry IoC that supports extensibility and modularity.

Modules configure a service by contributing to service configurations. This may seem esoteric but is really pretty simple. We'll explain with an example.

Let's say you've written a bunch of different services, each of which does something specific for a particular type of file (identified by the file's extension), and each implements the same interface, which we'll call FileServicer. And now let's say you need a central service that selects the one of your FileServicer implementations based on a given file extension. You start by providing a service builder method:

  public static FileServiceDispatcher buildFileServicerDispatcher(Map<String,FileServicer> contributions)
   {
     return new FileServiceDispatcherImpl(contributions);
@@ -163,8 +128,7 @@
 
 

Added in 5.2

-
-

 

If you prefer annotations over naming conventions you can use the @Contribute annotation. As of version 5.2 this annotation that may be placed on a contributor method of a module instead of starting the methods name with "contribute". The value of the annotation is the type of the service to contribute into.

The primary reasons to use @Contribute and marker annotations is twofold:

  • There is no longer a linkage between the contribution method name and the service id, which is much more refactoring safe: if you change the service interface name, or the ID of the service, your method will still be invoked when using @Contribute.
  • It makes it much easier for an override of the service to get the configuration intended for the original service.

The followin g example is an annotation-based alternative for the contribution method above.

+

 

If you prefer annotations over naming conventions you can use the @Contribute annotation. As of version 5.2 this annotation that may be placed on a contributor method of a module instead of starting the methods name with "contribute". The value of the annotation is the type of the service to contribute into.

The primary reasons to use @Contribute and marker annotations is twofold:

  • There is no longer a linkage between the contribution method name and the service id, which is much more refactoring safe: if you change the service interface name, or the ID of the service, your method will still be invoked when using @Contribute.
  • It makes it much easier for an override of the service to ge t the configuration intended for the original service.

The following example is an annotation-based alternative for the contribution method above.

@Contribute(FileServiceDispatcher.class)
 public static void arbitraryMethodName(MappedConfiguration<String,FileServicer> configuration)
 {
@@ -230,14 +194,11 @@ public static void arbitraryMethodName(M
 
 

Added in 5.3

-
-

When using add() without any specific constraints, a default constraint is added: after the previously added element. These default constraints are only within a single contribution method, but makes it much easier to set the order of several related contributions. Note that the contributions will be ordered relative to each other and it's possible that contributions by some other module or method may be interspersed between them.

-

Mapped Configurations

As discussed in the earlier examples, mapped configurations are also supported. The keys passed in must be unique. When conflicts occur, Tapestry will log warnings (identifying the source of the conflict, in terms of invoked methods), and ignore the conflicting value.

Neither the key nor the value may be null.

For mapped configurations where the key type is String, a CaseInsensitiveMap will be automatically used (and passed to the service builder method), to help ensure that case insensitivity is automatic and pervasive.

Injecting Classes

All three configuration interfaces have a second method, addInstance(). This method takes a cla ss, not an instance. The class is instantiated and contributed. If the constructor for the class takes dependencies, those are injected as well.

Injecting Resources

In addition to injecting services into a contributor method (via the @InjectService and @Inject annotations), Tapestry will key off of the parameter type to allow other things to be injected.

  • ObjectLocator: access to other services visible to the contributing module
  • org.slf4j.Logger: the Logger for the service being contributed to

No annotation is needed for these cases.

Configuration Overrides

+

When using add() without any specific constraints, a default constraint is added: after the previously added element. These default constraints are only within a single contribution method, but makes it much easier to set the order of several related contributions. Note that the contributions will be ordered relative to each other and it's possible that contributions by some other module or method may be interspersed between them.

Mapped Configurations

As discussed in the earlier examples, mapped configurations are also supported. The keys passed in must be unique. When conflicts occur, Tapestry will log warnings (identifying the source of the conflict, in terms of invoked methods), and ignore the conflicting value.

Neither the key nor the value may be null.

For mapped configurations where the key type is St ring, a CaseInsensitiveMap will be automatically used (and passed to the service builder method), to help ensure that case insensitivity is automatic and pervasive.

Injecting Classes

All three configuration interfaces have a second method, addInstance(). This method takes a class, not an instance. The class is instantiated and contributed. If the constructor for the class takes dependencies, those are injected as well.

Injecting Resources

In addition to injecting services into a contributor method (via the @InjectService and @Inject annotations), Tapestry will key off of the parameter type to allow other things to be injected.

  • ObjectLocator: access to other services visible to the contributing module
  • org.slf4j.Logger: the Logger for the service being contributed to

No annotation is needed for these cases.

Configuration Overrides

Added in 5.1

-
-

 

The OrderedConfiguration and MappedConfiguration interfaces now support overrides. An override is a replacement for a normally contributed object. An override must match a contributed object, and each contributed object may be overridden at most once.

The new object replaces the original object; alternately, you may override the original object with null.

This allows you to fine tune configuration values that are contributed from modules that you are using, rather than just those that you write yourself. It is powerful and a bit dangerous.

In Tapestry 5.0, services that wanted to support this kind of override behavior had to implement it on an ad-hoc basis, such as ApplicationDefaults overriding FactoryDefaults. In many cases, that is still useful.

 

+

 

The OrderedConfiguration and MappedConfiguration interfaces now support overrides. An override is a replacement for a normally contributed object. An override must match a contributed object, and each contributed object may be overridden at most once.

The new object replaces the original object; alternately, you may override the original object with null.

This allows you to fine tune configuration values that are contributed from modules that you are using, rather than just those that you write yourself. It is powerful and a bit dangerous.

In Tapestry 5.0, services that wanted to support this kind of override behavior had to implement it on an ad-hoc basis, such as ApplicationDefaults overriding FactoryDefaults. In many cases, that is still useful.

 

Modified: websites/production/tapestry/content/tapestry-ioc-decorators.html ============================================================================== --- websites/production/tapestry/content/tapestry-ioc-decorators.html (original) +++ websites/production/tapestry/content/tapestry-ioc-decorators.html Thu Oct 27 17:20:26 2016 @@ -44,18 +44,13 @@
- +
-

Tapestry IoC Decorators

+

Tapestry IoC Decorators

@@ -127,8 +122,7 @@ public class MyAppModule

Added in 5.2

-
-

 

Starting from version 5.2, Tapestry supports annotation-driven decorator methods. If the @Decorate annotation is present, the decorator method can be arbitrary named, as shown in the following example.
+

 

Starting from version 5.2, Tapestry supports annotation-driven decorator methods. If the @Decorate annotation is present, the decorator method can be arbitrary named, as shown in the following example.
  @Decorate
   @Match("*DAO")
   public static <T> T byServiceId(Class<T> serviceInterface, T delegate,

Modified: websites/production/tapestry/content/templating-and-markup-faq.html
==============================================================================
--- websites/production/tapestry/content/templating-and-markup-faq.html (original)
+++ websites/production/tapestry/content/templating-and-markup-faq.html Thu Oct 27 17:20:26 2016
@@ -46,18 +46,13 @@
 
   
- +
-

Templating and Markup FAQ

+

Templating and Markup FAQ

@@ -113,7 +108,7 @@ return isUrgent() ? "urgent" : null; }
-

When an informal parameter is bound to null, then the attribute is not written out at all.

You can verify which components support informal parameters by checking the component reference, or looking for the @SupportsInformalParameters annotation in the components' source file.

 

 

 

 

 

 

Footnotes
ReferenceNotes

 

 

 

 

+

When an informal parameter is bound to null, then the attribute is not written out at all.

You can verify which components support informal parameters by checking the component reference, or looking for the @SupportsInformalParameters annotation in the components' source file.

 

 

 

 

 

 

< /tr>
Footnotes
ReferenceNotes

 

 

 

 

Modified: websites/production/tapestry/content/test-page-2.html ============================================================================== --- websites/production/tapestry/content/test-page-2.html (original) +++ websites/production/tapestry/content/test-page-2.html Thu Oct 27 17:20:26 2016 @@ -46,18 +46,13 @@
- +
-

Test Page 2

+

Test Page 2

@@ -71,11 +66,11 @@

+/*]]>*/

@@ -122,7 +117,7 @@ div.rbtoc1463689185242 li {margin-left:

However, the stronger reason for Request (and the related interfaces Response and Session) is to enable the support for Portlets at some point in the future. By writing code in terms of Tapestry's Request, and not HttpServletRequest, you can be assured that the same code will operate in both Servlet Tapestry and Portlet Tapestry.


-

Footnotes
ReferenceNotes

+

Footnotes
ReferenceNotes

Modified: websites/production/tapestry/content/test-page.html ============================================================================== --- websites/production/tapestry/content/test-page.html (original) +++ websites/production/tapestry/content/test-page.html Thu Oct 27 17:20:26 2016 @@ -46,18 +46,13 @@
- +
-

Test Page

+

Test Page

Modified: websites/production/tapestry/content/uploading-files.html ============================================================================== --- websites/production/tapestry/content/uploading-files.html (original) +++ websites/production/tapestry/content/uploading-files.html Thu Oct 27 17:20:26 2016 @@ -46,18 +46,13 @@
- +
-

Uploading Files

+

Uploading Files