> 文章列表 > 关于EL表达式

关于EL表达式

关于EL表达式

EL表达式

        英文全称:Expression Language(表达式语言)

        作用:EL表达式可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁,美观。EL表达式可以算是JSP语法的一

   部分。EL表达式归属于JSP。 

        EL表达式的三大功效:

                第一大功效:从四个作用域中取出数据

                第二大功效:将取出的数据转成字符串。

                        如果是一个java对象,也会自动调用java对象的toString方法将其转换成字符串。

                第三大功效:将字符串输出到浏览器。与<%= %>的作用一样。

                注意:EL表达式只负责从四大作用域中取数据,不负责存数据。

        EL表达式基本的语法格式:

                ${表达式} 

        EL表达式的使用:(在JSP页面中)

                <%

                        // 创建User对象

                        User user = new User();

                        user.setUsername("jackson");

                        user.setPassword("1234");

                        user.setAge(50);

                        // 将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个作用域中取数据。

                        // 数据是必须存储到四大作用域之一的。

                        //  下行代码是将数据存放的请求作用域中

                        request.setAttribute("userObj", user);

                %>

                <%--  下面是使用EL表达式来取出存放在请求作用域中的数据  --%>

                ${userObj}   等同于java代码:<%=request.getAttribute("userObj")%>

                你不要这样写:${"userObj"}

        面试题:

                ${abc} 和 ${"abc"}的区别是什么?

                        回答:${abc}表示从某个域中取出数据,并且被取的这个数据的name是"abc",之前一定有这样的代码: 域.setAttribute("abc", 对象);${"abc"} 表示直接将"abc"当做普通字符串输出到浏览器。不会从某个域中取数据了。

        ${userObj} 底层是怎么做的?

                回答:从域中取数据,取出user对象,然后调用user对象的toString方法,转换成字符串,输出到浏览器。

        <%--如果想输出对象的属性值,怎么办?--%>

        ${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。

        ${userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。

        ${userObj.age} 使用这个语法的前提是:User对象有getAge()方法。

        ${userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。

        EL表达式中的. 这个语法,实际上调用了底层的getXxx()方法。

        注意:如果没有对应的get方法,则出现异常。报500错误。

        ${userObj.addr.zipcode}

                以上EL表达式对应的java代码:user.getAddr().getZipcode()

        EL表达式优先从小作用域中读取数据。

                pageContext < request < session < application

        EL表达式中有四个隐含的隐式的范围:

                pageScope                 对应的是 pageContext范围。

                requestScope             对应的是 request范围。

                sessionScope             对应的是 session范围。

                applicationScope        对应的是 application范围。

                注意:这里说的是隐含的范围,而不是隐含的对象

        EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。

        EL表达式取数据的时候有两种形式:

                第一种:.    (大部分使用这种方式)

                第二种:[ ] (如果存储到域的时候,name中含有特殊字符,可以使用 [ ]

                比如:

                           request.setAttribute("abc.def", "zhangsan");

                           ${requestScope.abc.def} 这样是无法取值的。

                           应该这样:${requestScope["abc.def"]},注意此时name外面的双引号不能省略,必须保留。

        使用EL表达式从Map集合中取数据:

                ${map.key}

        使用EL表达式从数组和List集合中取数据:

                ${数组[0]}

                ${数组[1]}

                ${list[0]}

        page指令当中,有一个属性,可以忽略EL表达式

                <%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>

                isELIgnored="true" 表示忽略EL表达式     这个是全局的控制,此时整个JSP页面都不能使用EL表达式

                可以使用反斜杠进行局部控制\\${username} 这样也可以忽略EL表达式。(这种方式使用较多)

                isELIgnored="false" 表示不忽略EL表达式。(这是默认值)

        通过EL表达式获取应用的根:

                ${pageContext.request.contextPath}

        EL表达式中其他的隐式对象(内置对象):

                1.pageContext

                举例:获取应用的根路径     EL表达式的写法${pageContext.request.contextPath}

                java代码的写法:<%=request.getContextPath%>

                2.param

                举例:

                浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css

                获取用户在 浏览器端的username请求参数  

                 EL表达式的写法:${param.username}

                 java代码的写法:<%=request.getParameter("username")%>

                上面的方法如果获取的是一个数组,那么取得的是数组的第一个元素。如果想获取数组中的所有元素需要使用内置对象paramValues

                3.paramValues

                举例:

                浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css

                获取用户在 浏览器端的aihao请求参数  

                EL表达式的写法:${paramValues.aihao[0]}、${paramValues.aihao[1]}、${paramValues.aihao[2]}

                Java代码的写法:<%=request.getParameterValues("aihao")%>

                4.initParam

                举例:

                在web.xml文件中设置Servlet上下文初始化参数

                <context-param>

                        <param-name>pageSize</param-name>

                        <param-value>20</param-value>

                </context-param>

                <context-param>

                        <param-name>pageNum</param-name>

                        <param-value>6</param-value>

                </context-param>

                以下代码的目的是获取上面设置的pageSize与pageNum

                在JSP页面中使用Java代码:

                <%

                        String pageSize = application.getInitParameter("pageSize");

                        String pageNum = application.getInitParameter("pageNum");

                %>

                <%=pageSize%><br/>

                <%=pageNum%><br/>

                还可以写成:

                <%=application.getInitParameter("pageSize");%>

                <%=application.getInitParameter("pageNum");%>

                还可以通过EL表达式写成:

                ${initParam.pageSize}<br/>

                ${initParam.pageNum}<br/>

                在EL表达式中只有内置的pageContext对象,没有JSP中的其他八大内置对象,如果想用其他八大内置对象,需要使用pageContext对象来获取。

                比如:获取request对象的方法:${pageContext.request} 

EL表达式的运算符:

        1.算术运算符

                +、-、*、/、%

                EL表达式中的算术运算符与Java中的算术运算符不同,他只是做算术运算,不做字符串的拼接,当算术运算符的两端不是数字的时候会自动转换成数字,然后进行算术运算;当不能正常转换成数字的时候,就会报错500

                举例:

                ${10 + 20}       在浏览器页面中会展示出30

                ${10 + "20"}    在浏览器页面中同样会展示出30

                ${10 + "abc"}  此时就会报错500

                ${"a" + "b"}     此时也会报错500

                其他运算符与+类似

        2.关系运算符

                == eq != > >= < <=

                注意:这里的==!=eq在比较Java对象的时候底层都调用了Java对象的equals()方法

                        >、>=、<、<=不能用在Java对象的比较上,只能用于数字的比较。

        3.逻辑运算符

                ! && || not and or

                注意:这里的!和 not 都是取反,作用一样。

        4.条件运算符

                ? :

                举例:

                浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css

                ${empty param.username ? "用户名不能为空" : "欢迎访问!"}   <%-- 结果是"欢迎访问"--%>

 

                浏览器端的请求是:http://localhost:8080/jsp/1.jsp

                ${empty param.username ? "用户名不能为空" : "欢迎访问!"}   <%-- 结果是"用户名不能为空"--%>

        5.取值运算符

                [ ]和.

                见上面:EL表达式取数据的时候有两种形式:

        6.empty运算符 

                作用:判定是否为空 ,empty运算符的运算结果是boolean类型true|falsetrue表示结果为空,false不是结果不为空

                举例:

                浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css

                ${empty param.username}  <%--  结果为false,因为param.username 的结果是张三,不为空  --%>

                ${not empty param.username}     <%--  结果为true,因为not的作用是取反,将原本的false取反了  --%>

                ${!empty param.password}    <%--  结果为false,没有!的结果是true,但是有了!不是取反,所以变成了false  --%>

 

                ${param.password == null}   <%-- 结果是true  --%>

                ${empty param.password == null}  <%--结果是false ,因为==的左边是boolean类型,而==的右边不是boolean类型--%>