Appending Strings in global resource bundle [duplicate] - jsf

I need to create a callback for <h:commandButton> while as a parameter I need to pass an argument that is string-concatenated with an external parameter id:
I tried nesting an EL expression something like this:
<h:commandButton ... action="#{someController.doSomething('#{id}SomeTableId')}" />
However this failed with an EL exception. What is a right syntax/approach to do this?

If you're already on EL 3.0 (Java EE 7; WildFly, Tomcat 8, GlassFish 4, etc), then you could use the new += operator for this:
<h:commandButton ... action="#{someController.doSomething(id += 'SomeTableId')}" />
If you're however not on EL 3.0 yet, and the left hand is a genuine java.lang.String instance (and thus not e.g. java.lang.Long), then use EL 2.2 capability of invoking direct methods with arguments, which you then apply on String#concat():
<h:commandButton ... action="#{someController.doSomething(id.concat('SomeTableId'))}" />
Or if you're not on EL 2.2 yet, then use JSTL <c:set> to create a new EL variable with the concatenated values just inlined in value:
<c:set var="tableId" value="#{id}SomeTableId" />
<h:commandButton ... action="#{someController.doSomething(tableId)}" />
See also:
String concatenation in EL for dynamic ResourceBundle key

Related

JSF render contents of attribute dynamically [duplicate]

I need to create a callback for <h:commandButton> while as a parameter I need to pass an argument that is string-concatenated with an external parameter id:
I tried nesting an EL expression something like this:
<h:commandButton ... action="#{someController.doSomething('#{id}SomeTableId')}" />
However this failed with an EL exception. What is a right syntax/approach to do this?
If you're already on EL 3.0 (Java EE 7; WildFly, Tomcat 8, GlassFish 4, etc), then you could use the new += operator for this:
<h:commandButton ... action="#{someController.doSomething(id += 'SomeTableId')}" />
If you're however not on EL 3.0 yet, and the left hand is a genuine java.lang.String instance (and thus not e.g. java.lang.Long), then use EL 2.2 capability of invoking direct methods with arguments, which you then apply on String#concat():
<h:commandButton ... action="#{someController.doSomething(id.concat('SomeTableId'))}" />
Or if you're not on EL 2.2 yet, then use JSTL <c:set> to create a new EL variable with the concatenated values just inlined in value:
<c:set var="tableId" value="#{id}SomeTableId" />
<h:commandButton ... action="#{someController.doSomething(tableId)}" />
See also:
String concatenation in EL for dynamic ResourceBundle key

jsf el expression to build methodname

Is something like that possibile to build the MethodName with a variable value?
<c:forEach value="#{db.pojo.classList}" var="v">
<c:forEach items="#{db.pojo.methodNamesList}" var="o">
<c:set var="superman" value="#{o}" />
#{v.[superman]}
</c:forEach>
</c:forEach >
... database.entity.list is a List of Generic classes.
List<?> list..
I can use the generic class if i know the Methodname.
<c:forEach value="#{db.pojo.classList}" var="v">
#{v.value}
</c:forEach >
#{v.[superman]}
Punch that period.
#{v[superman]}
That <c:set> is unnecessary, by the way.
#{v[o]}
I would only use more self-documenting variable names though. E.g.
#{bean[property]}
#{entity[field]}
See also:
Our EL wiki page

JSF2 variable element of bundle [duplicate]

I need to create a callback for <h:commandButton> while as a parameter I need to pass an argument that is string-concatenated with an external parameter id:
I tried nesting an EL expression something like this:
<h:commandButton ... action="#{someController.doSomething('#{id}SomeTableId')}" />
However this failed with an EL exception. What is a right syntax/approach to do this?
If you're already on EL 3.0 (Java EE 7; WildFly, Tomcat 8, GlassFish 4, etc), then you could use the new += operator for this:
<h:commandButton ... action="#{someController.doSomething(id += 'SomeTableId')}" />
If you're however not on EL 3.0 yet, and the left hand is a genuine java.lang.String instance (and thus not e.g. java.lang.Long), then use EL 2.2 capability of invoking direct methods with arguments, which you then apply on String#concat():
<h:commandButton ... action="#{someController.doSomething(id.concat('SomeTableId'))}" />
Or if you're not on EL 2.2 yet, then use JSTL <c:set> to create a new EL variable with the concatenated values just inlined in value:
<c:set var="tableId" value="#{id}SomeTableId" />
<h:commandButton ... action="#{someController.doSomething(tableId)}" />
See also:
String concatenation in EL for dynamic ResourceBundle key

