代码之家  ›  专栏  ›  技术社区  ›  harto

JSF/Facelets:将'action'属性设置为动态计算的字符串

  •  2
  • harto  · 技术社区  · 15 年前

    <foo:breadcrumbs trail="foo,bar,baz"/>
    

    这将产生如下结果:

    <h:commandLink action="foo" ... />
    <h:commandLink action="bar" ... />
    <!-- (etc.) -->
    

    <ui:repeat value="#{fn:split(trail, ',')}" var="key">
        <h:commandLink action="#{key}" ... /> 
    </ui:repeat>
    

    #{key} 被解释为方法绑定。但是,我只需要 #{key} 作为导航结果返回。我怎样才能做到这一点?


    我唯一能想到的就是创建一个具有 outcome 字段和操作处理程序,并像这样调用它:

    <h:commandLink action="#{dummy.click}" ...>
        <f:setPropertyActionListener target="#{dummy.outcome}" value="#{key}" />
    </h:commandLink>
    

    使用如下定义的虚拟类:

    public class Dummy {
    
        private String outcome;
    
        public String click() {
            return outcome;
        }
    
        public void setOutcome(String outcome) {
            this.outcome = outcome;
        }
    
        public void getOutcome() {
            return outcome;
        }
    }
    

    但这看起来很难看,我不知道它是否管用。

    3 回复  |  直到 14 年前
        1
  •  5
  •   harto    15 年前

    自从提出这个问题以来,我发现了一个显而易见的解决方案,它非常容易实现。

    作为JSF操作目标的方法必须不接受任何参数并返回字符串。 toString() !

    因此,我将UI循环更改为以下内容:

    <ui:repeat value="#{fn:split(trail, ',')}" var="key">
        <h:commandLink action="#{key.toString}" ... /> 
    </ui:repeat>
    

    key

        2
  •  3
  •   McDowell rahul gupta    15 年前

    我想到了两种方法。

    选择1

    坚持使用commandLink并阅读 var

    public String click() {
      FacesContext context = FacesContext.getCurrentInstance();
      ExternalContext extContext = context.getExternalContext();
      Map<String, Object> reqMap = extContext.getRequestMap();
      return (String) reqMap.get("uirepeatVar");
    }
    

    var="uirepeatVar"


    选择2

    outputLink 并在服务器上生成GET链接:

    public List<String> getViewUrls() {
      List<String> views = Arrays.asList("/index.xhtml", "/idtable.xhtml");
    
      List<String> urls = new ArrayList<String>();
      FacesContext context = FacesContext.getCurrentInstance();
      Application application = context.getApplication();
      ViewHandler viewHandler = application.getViewHandler();
      for (String view : views) {
        String url = viewHandler.getActionURL(context, view);
        urls.add(url);
      }
      return urls;
    }
    

    <ui:repeat value="#{breadcrumbBean.viewUrls}" var="url">
      <h:outputLink value="#{url}">#{url}</h:outputLink> <br />
    </ui:repeat>
    
        3
  •  1
  •   user7094 user7094    15 年前

    为什么不创建一个自定义组件,以编程方式生成h:commandLink对象?这可能是“最干净”的解决方案。