注意:我尝试将答案合并为一个全面的列表。 我在适当的地方提到名称,以便在哪里提供信用。
有很多方法可以解决这个问题,每个方面都有优点/缺点:
纯JSP解决scheme
正如上面提到的ScArcher2一样,解决这个问题的一个非常简单的方法就是直接在JSP中实现,如下所示:
${person.name}${person.age} ${ageTotal}
这个解决scheme的问题是JSP变得混乱,以至于你可能已经引入了脚本。 如果您预期每个看到该页面的人都能够遵循目前的基本逻辑,那么这是一个不错的select。
纯EL解决scheme
如果您已经使用EL 3.0(Java EE 7 / Servlet 3.1),请使用对stream和lambdas的新支持:
${person.name}${person.age} ${personList.stream().map(person -> person.age).sum()}
JSP EL函数
输出总量而不将脚本代码引入JSP的另一种方法是使用EL函数。 EL函数允许您在公共类中调用公共静态方法。 例如,如果您想迭代您的集合并对这些值进行求和,则可以在公共类(可能称为PersonUtils)中定义一个名为sum(List people)的公共静态方法。 在你的tld文件中,你可以放置下面的声明:
sumcom.example.PersonUtilsint sum(java.util.List people)
在你的JSP中,你会写:
...
JSP EL函数有几个好处。 它们允许您使用现有的Java方法,而无需编写特定的UI(自定义标签库)。 它们也很紧凑,不会混淆非编程导向的人。
自定义标签
还有一个select是推出自己的自定义标签。 这个选项将涉及最多的设置,但会给你我觉得你实际上寻找,绝对没有scriptlet。 使用简单的自定义标签的一个很好的教程可以在http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701find
涉及的步骤包括子类别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文件中定义标签:
personSumexample.PersonSumTagempty ... personListtruetruejava.util.List ...
在JSP的顶部声明taglib:
并使用标签:
${person.name}${person.age}
显示标签
正如前面提到的zmf,你也可以使用display标签,尽pipe你需要包含相应的库: