微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 <jsp:getProperty> 需要 <jsp:useBean> 而 EL 不需要?

我有带有以下代码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> 如何不能像给定链接中所述的 EL 那样工作?为什么它不能调用 getClass(),getmethod() 并“省去”我们输入 class,type的麻烦强>,id<jsp:useBean>内?仅仅是因为 EL 较新,从而为我们提供了更少的输入代码,还是隐藏在这背后的其他东西我没有看到?

解决方法

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

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

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

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


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

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

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

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

随着时间的流逝,人们发现 JSTL 中的所有 ${} 评估以及几乎每个人都知道的所有语言 - 或迟早会遇到 - 可以由 servlet 容器直接评估,从而获得很多更干净的内容。 JSP 规范得到增强,现在您可以直接实现 EL,无需使用 <jsp:getProperty>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。