zoukankan      html  css  js  c++  java
  • JavaWeb学习之JSP(三) EL表达式

      EL表达式

        什么是EL表达式

          EL,Expression Language,表达式语言,是一种在JSP页面中获取数据的简单方式,通过${变量名}的方式可以获取到值,需要注意的是EL只能从 pageConext、request、session、application 四大域属性空间中获取数据。

        使用EL表达式获取数据

          下面不能成功取值   

    <% int sum = 88; %>
    <!-- 该值取不出来,因为没有放在四大域属性空间中 -->
    ${sum }

          可以将这个值存放到四大域属性空间中的任意一个中。然后访问其存放时的 key即可。    

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <%
                pageContext.setAttribute("name", "henu");
                request.setAttribute("name", "henu");
                session.setAttribute("name", "henu");
                application.setAttribute("name", "henu");
            %>
            EL表达式获取的值:
            ${name}
    </body>
    </html>

         EL底层是从最小范围的pageContext依次查找,直到查找到最大范围 application。这期间,只要查找到了,则直接获取,不再去后面的范围中查找了,若最终没有查找到,则什么也不输出。因此这里输出的结果是先从pageContext空间域取出的

         1、从指定域中获取数据

         从 pageContext 依次查找到 application 域空间,会降低执行效率。若属性确定存放在某个域空间时,则可指定直接从该空间中查找。此时需要借助 EL 的四个域属性空间相关的内置对象。   

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <%
                pageContext.setAttribute("name", "pageContext");
                request.setAttribute("name", "request");
                session.setAttribute("name", "session");
                application.setAttribute("name", "application");
            %>
            EL表达式获取的值:<br>
            ${pageScope.name}<br>
            ${requestScope.name}<br>
            ${sessionScope.name}<br>
            ${applicationScope.name}
    </body>
    </html>

         2、访问 Bean 的属性

         EL 可以通过 ${key .属性}的方式获取到指定对象的属性值。其底层实际调用的是该对象的相应属性的 get 方法。也可以使用${key[“属性”]的方式获取。该方式不常用。

         创建一个Student类,该类在scm包下。(这里有一个注意点稍后提及)

    package scm;
    
    public class Student {
        private String name;
        private int age;
        public Student() {}
        public Student(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
    }

          创建JSP页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="scm.*" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <% 
                Student stu = new Student("张三", 22);
                request.setAttribute("stu", stu);
            %>
            获取bean对象中属性的两种方法:
            ${requestScope.stu.name}
            ${requestScope.stu["name"] }
    </body>
    </html>

         在JSP中我们声明了Student对象,并向request域中传递。然后使用EL表达式接收bean对象传来的参数。

         访问JSP页面输出结果:

             获取bean对象中属性的两种方法: 张三 张三

         在上边我们说到一个注意点:细心的会看到在JSP页面中,我们导入了scm包,我们声明Student对象时一定要导包(血淋淋的教训),或者会抛出异常。

         若要访问一个对象的域属性的值,则可多次使用点号运算符,依次取出相应的属性值。

         创建一个School类,同样在scm包下,Student类同上即可。(注意导包)

    package scm;
    public class School {
        private String schoolName;
        private Student student;
        public School() {}
        public School(String schoolName,Student student) {
            this.schoolName = schoolName;
            this.student = student;
        }
        public String getSchoolName() {
            return schoolName;
        }
        public void setSchoolName(String schoolName) {
            this.schoolName = schoolName;
        }
        public Student getStudent() {
            return student;
        }
        public void setStudent(Student student) {
            this.student = student;
        }
        
    }

         编写JSP页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="scm.*" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <%
                Student st = new Student("李四",21);
                School s = new School("河南大学",st);
                request.setAttribute("s",s);
            %>
            ${requestScope.s.schoolName} 
            ${requestScope.s.student.name}
            ${requestScope.s.student.age}
    </body>
    </html>

         访问JSP页面输出结果:河南大学 李四 21

         3、获取数组中的元素

         EL 可以通过 ${key[索引]} 的方式获取到指定索引的元素。不过,需要注意的是,若数组中不存在该指定索引的元素,系统并不会抛出数组越界异常。   

    <%     
        String[] names = {"张三","李四","王五","赵六"};
        request.setAttribute("names", names);
    %>
    <!-- 输出李四 -->
    ${names[1] }
    <!-- 没有输出也不会报错 -->
    ${names[50] }

         4、获取 List 中的元素

         与获取数组中的元素相同,通过 ${key[索引]} 的方式可以获取 List 中指定索引的元素。若 List 中不存在该指定索引的元素,系统并不会抛出越界异常。

         创建List集合并存入Student对象(Student类同上),导入scm和java.util.*包。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.util.* "%>
    <%@ page import="scm.*" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <%
                List<Student> stList = new ArrayList();
                stList.add(new Student("张三",20));
                stList.add(new Student("李四",21));
                stList.add(new Student("王五",22));
                request.setAttribute("stList", stList);
            %>
            <!-- 输出李四 21 -->
            ${stList[1].name } ${stList[1].age}
            <!-- 没有输出也不会报错 -->
            ${stList[50].name} ${stList[50].age}
    </body>
    </html>

         EL 无法输出 Set 集合中的元素。因为 Set 集合中的元素是无序的,即没有索引的概念,所以无法通过索引获取元素。

         5、获取 Map 中的元素

         EL 通过 ${attributeName.mapKey} 的方式可以获取指定 Map 的指定 key 的值。     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.util.* "%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <%
                Map<String,String> map = new HashMap();
                map.put("name", "张三");
                map.put("age", "30");
                request.setAttribute("map", map);
            %>
            <!-- 根据Map的键获取值 -->
            ${map.name}
            ${map.age}
    </body>
    </html>

       EL表达式内置对象

         EL表达式内置对象    

         同JSP类似,在EL表达式中也有一些内置对象,共11个:

      • pageContext
      • pageScope
      • requestScope
      • sessionScope
      • applicationScope
      • cookie
      • param
      • paramValues
      • header
      • headerValues
      • initParam

         上面除了pageContext是javax.servlet.jsp.PageContext类型,其他的都是java.util.Map类型。四个域属性相关的对象之前用过了,下面主要介绍一些其他常用的。

         1、pageContext     

         EL表达式中的pageContext与JSP内置对象中的 pageContext 是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig 等对象。注意,这些对象在 EL中不是内置对象,只能通过EL中的pageContext 获取。

         在 EL 中直接`${pageContext.request}`

         即可获取 request 对象。其底层实际调用的是
         pageContext.getRequest()方法。同理,也可以通过类似方式获取到其它对象。
         在这些获取的对象中,有一个是实际工程中最常用的:

    ${pageContext.request.contextPath}  

         用于获取当前项目的发布到服务器的名称。一般会用在路径中

    <form action="${pageContext.request.contextPath }/login.do"></form>    

         2、param(如果url中有目标参数则输出,没有的话不显示也不会报错)
         在 EL 中通过${param.参数名}可获取到请求中指定参数名的值。例如,提交的请求为:

         localhost:8080/01-jspTest/elTest.jsp?name=henu

         在 JSP 页面中通过如下方式,可获取到 url中name 参数的值:  

    ${param.name}    

         3、paramValues
         若提交的请求中同一参数具有多个值,则可通过 ${paramValues.参数名[索引]} 获取到指定索引号的该参数值。例如,提交的请求为:

         localhost:8080/01-jspTest/elTest.jsp?hobby=basketball&hobby=football

         在JSP中获取方式如下:

    ${paramValues.hobby[0]}
    ${paramValues.hobby[1]}

         4、initParam
         在 EL 中通过使用 ${initParam.初始化参数名} 可以获取到初始化参数的值。 例如在 web.xml 中定义了初始化参数如下:     

     <context-param>
          <param-name>KaiFeng</param-name>
          <param-value>Henu</param-value>
      </context-param>

         在JSP中的获取方式如下: 

    ${initParam.KaiFeng}

         以上就是开发中较为常见的几种EL表达式内置对象,其他几种在这里就暂不介绍了。

  • 相关阅读:
    短期阅读的书籍
    Expert .NET 2.0 IL Assembler 译者序
    Prism研究(for WPF & Silverlight)4.从Hello World开始(实战篇)
    (翻译) 《C# to IL》第一章 IL入门
    不申请连任MVP了,把机会留给新人吧!
    (翻译) 《C# to IL》第三章 选择和循环
    Prism研究(for WPF & Silverlight) 13
    (翻译) 《C# to IL》第二章 IL基础
    Resharper使用体会及一些资料
    推荐一个PD Report Model
  • 原文地址:https://www.cnblogs.com/scm2019/p/11642766.html
Copyright © 2011-2022 走看看