Hi
I would like to know what the best practice is to pass a query from a
"search-"form to a results page. With this a mean page A with some form
elements to search for records in a database and page B showning a
table of results with all matches.
I can come up with the following 5 alternatives:
- [A]: A.jsp and B.jsp refer to the same Backing Bean, which has
session scope. So when B.jsp is called and the table rendered, the
Backing Bean has directly access to the search form fields and can use
these to submit a query in a DAO.
- [B]: A.jsp and B.jsp have Backing Beans A.java and B.java in
request scope. A.java puts the form elements within its action method
into a Map, which is stored in either the request or the session.
B.java reads the Map from either session or request and uses them to
submit a query in a DAO.
- [C]: pages and beans like [B]. But A.java's action method
actually makes query in DAO and then puts the result in session or
request.
- [D]: This time in A.java's action method FacesContext is used to
get an instance of B.java and set the form parameters with
getters/setters, such that in the render phase of b.jsp a query can be
made against a DAO.
- [E]: In A.java's action method submit the form parameters to a
DAO method, which returns a query string. This is then set into a
session parameter. In B.java get the query string from the session
parameter and use it then to submit a query in the DAO. The beauty of
this would be that the concrete DAO implementation would generate the
relevant query, such that it would be transparent for the Backing Bean
and a Business Delegat whether we use a Hibernate implementation or
plain SQL or JDO ... And the query string does not use a lot of memory
in the session :-). Plus a "select count(*)" in the DAO already when
getting the query string in A.java could reveal, whether the user has
to be more precice as the query would return to many records
(configurable).
Pros/cons:
- [A]: Positive: easy to implement. Negative: session scope and
results potentially hanging around in session (e.g. for simple pager).
- [B]: Positive: request scope. Negative: as with [A] the Map gets
some logic with field names that need to be maintained.
- [C]: Positive: easy to implement. Negative: As with [A] there can
be problems if using request parameters in portlets (as far as I know).
Results can be big and somehow should be nullified in session as soon
as pointer is set in B.java.
- [D]: Negative: not really an improvement over [A]; I do not like
to play with BackingBeans in FacesContext (-> session vs. request
scope?)
- [E]: Positive: I just like it ;-)
Any comments?
|
- Design question: how best to pass query from search-for... Rick Gruber-Riemer
-