相关疑难解决方法(0)

在JSF中,输出List <SomeObj>的最短方式是SomeObj的"name"属性的逗号分隔列表

我有一个关于在JSF中输出对象列表作为逗号分隔列表的问题.

让我们说:

public class SomeObj {
  private String name;
  ... constructors, getters and setters ...
}
Run Code Online (Sandbox Code Playgroud)

和列表<SomeObj>:

List<SomeObj> lst = new ArrayList<SomeObj>();
lst.add(new SomeObj("NameA"));
lst.add(new SomeObj("NameB"));
lst.add(new SomeObj("NameC"));
Run Code Online (Sandbox Code Playgroud)

将其作为列表框输出我可以使用此代码:

<h:selectManyListbox id="id1"
                  value="#{listHolder.selectedList}">
  <s:selectItems value="#{listHolder.lst}"
                   var="someObj"
                 label="#{someObj.name}"/>
  <s:convertEntity />
</h:selectManyListbox>
Run Code Online (Sandbox Code Playgroud)

但输出列表的最简单方法是什么,逗号分隔?像这样:

NameA, NameB, NameC
Run Code Online (Sandbox Code Playgroud)

我应该使用JSTL <c:forEach />还是可以使用<s:selectItems />标签?

jsf facelets

14
推荐指数
3
解决办法
6094
查看次数

将JSF dataTable中组件的id设置为数组中当前项的值

我有一个数据表,我想在构建表的数组中将每行的id设置为当前项(具有id字段的对象)的id.

例:

<h:dataTable
   value="#{bean.list}"
   var="item">
      <h:column>
         <h:outputText id="#{item.id}" .... />
      </h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我得到:javax.servlet.ServletException: Empty id attribute is not allowed.

由于JSF如何构建其id,或者我做错了什么,是不可能以这种方式设置id?

datatable jsf jsf-2

14
推荐指数
1
解决办法
1万
查看次数

c:何时和c:如果不起作用

我可以从我的JSF2页面访问存储在支持bean中的变量,所以类似于

<h:outputText value="#{myBean.myValue}"/>
Run Code Online (Sandbox Code Playgroud)

工作,价值(这是一个int btw.)打印好.但是,当尝试在c:if和/或c:中的条件表达式中使用此值时,标记它永远不会等于任何东西......所以:

<c:if test="#{myBean.myValue == 1}">
    <c:set var="myVar" value="true"/>
</c:if>

<c:choose>
    <c:when test="#{myBean.myValue > 1}">
        <c:set var="myVar" value="true"/>
    </c:when>
</c:choose>
Run Code Online (Sandbox Code Playgroud)

甚至

#{myBean.myValue eq '1'} 
Run Code Online (Sandbox Code Playgroud)

要么

#{myBean.myValue == '1'}
Run Code Online (Sandbox Code Playgroud)

永远不会评估为真,即使该值确实为1或> 1.

令人讨厌的是,比较在标签的渲染属性中起作用!所以这:

<h:outputText value="whatever" rendered="#{myBean.myValue == 1}"/>
Run Code Online (Sandbox Code Playgroud)

很好!

到底是怎么回事?

更新:

这有效:

