为什么<jsp:getProperty>需要<jsp:useBean>,而EL不需要?

Why does <jsp:getProperty> need <jsp:useBean>, but EL doesn't?

我有 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里面打印人名我有两种选择。使用 <jsp:getProperty>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}<jsp:getProperty name="person" property="name"/> 获取名称的代码都调用 findAttribute()。但有一个主要区别。用 EL 编写的代码不需要 <jsp:useBean>,而 <jsp:getProperty> 只能与 <jsp:useBean>.

结合使用

我们可能会问${person.name}如何知道“人”是什么类型的对象。嗯,它使用类似 this 的东西。我的问题是 <jsp:getProperty> 怎么不能像给定 link 中所述的 EL 那样工作?为什么它不能调用 getClass(),getMethod() 并“省去”我们打字的麻烦 class,类型,id<jsp:useBean> 里面?仅仅是因为 EL 较新,从而为我们提供了更少的输入代码,还是在这背后隐藏着其他我没有看到的东西?

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

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

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

现在 <jsp:getProperty> 的行为类似于 EL 表达式。


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

Things are the way they are because they got that way

JSP 已经存在一段时间了。一开始,没有表达语言。如果你想使用服务器标签,你必须使用规范中定义的 <jsp: 前缀中的标签,服务器需要实现它们。这是“包含电池”的最低限度,可以编写 JSP 漂亮而干净的代码,而不会在其中扔一堆小脚本 . What was not batteries included you could build on your own with classes and interfaces from the tag handler package.

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

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