gpt4 book ai didi

jsp - 计算c中所有数字的总和 :forEach loop

转载 作者:行者123 更新时间:2023-12-02 02:17:57 25 4
gpt4 key购买 nike

我有一个像这样的 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>

但是,我正在努力寻找一种方法来计算最后一行中显示的总年龄而不诉诸脚本代码,有什么建议吗?

最佳答案

注意:我尝试结合答案来制作一个全面的列表。我在适当的地方提到了名字,以给予应有的荣誉。

解决这个问题的方法有很多,每种方法都有优缺点:

纯 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)类中的公共(public)静态方法。例如,如果您想迭代集合并对值求和,则可以在公共(public)类(可能称为 PersonUtils)中定义一个名为 sum(List people) 的公共(public)静态方法。在您的 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

关于jsp - 计算c中所有数字的总和 :forEach loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/102964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com