zoukankan      html  css  js  c++  java
  • [Jsp] EL——JSP页面的高级输出形式

    ① EL的作用、格式和特点

    作用:使用EL表达式可以避免JSP页面中出现过多的scriptlet代码,方便的访问标志位(pageContext/request/session/application)中的属性的内容

    语法:${属性名称}

    范围:EL表达式的应用范围是JSP页面,在JSP页面中可以替代getAttribute()方法方便的获取属性的内容

    特点:方便的访问对象的属性,提交的参数或者是进行各种数学运算

        如果属性输出的内容为null,则会自动使用空字符串("")表示,这样即使不对取出的属性内容判空也不会出现空指针异常。

    举例

    1)不使用EL输出属性的内容 no_el.jsp(为方便代码格式就不写全了)

    <%@page contentType="text/html" pageEncoding="GBK"%>

    <html>

    <body>

      <%

        request.setAttribute("info","hey man");

        if(request.getAttribute("info")!=null){

      %>

      <h3><%=request.getAttribute("info")%></h3>

      <%

        }

      %>

    <body>

    </html>

    可以看出:不使用EL表达式不仅scriptlet标签多,而且还要进行判空操作。下面请各位看官看看使用EL后的代码

    2)use_el.jsp

    <%@page contentType="text/html" pageEncoding="GBK"%>

    <html>

    <body>

      <%

        request.setAttribute("info","hey man");

      %>

      <h3>${info}</h3>

    <body>

    </html>

    看吧,是不是简化了很多呢?

    ② EL的内置对象、四种属性范围及其相互间关系

    1)重要的内置对象

    pageContext:javax.servlet.jsp.PageContext对象

    pageScope/requestScope/sessionScope/applicationScope:表示从相应的属性范围查找输出属性

    param/paramValues:接收传递到本页面的一个/一组参数

    header/headerValues:取得一个/一组头信息数据

    cookie:取得cookie中的数据

    intparam:取得配置的初始化参数

    2)访问四种属性范围(pageScope/requestScope/sessionScope/applicationScope)的内容

     注意:如果在不同的属性范围中使用了相同的属性名称,则按如下的顺序查找,找到一个就不继续找了。

    page->request->session->application

    举例:

    1.jsp

    <%

    pageContext.setAttribute("info","page属性范围");

    request..setAttribute("info","request属性范围");

    session.setAttribute("info","session属性范围");

    application.setAttribute("info","appilication属性范围");

     %>

    <h3>${info}</h3>

    输出结果:page属性范围

    3)输出指定的属性范围

    2.jsp

    <%

    pageContext.setAttribute("info","page属性范围");

    request..setAttribute("info","request属性范围");

    session.setAttribute("info","session属性范围");

    application.setAttribute("info","appilication属性范围");

     %>

    <h3>PAGE属性内容:${pageScope.info}</h3>

    <h3>REQUEST属性内容:${requestScope.info}</h3>

    <h3>SESSION属性内容:${sessionScope.info}</h3>

    <h3>APPLICATION属性内容:${applicationScope.info}</h3>

    输出结果:四个都要输出

    ③ 使用EL完成数据的输出

    1)接收参数(功能与request.getParameter类似)

    语法:${param.参数名称}

    举例3.jsp(URL:http://localhost/2.jsp?ref="abc")

    <h3>通过内置对象接收表单参数:<%=request.getParameter("ref")%></h3>

    <h3>通过EL接收参数:${param.ref}</h3>

    2)接收一组参数

    语法:${paramValues.参数名称}

    举例:

    4.htm(复选框.name="inst")

    4.jsp

    <h3>第1个参数:${paramValues.inst[0]}</h3>

    <h3>第2个参数:${paramValues.inst[1]}</h3>

    <h3>第3个参数:${paramValues.inst[2]}</h3>

    3)输出Collection集合

    <%

      List all = new ArrayList();

      all.add("123");

      all.add("456");

      all.add("789");

      request.setAttribute("allinfo",all);

    %>

    <h3>第1个元素:${allinfo[0]}</h3>

    <h3>第2个元素:${allinfo[1]}</h3>

    <h3>第3个元素:${allinfo[2]}</h3>

    4)输出Map集合

    <%

      Map map = new HashMap();

      map.put("first","1");

      map.put("second","2");

      map.put("third","3");

      request.setAttribute("number",map);

    %>

    <h3>Key为first的内容:${number["first"]}</h3>

    <h3>Key为second的内容:${number["second"]}</h3>

    <h3>Key为third的内容:${number["third"]}</h3>

    ④ 在EL中使用运算符

     算术/关系/逻辑运算符

    ⑤ 在MVC中应用表达式语言

    可以直接通过反射的方式调用保存在属性范围中的JAVA对象内容。

    1)定义一个VO类 Dept.java

    public class Dept {
     Private int deptno;
     private String dname;
     private String loc;
     
     public int getDeptno() {
      return deptno;
     }
     public void setDeptno(int deptno) {
      this.deptno = deptno;
     }
     public String getDname() {
      return dname;
     }
     public void setDname(String dname) {
      this.dname = dname;
     }
     public String getLoc() {
      return loc;
     }
     public void setLoc(String loc) {
      this.loc = loc;
     }
    }

    2) 将此对象保存在属性范围中,通过表达式语言输出 print_vo.jsp

        <%
         Dept dept = new Dept();
         dept.setDeptno(10);
         dept.setDname("calssroom");
         dept.setLoc("school");
         request.setAttribute("deptinfo",dept);
        %>
       
        <h3>Deptno:${deptinfo.deptno}</h3>
        <h3>Dname:${deptinfo.dname}</h3>
        <h3>Loc:${deptinfo.loc}</h3>

    可以看出,这个JSP实现了通过调用VO的set方法将数据设置到VO的属性中,然后通过VO的私有属性变量名又可以取出变量的功能。

    这是反射机制的一种直接体现。

    1和2结合的模式是JavaBean+Jsp的模式

    1 使用Javabean设置实体VO        【java页面】

    2 使用JSP实例化一个实体Bean,然后在JSP页面中传递和接收属性内容。

    传递:setter方法+setAttribute()【jsp页面】

    接收:EL表达式         【jsp页面】

    3)编写Servlet传递request属性 ELServlet.java

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;


    public class ELServlet extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
      
      Dept dept = new Dept();
      dept.setDeptno(10);
      dept.setDname("classroom");
      dept.setLoc("school");
      request.setAttribute("depinfo", dept);
      request.getRequestDispatcher("dept_info.jsp").forward(request, response);
     }
     
     public void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
      this.doGet(request, response);
     }
    }

    配置web.xml省略

    4)接收request属性并使用EL表达式输出dept_info.jsp 

    ${deptinfp.deptno}

    ${deptinfo.dname}

    ${deptinfo.loc}

    取得的属性是实体VO里定义的私有属性。

    1+3+4的模式是JavaBean+Servlet+Jsp的模式。

    1 使用Javanean设置实体VO        【java页面】

    2 使用Servlet实例化实体VO,调用bean的setter方法和request的setAttribute()方法设置属性

      再调用request的getDispatcher()方法的forword()方法再设置接收参数的页面(跳转页面)   【java页面】

    3使用EL表达式接收在servlet页面中设置的属性  【jsp页面】 

     此时的JSP页面中再也不用导入VO包(因为对VO的预处理(设置属性)在Servlet中已经完成了),而可以直接通过表达式进行输出,简化了JSP的显示。

     这就是EL表达式在MVC模式中的具体应用,也是JavaBean+Servlet+Jsp模式的一个典型的处理模式。

    备注:从这里可以看出,Servlet执行了数据的预处理的功能,更执行了重要的页面重定向【跳转】功能。

     以上就是EL表达式的重点内容,参考书籍:《Java web开发实战经典》

  • 相关阅读:
    几种二叉可并堆(详细)
    几种二叉可并堆(详细)
    Winsock编程基础介绍 . 分类: VC++ 2013-09-14 17:30 512人阅读 评论(0) 收藏
    VS2005+WINDDK+Driver Studio 3.2个人总结 分类: VC++ 2013-09-14 17:26 593人阅读 评论(0) 收藏
    用DDK开发的9054驱动 . 分类: windows驱动程序WDM 2013-09-14 17:24 625人阅读 评论(0) 收藏
    arm-linux-gcc下载与安装 分类: arm-linux-Ubuntu 2013-09-11 14:12 698人阅读 评论(0) 收藏
    u盘安装ubuntu10.04 server.txt 分类: arm-linux-Ubuntu 2013-09-11 14:10 882人阅读 评论(1) 收藏
    Makefile的规则 分类: arm-linux-Ubuntu 2013-09-11 14:09 517人阅读 评论(0) 收藏
    学习了LINUX下用C语言遍历文件夹,一些心得 分类: arm-linux-Ubuntu 2013-09-11 14:09 885人阅读 评论(1) 收藏
    dm642的中断定时器 分类: DSP 2013-09-10 14:35 660人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/avivaye/p/2653795.html
Copyright © 2011-2022 走看看