Avatar billede denny Nybegynder
19. januar 2008 - 12:47 Der er 11 kommentarer

Er det muligt at concatenate to vardi i nested:write property?

Hej Eksperten,

Jeg har bruge for at concatenate 2 property vædi i en HTML TD fieds. Er det muligt eller hvordan gære jeg det?

Mvh
Denny
Avatar billede arne_v Ekspert
19. januar 2008 - 15:39 #1
Har du EL support ?

(prøv evt. også at poste et lille eksempel - bare så vi er sikre på at vi ikke
misforstår hvad du vil)
Avatar billede denny Nybegynder
19. januar 2008 - 16:23 #2
Havd mener du med EL? mit eksempel f.eks:

<tr>
  <td scope="row"><fmt:message key="firstname"/></td>
  <td><nested:write property="firstname"/></td>
</tr
<tr>
  <td scope="row"><fmt:message key="lastname"/></td>
  <td><nested:write property="surname"/></td>
</tr

Men jeg vil gerne har begge navn på et felt e.efs. fullename.

/Denny
Avatar billede arne_v Ekspert
19. januar 2008 - 16:31 #3
EL = Expression Language

Hvis du fortælle rhvilken version af Struts du bruger kan jeg prøve om jeg kan få EL til at virke.
Avatar billede denny Nybegynder
20. januar 2008 - 12:15 #4
Hej igen,

Jeg bruger struts v. 1.2.8
Avatar billede arne_v Ekspert
20. januar 2008 - 20:28 #5
Nu har jeg kigget på det. Faktisk en hel del.

Og det korte af det lange er at du kan:

<tr>
  <td scope="row"><fmt:message key="fullname"/></td>
  <td><nested:write property="firstname"/><nested:write property="surname"/></td>
</tr>

og at der ikke rigtigt er nogle EL muligheder.
Avatar billede arne_v Ekspert
20. januar 2008 - 20:33 #6
Den lidt længere forklaring kommer her.

Jeg starter med et basis eksempel:

<%@ page language="java" import="java.util.*" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %>
<%!
public class C1
{
    private String hdr;
    private List c2;
    public C1() {
        this("");
    }
    public C1(String hdr) {
        this.hdr = hdr;
        c2 = new ArrayList();
    }
    public String getHdr() {
        return hdr;
    }
    public List getC2() {
        return c2;
    }
    public void add(C2 o) {
        c2.add(o);
    }
}
public class C2
{
    private String s1;
    private String s2;
    public C2() {
        this("", "");
    }
    public C2(String s1, String s2) {
        this.s1 = s1;
        this.s2 = s2;
    }
    public String getS1() {
        return s1;
    }
    public void setS1(String s1) {
        this.s1 = s1;
    }
    public String getS2() {
        return s2;
    }
    public void setS2(String s1) {
        this.s2 = s2;
    }
}
%>
<%
C1 v1 = new C1("Gruppe 1");
v1.add(new C2("1", "A"));
v1.add(new C2("2", "BB"));
C1 v2 = new C1("Gruppe 2");
v2.add(new C2("3", "CCC"));
v2.add(new C2("4", "DDDD"));
List lst = new ArrayList();
lst.add(v1);
lst.add(v2);
request.setAttribute("lst", lst);
%>
<html>
<head>
<title>Nested test</title>
</head>
<body>
<logic:iterate id="c1" name="lst">
<bean:write name="c1" property="hdr"/>
<table border="true">
<tr>
<th>s1</th>
<th>s2</th>
<th>s1+s2</th>
</tr>
<nested:root name="c1">
<nested:iterate property="c2">
<tr>
<td><nested:write property="s1"/></td>
<td><nested:write property="s2"/></td>
<td><nested:write property="s1"/><nested:write property="s2"/></td>
</tr>
</nested:iterate>
</nested:root>
</table>
</logic:iterate>
</body>
</html>

og så går jeg på jagt efter nested-el og finder ud af at kun bean, logic og html
findes i en EL udgave.

Nå men så omskriver jeg det da bare til plain bean:

