In this post, In defence of hidden fields with Seam, I discussed the reasons for favoring hidden fields over page parameters. I accidentally missed the one big reason that I avoid using page parameters with Seam.
When you define a page parameter in Seam, it is a 2 way binding so any Seam links to the page will have the parameters appended to the link automatically. To do this, Seam attempts to find the parameters bound to that page by creating instances of the beans the parameters are bound to. If you bind parameter xParam to value #{MyBean.XValue}, then every Seam link that references that page is going to look up the bean MyBean (creating it if necessary) and put the value of the XValue property in a parameter called xParam. If you are in a conversation in which MyBean already exists then there is less of a problem, however many times, it won’t exist and Seam will create the bean anyway just to return null as the parameter.

However, go back to our example of a search page and a page which displays details for an entity. Let’s say you wanted a link to the search page and a link to view the last entity you edited (this page also has the 5 detail tabs, each with their own set of 4 or 5 parameters). These items are so useful that we put them in our main page template so they are rendered on each page. Assuming each of those detail tabs has their own query and the search page has a query, then when Seam renders those links in the template, it is going to try and provide values for those parameters by instantiating the backing beans that they are bound to.

That means that every page that uses the template and includes those links is going to instantiate 6 beans (including running all the injection and outjection calls if any), just to render a page that has nothing to do with those links. This has been, and probably will be a performance killer.

You could provide empty defaults for those links, since specifying a blank parameter value prevents Seam from trying to get the value automatically. However, this means we need to manually add 25 or so parameters per link, when typically, all you want to do is specify one parameter, the entityId, or a blank value to indicate I want to create a new entity. You can often find yourself in the odd scenario where a bean is being ‘randomly’ created and destroyed on render, and many times, it’s because of a stray page parameter that you have to hunt down.

For this reason, I only ever use page parameters in circumstances where I should be setting the parameter anyway which is usually for entity Ids where I set the parameter to indicate which entity to display, or I set it to null to explicitly indicate that I want to create a new entity.