Using a variable property inside msg

So I am working on an app and I have it set up so the following line
<h:outputText value = "#{msg['properties.help.keys.example.text']}" />
Will print some output value from a properties file. What I want is to make part of that string it uses to find the properties variable.
I.E.
<h:outputText value = "#{msg['properties.help.keys.' + cc.attrs.key + '.text']}" />
Where cc.attrs.key is a value I pass into the xhtml. Is this possible if so how do you do it?
You can't concatenate strings in EL expressions like that. The + is in EL exclusively a sum operator for numbers. You need to use <c:set> to concatenate strings with EL expressions before nesting it in another EL expression. Concatenating the string is then solely be done by just inlining the expression.
<c:set var="key" value="properties.help.keys.#{cc.attrs.key}.text" />
<h:outputText value="#{msg[key]}" />
In the upcoming EL 3.0, there will be a new EL operator & for concatenating strings in EL expressions. The use of the & character as operator is however discutable in XML based view technologies as it's a reserved XML character, I've been in discussion with EL guys about that. It should be possible with an alternative operator like ct which is in line with gt, lt, etc.
Update: in EL 3.0, there is the new EL operator += for concatenating strings in EL expressions. Your use case can then be solved as follows:
<h:outputText value="#{msg['properties.help.keys' += cc.attrs.key += '.text']}" />

In JSF what is the shortest way to output List<SomeObj> as comma separated list of "name" properties of SomeObj

I have a question about outputing a list of objects as a comma separated list in JSF.
Let's say:
public class SomeObj {
private String name;
... constructors, getters and setters ...
}
and List<SomeObj>:
List<SomeObj> lst = new ArrayList<SomeObj>();
lst.add(new SomeObj("NameA"));
lst.add(new SomeObj("NameB"));
lst.add(new SomeObj("NameC"));
to output it as a listbox I can use this code:
<h:selectManyListbox id="id1"
value="#{listHolder.selectedList}">
<s:selectItems value="#{listHolder.lst}"
var="someObj"
label="#{someObj.name}"/>
<s:convertEntity />
</h:selectManyListbox>
But what is the easiest way to output the list as is, comma seperated ? Like this:
NameA, NameB, NameC
Should I use JSTL <c:forEach/> or may be the <s:selectItems/> tag can also be used ?
Given a List<Person> persons where Person has a name property,
If you're already on Java EE 7 with EL 3.0, then use EL stream API.
#{bean.persons.stream().map(p -> p.name).reduce((p1, p2) -> p1 += ', ' += p2).get()}
If you're not on EL 3.0 yet, but have JSF 2.x at hands, then use Facelets <ui:repeat>.
<ui:repeat value="#{bean.persons}" var="person" varStatus="loop">
#{person.name}#{not loop.last ? ', ' : ''}
</ui:repeat>
Or if you're still on jurassic JSP, use JSTL <c:forEach>.
<c:forEach items="#{bean.persons}" var="person" varStatus="loop">
${person.name}${not loop.last ? ', ' : ''}
</c:forEach>
See also:
How iterate over List<T> and render each item in JSF Facelets
JSTL in JSF2 Facelets... makes sense?
use <ui:repeat> (from facelets). It's similar to c:forEach
Or pre-compute the comma-separated string in the managed bean, and obtain it via a getter.
If you can't use varStatus because you're stuck with using JSF 1.2, you can do:
<ui:repeat value="#{listHolder.lst}" var="someObj">#{someObj != listHolder.lst[0] ? ',' : ''}
#{someObj.name}</ui:repeat>
The absence of whitespace around the EL-expressions is deliberate, we don't want a space to appear there in the rendered HTML.

Resources