当前位置 : 主页 > 编程语言 > java >

jsp – 计算c:forEach循环中所有数字的总和

来源:互联网 收集:自由互联 发布时间:2021-06-25
我有一个这样的Java bean: class Person { int age; String name;} 我想在JSP中迭代这些bean的集合,显示HTML表格行中的每个人,并且在表的最后一行,我想显示所有年龄的总数. 生成表行的代码将如下所
我有一个这样的Java bean:

class Person {
  int age;
  String name;
}

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

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

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

然而,我正在努力找到一种方法来计算最后一行将显示的年龄总数,而无需使用scriptlet代码,任何建议?

注意:我尝试组合答案做一个全面的列表.我在适当的时候提到名称,以便在到期时给予信用.

有很多方法来解决这个问题,与每个相关的利弊:

纯JSP解决方案

正如上面提到的ScArcher2一样,一个非常容易和简单的解决方案就是直接在JSP中实现:

<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会让您感到困惑,因为您可能会引入scriplet.如果您期待每个人看页面都能够遵循基本的逻辑,这是一个很好的选择.

纯EL溶液

如果您已经在EL 3.0(Java EE 7 / Servlet 3.1)上使用新的支持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中不引入scriplet代码是使用EL函数. EL函数允许您在公共类中调用public static方法.例如,如果您想迭代您的集合并对值进行求和,您可以在公共类中定义一个名为sum(List people)的公共静态方法,也许称为PersonUtils.在您的tld文件中,您将放置以下声明:

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

在你的JSP中你会写:

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

JSP EL功能有一些好处.它们允许您使用现有的Java方法,而不需要编码到特定的UI(自定义标签库).他们也是紧凑的,不会混淆一个非编程导向的人.

自定义标签

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

所涉及的步骤包括对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文件中定义标签:

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

<%@ 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,您也可以使用显示标签,尽管您需要包含相应的库:

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

网友评论