<%@ page language="java" import="java.util.*" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%!
public class C1
{
    private String hdr;
    private List c2;
    public C1() {
        this("");
    }
    public C1(String hdr) {
        this.hdr = hdr;
        c2 = new ArrayList();
    }
    public String getHdr() {
        return hdr;
    }
    public List getC2() {
        return c2;
    }
    public void add(C2 o) {
        c2.add(o);
    }
}
public class C2
{
    private String s1;
    private String s2;
    public C2() {
        this("", "");
    }
    public C2(String s1, String s2) {
        this.s1 = s1;
        this.s2 = s2;
    }
    public String getS1() {
        return s1;
    }
    public void setS1(String s1) {
        this.s1 = s1;
    }
    public String getS2() {
        return s2;
    }
    public void setS2(String s1) {
        this.s2 = s2;
    }
}
%>
<%
C1 v1 = new C1("Gruppe 1");
v1.add(new C2("1", "A"));
v1.add(new C2("2", "BB"));
C1 v2 = new C1("Gruppe 2");
v2.add(new C2("3", "CCC"));
v2.add(new C2("4", "DDDD"));
List lst = new ArrayList();
lst.add(v1);
lst.add(v2);
request.setAttribute("lst", lst);
%>
<html>
<head>
<title>Not nested test</title>
</head>
<body>
<logic:iterate id="c1" name="lst">
<bean:write name="c1" property="hdr"/>
<table border="true">
<tr>
<th>s1</th>
<th>s2</th>
<th>s1+s2</th>
</tr>
<logic:iterate id="c2" name="c1" property="c2">
<tr>
<td><bean:write name="c2" property="s1"/></td>
<td><bean:write name="c2" property="s2"/></td>
<td><bean:write name="c2" property="s1"/><bean:write name="c2" property="s2"/></td>
</tr>
</logic:iterate>
</table>
</logic:iterate>
</body>
</html>

og begynder at kigge på struts el.

Men ak og ve. bean:write er ikke lavet i EL version. De henviser til JSTL.

Suk.

OK, så laver vi det samme i JSTL:

<%@ page language="java" import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%!
public class C1
{
    private String hdr;
    private List c2;
    public C1() {
        this("");
    }
    public C1(String hdr) {
        this.hdr = hdr;
        c2 = new ArrayList();
    }
    public String getHdr() {
        return hdr;
    }
    public List getC2() {
        return c2;
    }
    public void add(C2 o) {
        c2.add(o);
    }
}
public class C2
{
    private String s1;
    private String s2;
    public C2() {
        this("", "");
    }
    public C2(String s1, String s2) {
        this.s1 = s1;
        this.s2 = s2;
    }
    public String getS1() {
        return s1;
    }
    public void setS1(String s1) {
        this.s1 = s1;
    }
    public String getS2() {
        return s2;
    }
    public void setS2(String s1) {
        this.s2 = s2;
    }
}
%>
<%
C1 v1 = new C1("Gruppe 1");
v1.add(new C2("1", "A"));
v1.add(new C2("2", "BB"));
C1 v2 = new C1("Gruppe 2");
v2.add(new C2("3", "CCC"));
v2.add(new C2("4", "DDDD"));
List lst = new ArrayList();
lst.add(v1);
lst.add(v2);
request.setAttribute("lst", lst);
%>
<html>
<head>
<title>Standard test</title>
</head>
<body>
<c:forEach var="c1" items="${lst}">
${c1.hdr}
<table border="true">
<tr>
<th>s1</th>
<th>s2</th>
<th>s1+s2</th>
</tr>
<c:forEach var="c2" items="${c1.c2}">
<tr>
<td>${c2.s1}</td>
<td>${c2.s2}</td>
<td>${c2.s1}${c2.s2}</td>
</tr>
</c:forEach>
</table>
</c:forEach>
</body>
</html>

og forsøger også med ${c2.s1+c2.s2} for at finde ud af EL slet ikke understøtter
string concatanation.

Derfor 2 x separat output.

Præcis samme teknik som i basis udgaven med nested:write (dog er syntaxen nok lidt
lettere).
Avatar billede denny Nybegynder
21. januar 2008 - 10:18 #7
Hej Arne,

Super 1000 tak for super forklaring. Du har points.. hvordan gøre jeg det?

Hilsen
Denny
Avatar billede denny Nybegynder
21. januar 2008 - 10:19 #8
Ups! jeg ment at du skal har points.
Avatar billede arne_v Ekspert
21. januar 2008 - 15:46 #9
jeg skal først ligge et rigtigt svar
Avatar billede arne_v Ekspert
29. august 2008 - 03:01 #10
så mangler du bare at acceptere svaret
Avatar billede arne_v Ekspert
28. oktober 2008 - 03:02 #11
?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester