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