首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么<jsp:getProperty>需要<jsp:useBean>,而EL不需要?

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

Stack Overflow用户
提问于 2021-01-08 00:27:15
回答 1查看 76关注 0票数 1

我有带有以下代码的servlet:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
<!DOCTYPE html>

<html><body>

Welcome ${person.name}

</body></html>

或者像这样使用jsp:getProperty:

代码语言:javascript
复制
<!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"/> call findAttribute()实现的。但有一个很大的区别。用EL编写的代码不需要<jsp:useBean>,而<jsp:getProperty>只与<jsp:useBean>结合使用。

我们可能会问,${person.name}如何知道什么类型的对象是"person“。嗯,它使用类似于这的东西。我的问题是,<jsp:getProperty>怎么不能像给定链接中所述的EL那样工作呢?为什么不能调用getClass()、getMethod()和“空闲”我们在<jsp:useBean>中输入类、类型、id?这仅仅是因为EL是较新的,从而为我们提供了更少的输入所需的代码,还是在这个背后隐藏了一些我没有看到的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-08 09:15:51

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

此外,正如我在回答这个问题时提到的,您可以使用下列系统属性“解耦”这两个标记,至少在Tomcat中是这样(我不知道在其他servlet容器中是否可能)

代码语言:javascript
复制
-Dorg.apache.jasper.compiler.Generator.STRICT_GET_PROPERTY=false

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

话虽如此,但有句话我很喜欢(归因于一群人):

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

JSP已经存在了一段时间了。在一开始,没有表达语言。如果要使用服务器标记,则必须使用规范中定义的<jsp:前缀中的标记,并且服务器需要实现这些标记。这是“电池包括”的最低限度,写JSP漂亮和干净,而不抛出一堆脚本在那里和弄得一团糟。不包括电池的东西,你可以用来自标记处理程序包的类和接口自己构建。

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

因此,时间过去了,人们发现,所有用JSTL进行的${}评估以及几乎所有人都知道的所有语言--或早晚遇到的--都可以由servlet容器直接进行评估,从而获得更干净的内容。JSP规范得到了增强,现在您已经直接实现了EL,而不需要使用<jsp:getProperty>。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65621836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档