我有带有以下代码的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"/> call findAttribute()实现的。但有一个很大的区别。用EL编写的代码不需要<jsp:useBean>,而<jsp:getProperty>只与<jsp:useBean>结合使用。
我们可能会问,${person.name}如何知道什么类型的对象是"person“。嗯,它使用类似于这的东西。我的问题是,<jsp:getProperty>怎么不能像给定链接中所述的EL那样工作呢?为什么不能调用getClass()、getMethod()和“空闲”我们在<jsp:useBean>中输入类、类型、id?这仅仅是因为EL是较新的,从而为我们提供了更少的输入所需的代码,还是在这个背后隐藏了一些我没有看到的东西?
发布于 2021-01-08 09:15:51
正如您的另一个问题的答案中已经提到的,<jsp:getProperty>使用<jsp:useBean>,因为JSP规范这样说。为什么它被决定这样工作,这是一个最好的问题,对那些起草规范。找出确切的原因也许能满足你的好奇心:)但是它不会改变标签的工作方式。基本上,这就是我们所拥有的,这就是它的工作原理,这就是我们所使用的。
此外,正如我在回答这个问题时提到的,您可以使用下列系统属性“解耦”这两个标记,至少在Tomcat中是这样(我不知道在其他servlet容器中是否可能)
-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>。
https://stackoverflow.com/questions/65621836
复制相似问题