public int getMyValue() {
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

@Column(name = "orderstatus")
public int getOrderStatus() {
return orderStatus;
}
Run Code Online (Sandbox Code Playgroud)

int的值打印正确,但1 == 1为false.

实体bean是以特殊方式处理的吗?我可以使用它们在UI上显示它们的价值吗?

UPDATE2:

<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
Run Code Online (Sandbox Code Playgroud)

打印java.lang.Integer.

UPDATE3:

这是完整的代码:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html …
Run Code Online (Sandbox Code Playgroud)

jsf jstl

13
推荐指数
2
解决办法
7万
查看次数

ui:repeat和h:panelGrid

使用类似的东西时

<h:panelGrid columns="1">
    <ui:repeat var="o" value="#{mybean.list}">
        <h:outputText value="#{o.text}"/>
    </ui:repeat>
</h:panelGrid>
Run Code Online (Sandbox Code Playgroud)

让我们说10个列表条目我只得到1行例如:一个tr与1 td而当我使用c:forEach我得到10(但是c:forEach实际上是邪恶的,它用ajax弄乱了一切)

我使用mojarra 1.2 - 这是一个典型的Mojarra bug,它在MyFaces实现中不存在吗?它会在Mojarra版本的2.x中消失吗?

jsf facelets mojarra

12
推荐指数
1
解决办法
2万
查看次数

无法将JSF ViewScoped bean作为ManagedProperty注入Validator

我试图将JSF ViewScoped bean作为ManagedProperty注入到RequestScoped bean中,该bean实现了javax.faces.validator.Validator.但是总是会注入ViewScoped bean的新副本.

ViewScoped Bean

@ViewScoped
@ManagedBean
public class Bean {

     private Integer count = 1;     

     private String field2;      

     public String action(){
          ++count;
          return null;
     }

     public String anotherAction(){
          return null;
     }

     //getter and setter

}
Run Code Online (Sandbox Code Playgroud)

验证器

@RequestScoped
@ManagedBean
public class SomeValidator implements Validator {

     public void validate(FacesContext context, UIComponent comp, Object value)
        throws ValidatorException {

           //logging bean.getCount() is always one here. Even after calling ajax action a few times

     }
     @ManagedProperty(value = "#{bean}")
     private Bean bean;
} …
Run Code Online (Sandbox Code Playgroud)

java jsf-2

11
推荐指数
1
解决办法
2628
查看次数

有条件地渲染ui:define

我如何有条件地渲染<ui:define>

模板中的数据取决于所需的数据<f:viewParam>.

但是如果提供了无效的视图参数,那么<ui:define>不应该渲染,因为应该使用模板的默认内容.

我尝试过使用<c:if>但不起作用.

jsf facelets templating conditional-rendering

11
推荐指数
1
解决办法
6193
查看次数

<c:if test>似乎总是在JSF2 Facelets中评估为true

我在Facelets上使用JSF2.

<ui:param>在页面中定义了一个:

<ui:composition template="/WEB-INF/templates/ui.xhtml"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
>
  <ui:param name="title" value="OnAir WebDemo" />
  ...
</ui:composition>
Run Code Online (Sandbox Code Playgroud)

ui.xhtml模板中我有:

<html
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:c="http://java.sun.com/jstl/core"
>
  <c:if test="#{not empty title}">
    <h1>#{title}</h1>
  </c:if>
</html>
Run Code Online (Sandbox Code Playgroud)

但是,<c:if test>似乎总是评估true,如果<ui:param>没有指定.如何更改代码,以便在未指定时<c:if test>实际评估?false<ui:param>

jsf jstl facelets jsf-2

10
推荐指数
1
解决办法
4万
查看次数

JSF渲染阶段(为什么我的代码被执行?)

我正在研究JSF应用程序的性能.我注意到即使渲染设置为false,代码仍在执行.例如,拿这段代码:

<h:panelGroup rendered="#{bean.render}">
    <my composite component here/>
</h:panelGroup>    
Run Code Online (Sandbox Code Playgroud)

即使#{bean.render}返回false,我可以从调试日志中清楚地看到,我的复合组件的代码正在渲染阶段执行.在#{bean.render}被调用之前,它看起来似乎正在执行代码.它不会在返回给客户端的HTML中呈现,但仍然显示服务器正在执行代码.

有谁能解释一下?

谢谢.

jsf jsf-2

10
推荐指数
1
解决办法
3132
查看次数

<ui:include>与动态src ...完全疯狂

我在JSF中完成一项非常简单的任务时遇到了很大的问题.问题:我有一些对象,这些对象具有聚合属性,这些属性的类型可以在不同对象之间变化.根据属性的类型,我想使用一组不同的输入字段.

子类型组件驻留在框架中并按需加载.为此,我使用以下代码:

<h:panelGroup id="zusatzdaten">
    <fieldset class="clear">
    <legend>#{tickerUI.ticker.tickerDescription.label}
          (#{tickerUI.ticker.tickerDescId})
    </legend>
    <h:panelGroup rendered="#{tickerUI.editComponentName != null}">
        <ui:include src="#{tickerUI.editComponentName}"/>
    </h:panelGroup>
    </fieldset>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

该组件的名称来自TickerUI,它是@SessionScope.现在令人眼花缭乱的一点:首次加载时,会显示正确的子组件.但是,当在导航中使用链接时,应该导致包含不同的组件,内容不会更新!这会导致错误,因为数据现在是不同的子类型,但表单组件仍然来自前一个.

从错误返回并再次单击链接时,将显示正确的组件.我记录了editComponentName的值,并返回了正确的值.这非常令人困惑.当getter将正确的组件名称返回到src属性时,为什么包含错误的内容?

非常感谢.

jsf-2

10
推荐指数
1
解决办法
1万
查看次数

嵌套的JSF复合组件导致堆栈溢出异常

问题

当我尝试在自身中嵌套复合组件时,使用一些逻辑来结束无限递归,我收到堆栈溢出异常.我的理解是<c:xxx>标签在视图构建时运行,所以我不希望有无限的视图构建,因为我认为是这样的.

这是复合组件 simpleNestable.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:composite="http://java.sun.com/jsf/composite"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:em="http://xmlns.jcp.org/jsf/composite/emcomp"

  xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">

    <h:head>
        <title>This content will not be displayed</title>
    </h:head>
    <h:body>
        <composite:interface>
            <composite:attribute name="depth" required="true" type="java.lang.Integer"/>
        </composite:interface>

        <composite:implementation>
            <c:if test="#{cc.attrs.depth lt 3}">
                 #{cc.attrs.depth}
                 #{cc.attrs.depth+1}
                 <em:simpleNestable depth="#{cc.attrs.depth+1}" /> 

            </c:if>

        </composite:implementation>
    </h:body>
</html>
Run Code Online (Sandbox Code Playgroud)

这就是它的用法

<h:head>
    <title>Facelet Title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <h:outputStylesheet name="./css/default.css"/>
    <h:outputStylesheet name="./css/cssLayout.css"/>
</h:head>
<h:body>        
     <emcomp:simpleNestable depth="1"/>

</h:body>
Run Code Online (Sandbox Code Playgroud)

堆栈溢出异常

java.lang.StackOverflowError
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.UIComponentBase$AttributesMap.get(UIComponentBase.java:2407)
    at com.sun.faces.el.CompositeComponentAttributesELResolver$ExpressionEvalMap.get(CompositeComponentAttributesELResolver.java:393)
    at javax.el.MapELResolver.getValue(MapELResolver.java:199)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) …
Run Code Online (Sandbox Code Playgroud)

stack-overflow jsf nested jstl composite-component

10
推荐指数
1
解决办法
1680
查看次数