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表达式内置对象,其他几种在这里就暂不介绍了。

  • 相关阅读:
    delphi7在windows server 2003企业版上不能打开项目的选项(Options)窗口的解决方法
    简单的两个字“谢谢”,会让我坚持我的写作,我也要谢谢你们
    F41GUT 安装Windows server 2003系统后无法安装显卡驱动的解决办法
    远程桌面无法登录windows server 2003服务器
    F41GUT 安装Windows server 2003系统后无法安装显卡驱动的解决办法
    MS SQL Server 2000版在windows server 2003企业版系统上运行时造成数据库suspect的解决方法
    delphi7在windows server 2003企业版上不能打开项目的选项(Options)窗口的解决方法
    远程桌面无法登录windows server 2003服务器
    MS SQL Server 2000版在windows server 2003企业版系统上运行时造成数据库suspect的解决方法
    关于ajax 和josn
  • 原文地址:https://www.cnblogs.com/scm2019/p/11642766.html
Copyright © 2011-2022 走看看