计算 c:forEach 循环中所有数字的总和 [英] Calculate total sum of all numbers in c:forEach loop

查看:38
本文介绍了计算 c:forEach 循环中所有数字的总和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的 Java bean:

I have a Java bean like this:

class Person {
  int age;
  String name;
}

我想在 JSP 中迭代这些 bean 的集合,在 HTML 表格行中显示每个人,并在表格的最后一行显示所有年龄的总数.

I'd like to iterate over a collection of these beans in a JSP, showing each person in a HTML table row, and in the last row of the table I'd like to show the total of all the ages.

生成表格行的代码如下所示:

The code to generate the table rows will look something like this:

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

但是,我正在努力寻找一种方法来计算将在最后一行显示的年龄总数而无需求助于 scriptlet 代码,有什么建议吗?

However, I'm struggling to find a way to calculate the age total that will be shown in the final row without resorting to scriptlet code, any suggestions?

推荐答案

注意:我尝试将答案组合起来,形成一个完整的列表.我在适当的地方提到了名字,以便在适当的时候给予信任.

Note: I tried combining answers to make a comprehensive list. I mentioned names where appropriate to give credit where it is due.

有很多方法可以解决这个问题,每种方法都各有利弊:

There are many ways to solve this problem, with pros/cons associated with each:

纯JSP解决方案

正如上面提到的 ScArcher2,解决这个问题的一个非常简单和简单的方法是直接在 JSP 中实现它,如下所示:

As ScArcher2 mentioned above, a very easy and simple solution to the problem is to implement it directly in the 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}

这个解决方案的问题是 JSP 变得混乱,以至于您可能已经引入了脚本.如果您预计查看页面的每个人都能够遵循当前的基本逻辑,那么这是一个不错的选择.

The problem with this solution is that the JSP becomes confusing to the point where you might as well have introduced scriplets. If you anticipate that everyone looking at the page will be able to follow the rudimentary logic present it is a fine choice.

纯EL解决方案

如果您已经使用 EL 3.0(Java EE 7/Servlet 3.1),请使用对 流和 lambdas:

If you're already on EL 3.0 (Java EE 7 / Servlet 3.1), use new support for streams and 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 函数

另一种在不将脚本代码引入 JSP 的情况下输出总数的方法是使用 EL 函数.EL 函数允许您在公共类中调用公共静态方法.例如,如果您想遍历您的集合并对值求和,您可以在公共类中定义一个名为 sum(List people) 的公共静态方法,可能称为 PersonUtils.在您的 tld 文件中,您将放置以下声明:

Another way to output the total without introducing scriplet code into your JSP is to use an EL function. EL functions allow you to call a public static method in a public class. For example, if you would like to iterate over your collection and sum the values you could define a public static method called sum(List people) in a public class, perhaps called PersonUtils. In your tld file you would place the following declaration:

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

在您的 JSP 中,您将编写:

Within your JSP you would write:

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

JSP EL 函数有一些好处.它们允许您使用现有的 Java 方法,而无需编写特定的 UI(自定义标记库).它们也很紧凑,不会混淆非编程导向的人.

JSP EL Functions have a few benefits. They allow you to use existing Java methods without the need to code to a specific UI (Custom Tag Libraries). They are also compact and will not confuse a non-programming oriented person.

自定义标签

另一种选择是滚动您自己的自定义标签.这个选项将涉及最多的设置,但会给你我认为你本质上正在寻找的东西,绝对没有脚本.可以在 http 上找到使用简单自定义标签的不错教程://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701

Yet another option is to roll your own custom tag. This option will involve the most setup but will give you what I think you are esentially looking for, absolutly no scriptlets. A nice tutorial for using simple custom tags can be found at http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701

所涉及的步骤包括子类化 TagSupport:

The steps involved include 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;
   }
}

在 tld 文件中定义标签:

Define the tag in a tld file:

<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>

在 JSP 顶部声明 taglib:

Declare the taglib on the top of your JSP:

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

并使用标签:

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

显示标签

正如前面提到的 zmf,您也可以使用 display 标签,但您需要包含适当的库:

As zmf mentioned earlier, you could also use the display tag, although you will need to include the appropriate libraries:

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

这篇关于计算 c:forEach 循环中所有数字的总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