Vra

Ek het 'n Java boontjie soos volg:

class Person {
  int age;
  String name;
}

Ek wil graag herhaal oor 'n versameling van hierdie bone in 'n JSP, wat elke persoon in 'n HTML-tabel ry, en in die laaste ry van die tabel wil ek graag die totaal van al die eeue wys.

Die kode om te genereer die tafel rye sal soos volg lyk:

<c:forEach var="person" items="${personList}">
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>

Maar ek sukkel om 'n manier om die ouderdom totale dat sal getoon word in die finale ry te bereken vind sonder om kode , enige voorstelle scriptrendering'?

Was dit nuttig?

Oplossing

Nota: Ek het probeer die kombinasie van antwoorde op 'n omvattende lys te maak. Ek het genoem name waar toepaslik om krediet te gee waar dit toekom.

Daar is baie maniere om hierdie probleem op te los, met voor- / nadele wat verband hou met elk:

Pure JSP Oplossing

As ScArcher2 bogenoemde, 'n baie maklike en eenvoudige oplossing vir die probleem is om dit direk te implementeer in die JSP as so:

<c:set var="ageTotal" value="${0}" />
<c:forEach var="person" items="${personList}">
  <c:set var="ageTotal" value="${ageTotal + person.age}" />
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
${ageTotal}

Die probleem met hierdie oplossing is dat die JSP raak verwarrend tot die punt waar jy sowel dalk bekendgestel scriplets. As jy verwag dat almal op soek na die bladsy kan volg die basiese logika bied dit 'n goeie keuse sal wees.

Pure EL oplossing

As jy reeds op EL 3.0 (Java EE 7 / Servlet 3.1), gebruik nuwe ondersteuning vir strome en lambdas :

<c:forEach var="person" items="${personList}">
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
${personList.stream().map(person -> person.age).sum()}

JSP EL funksies

Nog 'n manier om uitset die totale sonder die bekendstelling van scriplet kode in jou JSP is 'n EL funksie te gebruik. EL funksies toelaat om 'n openbare statiese metode in 'n openbare klas te bel. Byvoorbeeld, as jy wil graag herhaal oor jou versameling en som die waardes wat jy kan 'n openbare statiese metode genoem som (Lys mense) te definieer in 'n openbare klas, miskien genoem PersonUtils. In jou tld lêer sal jy die volgende verklaring plaas:

<function>
  <name>sum</name>
  <function-class>com.example.PersonUtils</function-class>
  <function-signature>int sum(java.util.List people)</function-signature>
</function> 

In jou JSP jy sou skryf:

<%@ taglib prefix="f" uri="/your-tld-uri"%>
...
<c:out value="${f:sum(personList)}"/>

JSP EL funksies het 'n paar voordele. Hulle laat jou bestaande Java metodes gebruik sonder die behoefte om die kode om 'n spesifieke UI (Custom Tag biblioteke). Hulle is ook kompak en sal 'n nie-programmering georiënteerde persoon nie verwar.

Custom Tag

Nog 'n opsie is om jou eie persoonlike tag rol. Hierdie opsie sal die meeste opstel betrek, maar sal jy gee wat ek dink jy is esentially soek, Absolutly geen scriptlets. 'N mooi handleiding vir die gebruik van eenvoudige persoonlike etikette kan gevind word by http : //java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701

Die stappe wat betrokke is sluit in subclassing TagSupport:

public PersonSumTag extends TagSupport {

   private List personList;

   public List getPersonList(){
      return personList;
   }

   public void setPersonList(List personList){
      this.personList = personList;
   }

   public int doStartTag() throws JspException {
      try {
        int sum = 0;
        for(Iterator it = personList.iterator(); it.hasNext()){
          Person p = (Person)it.next();
          sum+=p.getAge();
        } 
        pageContext.getOut().print(""+sum);
      } catch (Exception ex) {
         throw new JspTagException("SimpleTag: " + 
            ex.getMessage());
      }
      return SKIP_BODY;
   }
   public int doEndTag() {
      return EVAL_PAGE;
   }
}

