为什么<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>
.
我有 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 漂亮而干净的代码,而不会在其中扔一堆小脚本
随着时间的推移,人们开始编写自己的标签,并且标签库出现了。最流行的一种是 JSTL,您通常会在 <c:
前缀下找到它。这些标签比 <jsp:
提供的标签更强大、更灵活,因此人们开始在几乎所有 Web 应用程序中使用它们。我不确定 JSTL 是否引入了 ${}
表示法,但该语言因 JSTL 而流行起来。
所以时间过去了,人们发现 JSTL 中的所有那些 ${}
求值以及几乎每个人都知道 - 或者迟早会遇到 - 的所有语言都可以由 servlet 容器直接求值,从而获得更清晰的内容。 JSP 规范得到增强,现在您可以直接实现 EL,无需使用 <jsp:getProperty>
.