【问题标题】:JSTL call a method that's not a setter or a getterJSTL 调用不是 setter 或 getter 的方法
【发布时间】:2013-12-12 07:37:51
【问题描述】:

我在一个类中有这些方法:

 public HarfDate getHarfTo() {
        return to;
      }

我只是想知道如何在 JSTL 中调用它,因为我试图这样称呼它:

${exam.getHarfTo()}

但它不起作用!

注意:考试是包含这些方法的类的一个实例

  • 如果解决方案是将方法设为静态,则 to 不是类中的静态成员

【问题讨论】:

  • Alex Theedom 的回复在这种特殊情况下是正确的。但我很好奇:您的 web.xml 中定义的 servlet 规范编号是什么?如果低于 2.5,请尝试将其设置为 2.5 并重试。我相信自 2.5 servlet 规范以来,应该可以从 EL 表达式调用方法。
  • 你得到答案了吗??因为我面临同样的问题.....

标签: java jsp jstl jsp-tags


【解决方案1】:

exam 对象的实例必须在 EL 范围内,例如 pageScope。假设 exam 对象引用在 pageScope 中被称为“考试”,那么以下 EL 将调用 getHarfTo 方法:

   ${exam.harfTo}

注意:您不能调用 setter 方法。

为了扩展上述内容(仅作为示例),我们可以使用 scriptlet 在pageScope 中设置exam 实例(注意不推荐使用scriptlet,这只是一个用于说明的示例)

    <%
        com.example.Exam exam = new com.example.Exam();
        pageContext.setAttribute("exam", exam, PageContext.PAGE_SCOPE);
    %>

现在我们可以通过 EL 访问考试对象:${exam.harfTo}

考试对象可以添加到其他范围,例如请求范围和会话范围。

Scriptlet 和 EL

   <%
        java.util.ArrayList cities = new java.util.ArrayList();
        cities.add("NYC");
        cities.add("SFO");
   %>

在 scriptlet 中创建的变量不能被 EL 直接访问。因此,城市变量不能在 JSTL 标记中使用。

为此,我们首先需要将其置于某个范围内。例如:

    <%
        java.util.ArrayList cities = new java.util.ArrayList();
        cities.add("NYC");
        cities.add("SFO");
        pageContext.setAttribute("cities", cities, PageContext.PAGE_SCOPE);
    %>

这使得由城市变量引用的对象,在pageScope 中以“城市”的名称可用。

    <select name="Cities">
           <c:forEach var="city" items ="${cities}">
                  <option> ${city}</option>
           </c:forEach>
    </select>

现在可以访问城市变量。 不能将 scriptlet 作为 EL 表达式的属性。

    <select name="Cities">
           <%for(int i = 0; i < cities.size(); i++) {%>
           <option>${cities[<%=i%>]}</option>
           <%}%>
    </select>

如果考试类符合 bean 约定,您也可以使用标准操作

    <jsp:useBean id="exam" class="com.example.Exam" scope="pageScope"/>
    The value return by the method called harfTo: <jsp:getProperty name="exam" property="harfTo"/>

不要忘记导入 JSTL 标签库:

   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix ="c" %>

编辑:

如果您有一个集合 exams 包含 exam 对象,那么您可以使用 JSTL 像这样遍历集合:

 <c:forEach var="exam" items ="${exams}">
         ${exam.harfTo}
 </c:forEach>

【讨论】:

  • exam 是一个显示表的 id,循环遍历考试对象的集合
【解决方案2】:

你需要一个 TLD 来做你想做的事。

This 链接有一个非常详细的例子。

HTH

【讨论】:

    【解决方案3】:

    要访问该方法,只需去掉 get 部分。

    ${exam.harfTo}
    

    如果你想调用一个类的 setter 方法,同样的工作。

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2017-09-09
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多