我有以下代码的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] 删除。
我来说两句