【问题标题】:JSP tags vs expression languageJSP 标签与表达式语言
【发布时间】:2016-11-17 23:27:10
【问题描述】:
下面的JSP标签
<jsp:useBean id=”employee” class=”employee”/>
<jsp:getProperty name=”employee” property=”name”/>
另一个用过的EL
{employee.name}
假设 JSP 编译正确,如果您在访问页面之前在会话中正确填充了一个学生对象,而当学生对象为空时,这两个页面会有什么不同。
谁能给我解释清楚一点?
【问题讨论】:
标签:
jsp
servlets
jsp-tags
【解决方案1】:
JSP 标签:
official Sun documentation 说:
<jsp:useBean> 元素定位或实例化一个 JavaBeans
零件。
它首先尝试定位
豆。如果 bean 不存在,<jsp:useBean> 从
类或序列化模板。
要定位或实例化 bean,<jsp:useBean> 采用以下内容
步骤,按以下顺序:
- 尝试使用您指定的范围和名称定位 bean。
- 使用您指定的名称定义对象引用变量。
- 如果找到 bean,则在变量中存储对它的引用。如果您指定了类型,则为 bean 提供该类型。
- 如果找不到 bean,则从您指定的类实例化它,并将对它的引用存储在新变量中。如果上课
name 代表一个序列化的模板,bean 被实例化
java.beans.Beans.instantiate。
- 如果已经实例化(而不是定位)bean,并且如果它有主体标签或元素(在和
),执行正文标签。
标签将扫描所有范围,按page、request、session和application的顺序:
<jsp:useBean id="beanInstanceName" scope="page|request|session|application" ... >
EL:
它只在我们为 bean 拥有的所有相同范围(和相同优先级顺序)中找到(从不创建)属性。请务必使用the right EL keywords 访问它们。
回到您的问题,对于这两种策略,如果您在范围内设置了 student 对象,则两者都将正确获取它并处理其属性。
否则,useBean 标记将创建一个新对象并将其存储在指定范围内,而 EL 将不打印任何内容,一旦它知道对象何时为空并且不尝试访问其属性。