definieer die merker in 'n tld lêer:

<tag>
   <name>personSum</name>
   <tag-class>example.PersonSumTag</tag-class>
   <body-content>empty</body-content>
   ...
   <attribute>
      <name>personList</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.util.List</type>
   </attribute>
   ...
</tag>

Verklaar die taglib op die top van jou JSP:

<%@ taglib uri="/you-taglib-uri" prefix="p" %>

en gebruik die tag:

<c:forEach var="person" items="${personList}">
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
<p:personSum personList="${personList}"/>

Wys Tag

As zmf vroeër genoem, jy kan ook gebruik maak van die vertoning tag, hoewel jy sal nodig hê om die nodige biblioteke sluit in:

http://displaytag.sourceforge.net/11/tut_basic.html

Ander wenke

Is jy probeer om al die eeue optel?

Jy kan dit bereken in jou kontroleerder en net die gevolg in die JSP vertoon.

Jy kan 'n persoonlike etiket om die berekening te doen skryf.

Jy kan dit bereken in die JSP met behulp van JSTL soos hierdie.

<c:set var="ageTotal" value="${0}" />
<c:forEach var="person" items="${personList}">
  <c:set var="ageTotal" value="${ageTotal + person.age}" />
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
${ageTotal}

ScArcher2 het die eenvoudigste oplossing . As jy iets soos kompakte as moontlik wou, kon jy 'n tag biblioteek te skep met 'n "som" funksie in dit. Iets soos:

class MySum {
public double sum(List list) {...}
}

In jou TLD:

<function>
<name>sum</name>
<function-class>my.MySum</function-class>
<function-signature>double sum(List)</function-signature>
</function>

In jou JSP, jy iets soos wil hê:

<%@ taglib uri="/myfunc" prefix="f" %>

${f:sum(personList)}

Dit is 'n bietjie mag nou wel, maar in jou kontroleerder kode wat jy kan net skep 'n dummy Persoon voorwerp met die totale in dit!

Hoe word jy kry van jou voorwerpe? HTML kan jy stel 'n element wat aan die onderkant van enige data sal sit jy het, daarom kon jy net stel die totale apart van die persoon voorwerpe en uitset dit op die bladsy as-is sonder enige berekening op die JSP bladsy.

jy kan herhaal oor 'n versameling met behulp van JSTL volgens volgende

<c:forEach items="${numList}" var="item">
      ${item}
</c:forEach>

As dit is 'n kaart wat jy kan doen op die volgende

<c:forEach items="${numMap}" var="entry">
  ${entry.key},${entry.value}<br/>
</c:forEach>

Die berekening Totale / of ander opsommings in die beheerder - nie in die JSP - is regtig sterk verkieslik

.

Gebruik Java-kode en 'n MVC benadering, bv Lente MVC raamwerk, in plaas van probeer om te veel te doen in JSP of JSTL; doen beduidende berekening in hierdie tale is swak en stadig, en maak jou JSP bladsye veel minder duidelik.

Voorbeeld:

class PersonList_Controller implements Controller {
    ...
    protected void renderModel (List<Person> items, Map model) {
        int totalAge = 0;
        for (Person person : items) {
            totalAge += person.getAge();
        }
        model.put("items", items);
        model.put("totalAge", totalAge);
    }
}

Design besluitneming wys -. Oral 'n totale vereis word, kan verstaanbaar volgende maand verleng word tot 'n gemiddelde, 'n mediaan, 'n standaardafwyking vereis

JSTL berekeninge & opsomming is skaars bymekaar hou, in net om 'n totale. Is jy regtig gaan wil enige verdere opsomming vereistes in JSTL ontmoet? Ek glo die antwoord is NEE -. En dat dus die korrekte ontwerp besluit is om te bereken in die Kontroleur, as ewe / meer eenvoudig en beslis meer geloofwaardige-vereistes extensible

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top