【问题标题】:Why does <jsp:getProperty> need <jsp:useBean>, but EL doesn't?为什么 <jsp:getProperty> 需要 <jsp:useBean> 而 EL 不需要?
【发布时间】:2021-04-13 17:42:51
【问题描述】:

我有 servlet,代码如下:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Person p = new Person("Mike");
    req.setAttribute("person", p);

    RequestDispatcher view = req.getRequestDispatcher("/result.jsp");
    view.forward(req, resp);
}

result.jsp 中打印人名有两种选择。使用&lt;jsp:getProperty&gt;Expression language

简单的EL代码:

<!DOCTYPE html>

<html><body>

Welcome ${person.name}

</body></html>

或者像这样使用 jsp:getProperty

<!DOCTYPE html>

<html><body>

<jsp:useBean id="person" type="com.example.Person" class="com.example.Person" scope="request"/>
Welcome <jsp:getProperty name="person" property="name"/>

</body></html>

据我了解,这两个用于通过${person.name}&lt;jsp:getProperty name="person" property="name"/&gt; 获取名称的代码都调用findAttribute()。但有一个主要区别。用 EL 编写的代码不需要&lt;jsp:useBean&gt;,而&lt;jsp:getProperty&gt; 只能与&lt;jsp:useBean&gt; 结合使用。

我们可能会问${person.name} 如何知道“人”是什么类型的对象。好吧,它使用类似this 的东西。我的问题是&lt;jsp:getProperty&gt; 怎么不能像给定链接中所述的 EL 一样工作?为什么它不能调用 getClass(),getMethod() 并“省去”我们键入 class,type 的困难强>,id&lt;jsp:useBean&gt; 里面?是因为 EL 较新,因此为我们提供了更少的输入代码,还是隐藏在这背后的其他东西我没有看到?

【问题讨论】:

    标签: jsp servlets javabeans el


    【解决方案1】:

    正如您的this other question 的答案中已经提到的,&lt;jsp:getProperty&gt; 使用&lt;jsp:useBean&gt;,因为 JSP 规范是这样说的。为什么决定这样工作是最好向那些起草规范的人提出的问题。找出确切的原因可能会满足您的好奇心 :) 但它不会对标签的工作方式产生任何改变。所以基本上,这就是我们所拥有的,这就是它的工作方式,这就是我们使用的。

    此外,正如我在对该问题的回答中提到的,您可以使用the following system property 至少在 Tomcat 中“解耦”这两个标签(我不知道在其他 servlet 容器中是否可能):

    -Dorg.apache.jasper.compiler.Generator.STRICT_GET_PROPERTY=false
    

    现在&lt;jsp:getProperty&gt; 的行为类似于 EL 表达式。


    话虽如此,我喜欢这句话(归因于一群人)说:

    事情就是这样,因为他们是那样的

    JSP 已经存在了一段时间了。起初,没有表达语言。如果要使用服务器标签,则必须使用规范中定义的 &lt;jsp: 前缀中的标签,并且服务器需要实现它们。编写干净整洁的 JSP 而不在其中扔一堆 scriptlet 和making a mess,这是“包括电池”的最低限度。您可以使用 tag handler package 中的类和接口自行构建不包含电池的内容。

    随着时间的推移,人们开始编写自己的标签,标签库也应运而生。最受欢迎的一种是JSTL,您通常会在&lt;c: 前缀下找到它。这些标签比&lt;jsp: 提供的标签更强大、更灵活,因此人们开始在几乎所有的Web 应用程序中使用这些标签。我不确定 JSTL 是否引入了 ${} 表示法,但这种语言因为 JSTL 而变得流行。

    时间过去了,人们发现 JSTL 中的所有 ${} 评估以及几乎每个人都知道或迟早会遇到的所有语言都可以由 servlet 容器直接评估,从而获得更清晰的内容. JSP 规范得到了增强,现在您可以直接实现 EL,而无需使用&lt;jsp:getProperty&gt;

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 2018-07-30
      • 2011-06-18
      • 1970-01-01
      • 2016-01-10
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      相关资源
      最近更新 更多