<%= foo%>和$ {foo}之间的区别

Ric*_*ett 3 jsp el scriptlet

首次在JSP中编码,我需要将变量的值呈现给HTML.看起来有很多方法可以做到这一点; 这些之间的区别是什么(假设我有一个变量命名foo)?

<%= foo %>
Run Code Online (Sandbox Code Playgroud)

${ foo }
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

这一点,使用老式的输出小脚本这是因为十年气馁,

<%= foo %>
Run Code Online (Sandbox Code Playgroud)

在常规scriptlet中与以下内容基本相同:

<% out.println(foo); %>
Run Code Online (Sandbox Code Playgroud)

在普通的Java servlet类中,它基本上与以下内容基本相同(您可能已经知道,JSP最终会被编译并转换为servlet类):

response.getWriter().println(foo);
Run Code Online (Sandbox Code Playgroud)

其中foo从而被声明为本地/实例变量.因此,它将本地/实例变量打印foo到完全声明的位置的HTTP响应.


这是使用表达式语言(EL),这是自2003年JSP 2.0以来的推荐方法,

${ foo }
Run Code Online (Sandbox Code Playgroud)

在常规scriptlet中与以下内容基本相同,具有PageContext#findAttribute():

<% 
    Object foo = pageContext.findAttribute("foo");
    if (foo != null) out.println(foo);
%>
Run Code Online (Sandbox Code Playgroud)

这相当于:

<% 
    Object foo = pageContext.getAttribute("foo");
    if (foo == null) foo = request.getAttribute("foo");
    if (foo == null) foo = session.getAttribute("foo");
    if (foo == null) foo = application.getAttribute("foo");
    if (foo != null) out.println(foo);
%>
Run Code Online (Sandbox Code Playgroud)

因此,它将页面/请求/会话/应用程序范围中的属性的第一个非空出现打印到完全声明的位置的响应.如果没有,则不打印任何内容.请注意,因此不打印"空"的文本字符串时,它的null,就违背了什么小脚本做.