有没有做衣服的网站,沈阳教做网站,国外排版网站,大学作业旅游网站设计报告文章目录EL 表达式是干什么用的EL 表达式的底层原理EL 表达式可以用在哪些地方EL 表达式用来访问 JavaBean 的属性EL 表达式获取请求参数的值EL 表达式用于运算#xff0c;将结果作为标签的属性值或者直接输出Struts2 的 EL 表达式EL 表达式翻译为 Java 代码的含义EL 表达式示…
文章目录EL 表达式是干什么用的EL 表达式的底层原理EL 表达式可以用在哪些地方EL 表达式用来访问 JavaBean 的属性EL 表达式获取请求参数的值EL 表达式用于运算将结果作为标签的属性值或者直接输出Struts2 的 EL 表达式EL 表达式翻译为 Java 代码的含义EL 表达式示例EL 表达式用在 xml 文件中EL 表达式是干什么用的
EL 表达式的全称是 Expression Language是一种表达式语言。 其语法格式${el表达式}。
EL 表达式可以直接使用并不需要额外的配置或者引入什么文件。
EL 表达式依次从 pageContext、request、session、application 四个隐含对象中找到指定绑定名称对应的对象然后获取对象的属性值直接输出到页面中或者获取对象的属性值后再进行计算将最后的结果输出到页面中。
EL 表达式经常用来给 JSTL 标签的属性赋值。
EL 表达式用字符串表达式替换 Java 代码用来表示对数据的获取或计算。EL 表达式解决了 Java 代码和 HTML 的不匹配问题让 HTML 页面中不再有 Java 代码。
EL 表达式的底层原理
当 JSP 转换成对应的 Servlet 类时会在 service 方法体内生成 EL 表达式对应的 Java 代码。这段 Java 代码就是依次调用 pageContext、request、session、application 对象的 getAttribute() 方法然后将获取到的数据作为 out 对象的 print() 方法的实参最终输出到页面中。
EL 表达式可以用在哪些地方
EL 表达式不可以在 JS 语境中使用即不能在 /script 标签体内使用。
EL 表达式不可以在 Java 语境中使用。
EL 表达式可以使用在 JSP、XML、HTML 等文件中在这些文件中 el 表达式可以单独使用。
EL 表达式经常和 JSTL 标签结合使用用在标签的属性值中用来给标签属性赋值。
EL 表达式可以用在 HTML 标签的属性值中。
具体参见《EL 表达式教程》。
EL 表达式用来访问 JavaBean 的属性
示例${user.name}
JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为user 的对象如果找到了就不再向下查找否则继续向下查找。找到后调用该对象的 getName()并输出其值找不到则输出 (空)。
或者也可以使用 ${user[name]} , 效果相同 name 表示字符串。
或者是 ${user[propname]}注意 propname 没有引号表示变量。
此外[] 里面还可以是 0,1,2… 这样的下标作用是输出数组里的元素值。
可以使用 pageScoperequestScopesessionScopeapplicationScope 四个关键字指定查找的范围。例如${requestScope.user.name}只到 request 中去找不再依次到 4 个范围查找了。
示例代码
%--Created by IntelliJ IDEA.User: liaowenxiongDate: 2022/2/4Time: 15:42To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
% page importpriv.lwx.el.bean.* %
html
%--访问bean的属性--%
headtitleTitle/title
/head
body stylefont-size:30px;
%User user new User();user.setName(liaowenxiong);user.setAge(22);IdCard card new IdCard();card.setCardNo(100);user.setCard(card);user.setInterest(new String[]{fishing, sleep});request.setAttribute(user1, user);
%
%--基本类型--%
${user1.name}br/
${user1[name]}br/
${user1.age}br/
%--引用类型--%
${user1.card.cardNo}br/%request.setAttribute(propname, name);
%
${user1[propname]};br/
%--输出数组元素值--%
${user1.interest[1]}
users name:${requestScope.user1.name}
/body
/htmlEL 表达式获取请求参数的值
${param.username} 等价于 request.getParameter(username);
${paramValues.interest} 等价于 request.getParameterValues(interest);
%--Created by IntelliJ IDEA.User: liaowenxiongDate: 2022/2/4Time: 16:14To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
html
%--获取请求参数值--%
headtitleTitle/title
/head
body stylefont-size:30px;
username:${param.username}br/
interest:${paramValues.interest[0]}
interest:${paramValues.interest[1]}
interest:${paramValues.interest}
/body
/htmlEL 表达式用于运算将结果作为标签的属性值或者直接输出
%--Created by IntelliJ IDEA.User: liaowenxiongDate: 2022/2/4Time: 16:29To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
% page importjava.util.* %
% page importjavax.servlet.jsp.* %
html
headtitleTitle/title
/head
body stylefont-size:30px;
%--算术运算--%
${12}br/
${245456}br/
hr
%--关系运算--%
${abc abc}
${abc eq abc}
hr
%pageContext.setAttribute(str, abc);
%
%--el表达式会从pageContex对象中获取到属性str的值然后再和字符串abc比较最后将比较结果输出到页面中--%
${abc eq str}br/
%--empty运算--%
%request.setAttribute(str1, );List list new ArrayList();request.setAttribute(list1, list);request.setAttribute(obj1, null);
%
%--空字符串的结果为true--%
${empty str1}br
%--找不到指定绑定名对应的对象结果为true--%
${empty obj}br
%--集合内容为空结果为true--%
${empty list1}br
%--null结果为true--%
${empty obj1}br
/body
/htmlStruts2 的 EL 表达式
Struts2 的 V 层组件一般是 JSP 文件在 JSP 文件中可以通过 el 表达式、ognl 表达式、jstl 标签库、struts2 提供的标签来获取 Action 组件中的属性值。
使用 el 表达式不需要引入额外的 jar 包要使用 ognl 表达式要引入 ognl-2.7.3.jar 包要使用 jstl 标签要引入 jstl.jar 和 standard.jar 包并且在 JSP 文件中要使用指令引入 jstl 标签库。在 Struts2 项目中使用 Struts2 的标签不要引入额外的 jar 包但是 JSP 文件中需要使用指令引入 Struts2 的标签库。
其实 struts.xml 中配置的 V 层组件默认情况下控制器是通过转发的机制去调用的按道理说控制器可以将 Action 组件的属性值先绑定到 request 对象中再转发给某个 jsp 文件那么 jsp 中的 el 表达式就可以从 request 对象中找到数据了。实际情况并非如此的。
在 Struts2 的项目中JSP 文件中获取到 request 对象并不是服务器生成的而是 Struts2 提供的包装类 StrutsRequestWrapper 的对象这个包装类实际上是 HttpServletRequest 的衍生类StrutsRequestWrapper 类重写了 getAttribute() 方法这个方法会先去访问服务器生成的 request 对象如果获取不到指定属性的值再去访问 ValueStack 对象中的属性 root 和 context。
所以在 Struts2 项目中el 表达式表面还是去访问 pageContext、request、session、application 四个对象获取指定属性的值。只不过在访问 request 对象时底层是先去访问服务器生成的原始 request 对象获取不到再去访问 ValueStack 对象的属性 root 和 context。
如果按标准 el 表达式访问的域对象来排序Struts2 中的 el 表达式访问域对象的实际顺序是 pageContext、request、ValueStack、session、application
所以在 Struts2 项目中el 表达式如果无法从 pageContext、request 对象获取到数据那么就会执行以下的代码去访问 ValueStack
Object obj Ognl.getValue(OGNL表达式,root,context);el 表达式 ${author}可以获取到 Action 对象的 author 属性值其实是调用该 Action 对象 getAuthor() 方法如果 Action 类中没有定义变量 author却有 getAuthor() 方法${author} 最后也会调用 Action 对象的 getAuthor() 方法。
总结Struts2 的 el 表达式底层有去调用 Ognl 引擎访问 ValueStack 的属性 root 和 context而且访问 context 获取指定属性的值并无需在属性名前加 #。
EL 表达式翻译为 Java 代码的含义
举例说明下 ${foo.name} 翻译为 Java 代码是 out.print(foo.getName());意味着调用对象 foo 的 getName() 方法而非直接访问对象 foo 的实例变量 name同时注意实例变量一般是私有的不能直接访问。
另外JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为“foo”的对象。
注其实 out.write()、out.print() 都是先把 html 文本数据输出到 response 对象中然后 web 服务器再把 response 对象中的数据响应个浏览器端进行加载和解析最后显示出来给用户看。
EL 表达式示例
EL 表达式${empty str1} JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为“str1”的对象如果找到了就不再向下查找否则继续向下查找。找到后判断值是否为空如果是空字符串则返回 true如果是个空集合也返回 true如果找不到绑定名为“str1”的对象也返回 true如果是 null也返回 true。再将 true 这个值输出到页面中最后响应给浏览器显示出来。
EL 表达式${user.name} 或 ${user[name]}
JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为user 的对象如果找到了就不再向下查找否则继续向下查找。找到后调用该对象的 getName()并输出其值找不到则输出 (空)。
EL 表达式${requestScope.user.name}
表示只到 request 中查找不再依次从 pageContext、request、session、application 查找。
EL 表达式用在 xml 文件中
在 Struts2 项目中我们在 struts.xml 文件中可以使用 EL 表达式获取属性值如下所示
action nameuser classpriv.lwx.struts2.UserAction result namesuccess typedispatcher/WEB-INF/jsp/user.jsp?userId${user.userId}/result
/action