简体   繁体   中英

Seam & JSF - misunderstanding <h:inputHidden />?

I've written an e-commerce web application using Seam 2.2, JPA, and JSF that, of course, contains product search functionality. To accomplish this, I've created a class called SearchForm that contains the various parameters used for searching (start index, maximum number of results, 'and' terms, 'or' terms, etc.) I've also got a web action -- ProductSearchAction -- that uses the SearchForm object to pull the entries from the database. It looks something like this:

@Name("searchForm")
@AutoCreate
@Scope(ScopeType.CONVERSATION)
public class SearchForm {

   private int startIndex = 0;

   private int maxResults = 20;

   ...

}


@Name("productSearchAction")
@AutoCreate
@Scope(ScopeType.CONVERSATION)
public class ProductSearchAction {

   @In
   private SearchForm searchForm = null;

   @Out
   private List<Products> products = null;

   ...

   public void searchProducts() {
      ...
   }

   ...

}

In my JSF, I display the list of products enclosed within an <h:form /> , with 2 <h:commandLink /> links for paging forward and backward through the results. Since I don't create a conversation for each search, I'm trying to pass state to the ProductSearchAction and SearchForm objects through the use of <h:inputHidden /> hidden fields. I've got fields like this in my page:

<h:form>
   ...

   <h:inputHidden value="#{searchForm.maxResults}" />
   <h:inputHidden value="#{searchForm.startIndex}" />
   <h:inputHidden value="#{searchForm.andTerms}" />

   ...

   <h:commandLink action="next" value="Next" />
   <h:commandLink action="previous" value="Previous" />
</h:form>

My understanding of <h:inputHidden /> is that it will populate the appropriate values within SearchForm , which will then be made available to ProductSearchAction.searchProducts() . When I view the HTML source I see the hidden parameters being set within the HTML. However, when I click "next" or "previous" which take me to the searchProducts() action none of the values are set.

Am I misunderstanding how <h:inputHidden /> works? What do I need to do to pass these values to my search action? Is there a better way to accomplish my goal? Is it a Seam Scope issue? I'd REALLY appreciate any help you can give.

Based on your comment it sounds like you are using h:inputHidden correctly, and that the problem must lie in the JSF bean scoping.

The beans are behaving as if they are request scope. When you fire of ah:commandLink, the page re-renders and posts the hidden inputs back, and then those posted values are not available after the navigation result ("next" or "prev") forwards to another page.

In all likelihood the @Scope(ScopeType.CONVERSATION) is not behaving as you expect it to. I am not a Seam expert, but from a quick scan of the documentation it looks like Seam treats each individual HTTP request as a "conversation" unless otherwise indicated. So that would explain why the values reset when you click the commandLink. You probably need to demarcate a long-running conversation with the @Begin/@End annotations.

http://seamframework.org/Community/ConversationExample

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM