[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开发实战经典》

 

 

posted @ 2012-08-24 14:04  Aviva_ye  阅读(1077)  评论(2编辑  收藏  举报