<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-112  評論-73  文章-0  trackbacks-0
    jsf 傳參數主要有以下幾種方式:

    As to the cause, the <f:attribute> is specific to the component itself (populated during view build time), not to the iterated row (populated during view render time).

    There are several ways to achieve the requirement.

    1. Use <f:param> instead. It adds a request parameter.

      <h:commandLink action="#{bean.insert}" value="insert">
         
      <f:param name="id" value="#{item.id}" />
      </h:commandLink>

      If your bean is request scoped, let JSF set it by @ManagedProperty

      @ManagedProperty(value="#{param.id}")
      private Long id; // +setter

      Or if your bean has a broader scope or if you want more fine grained validation/conversion, use<f:viewParam> on the target view, see also f:viewParam vs @ManagedProperty:

      <f:viewParam name="id" value="#{bean.id}" required="true" />

      Either way, this has the advantage that the datamodel doesn't necessarily need to be preserved for the form submit (for the case that your bean is request scoped).


    2. Use <f:setPropertyActionListener> instead. The advantage is that this removes the need for accessing the request parameter map when the bean has a broader scope than the request scope.

      <h:commandLink action="#{bean.insert}" value="insert">
         
      <f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
      </h:commandLink>

      In combination with

      private Long id; // +setter

      It'll be just available by property id in action method. This only requires that the datamodel is preserved for the form submit request. Best is to put the bean in the view scope by @ViewScoped.


    3. If your servletcontainer supports Servlet 3.0 / EL 2.2, then just pass it as method argument. This also requires that the datamodel is preserved for the form submit request. Best is to put the bean in the view scope by @ViewScoped.

      <h:commandLink action="#{bean.insert(item.id)}" value="insert" />

      In combination with:

      public void insert(Long id) {
         
      // ...
      }

      You can even pass the entire item object:

      <h:commandLink action="#{bean.insert(item)}" value="insert" />

      with:

      public void insert(Item item) {
         
      // ...
      }

      On Servlet 2.5 containers, this is also possible if you supply an EL implementation which supports this, like as JBoss EL. For configuration detail, see this answer.


    4. Bind the datatable value to DataModel<E> instead which in turn wraps the items.

      <h:dataTable value="#{bean.model}" var="item">

      with

      private transient DataModel<Item> model;

      public DataModel<Item> getModel() {
         
      if (model == null) {
              model
      = new ListDataModel<Item>(items);
         
      }
         
      return model;
      }

      (making it transient and lazily instantiating it in the getter is mandatory when you're using this on a view or session scoped bean since DataModel doesn't implement Serializable)

      Then you'll be able to access the current row by DataModel#getRowData() without passing anything around (JSF determines the row based on the request parameter name of the clicked command link/button).

      public void insert() {
         
      Item item = model.getRowData();
         
      Long id = item.getId();
         
      // ...
      }

      This also requires that the datamodel is preserved for the form submit request. Best is to put the bean in the view scope by @ViewScoped.


    5. You can use Application#evaluateExpressionGet() to programmatically evaluate the current #{item}.

      public void insert() {
         
      FacesContext context = FacesContext.getCurrentInstance();
         
      Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
         
      Long id = item.getId();
         
      // ...
      }

    Which way to choose depends on the functional requirements and whether the one or the other offers more advantages for other purposes. I personally would go ahead with #3 or, when you'd like to support servlet 2.5 containers as well, with #2.

    posted on 2012-07-13 19:42 Libo 閱讀(628) 評論(0)  編輯  收藏 所屬分類: JSF 2
    主站蜘蛛池模板: 亚洲毛片基地4455ww| 免费国产黄网站在线观看视频| 亚洲色四在线视频观看| 免费国产综合视频在线看| 永久在线免费观看| 久久久久久久久久久免费精品 | 日韩在线观看免费| 亚洲香蕉在线观看| 久久久无码精品亚洲日韩蜜桃 | 中文字幕亚洲精品无码| 婷婷亚洲综合五月天小说| 亚洲第一页日韩专区| 大地资源免费更新在线播放| 久久青草免费91观看| 国产高清对白在线观看免费91 | 久久亚洲精品无码aⅴ大香| 国产成人亚洲综合| 国产免费av一区二区三区| 亚洲免费视频播放| 久久狠狠躁免费观看| 国产在线观看免费av站| 日韩一区二区三区免费播放| 亚洲av乱码中文一区二区三区| 亚洲国产最大av| 亚洲国产成人综合| 亚洲国产超清无码专区| 亚洲男人第一av网站| 久久精品国产亚洲av麻豆| 久久久久免费看黄A片APP| 91精品免费久久久久久久久| 国内精品免费视频精选在线观看 | 亚洲国产黄在线观看| 免费h成人黄漫画嘿咻破解版| 国产伦精品一区二区三区免费迷| 免费看又爽又黄禁片视频1000| 黄瓜视频高清在线看免费下载 | 亚洲人xxx日本人18| 亚洲1234区乱码| 亚洲AV伊人久久青青草原| 可以免费观看的一级毛片| 看全色黄大色大片免费久久|