为什么<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}知道什么类型的对象是“人”。那么,它使用类似于我的问题是如何不能<jsp:getProperty>像给定链接中所述的那样以EL的方式工作?为什么不能调用的getClass() getMethod()和“备用”我们奋斗的打字类型ID里面<jsp:useBean>仅仅是因为EL较新,从而为我们提供了更少的键入代码所需的代码,还是其他隐藏在我后面的东西呢?

博格丹

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

另外,正如我在该问题的答案中提到的那样,您可以使用以下系统属性来“分离”至少在Tomcat中的两个标签(我不知道是否可以在其他servlet容器中使用)

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

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


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

事情就是这样,因为那样

JSP已经存在了一段时间。最初,没有表达语言。如果要使用服务器标记,则必须使用<jsp:规范中定义前缀中的标记,服务器需要实现它们。编写漂亮而干净的JSP而不在其中扔一堆scriptlet并弄乱自己这是“包括电池”的最低要求如果不包括电池,则可以使用标记处理程序包中的类和接口自行构建

随着时间的流逝,人们开始编写自己的标签,并且标签库崭露头角。最受欢迎的之一是JSTL,您通常会在<c:前缀下找到它这些标签比<jsp:提供的标签功能更强大,更灵活,因此人们基本上在每个Web应用程序中都开始使用它们。我不确定JSTL是否引入了该${}符号,但是由于JSTL,该语言开始流行。

因此时间流逝,人们发现${}JSTL中的所有这些评估以及几乎每个人都知道的语言-或早晚碰到的所有语言-都可以由servlet容器直接进行评估,从而获得更加简洁的内容。JSP规范得到了增强,现在您无需使用即可直接实现EL <jsp:getProperty>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章