表达式语言简介
JSP 2.0 之后提供的一个最注意的功能就是支持了表达式语言操作,如果要想让表达式语言发挥出自己的注意作用,则必须首先考虑的是使用MVC设计模式完成,因为在MVC设计模式一个最主要的好处就是让JSP 中的代码越来越少了,而且已经规定了在JSP之中只能出现三种代码:
接收属性
判定语句
迭代语句
但是,如果在开发之中,有时候这一点很难做到的,在实际的代码开发中已经讲解了,一个JSP肯定输出的时候是接收VO 对象的,则这个时候为了可以避免导入VO包,也只能透过表达式完成
表达式语言 (Expression Language,简称EL) 是JSP 2.0 中增加的新功能。使用表达式语言,可以方便的访问标志位(在JSP中一共提供了四种标识位:page(pageContext))
、request、session、application) 中的属性内容,这样就可以避免掉许多的script 代码,访问的简便语法如下:
${属性名称}
四种标识位 = 四种属性范围,有四种属性范围存在的属性可以直接通过表达式语言访问。
那么下面通过一个简短的代码,来简单认识一下表达式语言的基本作用。
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <body> <% //假设以下的设置属性操作是在Servlet 之中完成 request.setAttribute("info","不做大哥很多年"); //设置一个request属性范围 %> <% if(request.getAttribute("info") != null) { //现在有属性存在 %> <h3><%=request.getAttribute("info")%></h3> <% } %> </body> </html>之所以要加入一个判断,主要的原因也是在避免输出null, 但是这样一来代码又太多了,在这种情况下就可以通过表达式来完成
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <body> <% //假设以下的设置属性操作是在Servlet 之中完成 request.setAttribute("info","不做大哥很多年"); //设置一个request属性范围 %> <h3>${info}</h3> </body> </html>如果现在使用了表达式语言完成输出的话,可以很好的控制掉null的问题,而且比之前的直接使用Script代码输出更加的简便,而且使用" " (空字符串) 代替了null。
通过表达式语言可以方便的进行属性的输出
如果属性不存在,则通过表达式语言自动将null设置为 " ".
掌握表达式语言中的各主要内置对象的使用
可以使用表达式输出指定范围的属性或者是参数
之前是直接使用了表达式输出了一个属性范围中的保存的属性
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <body> <% //pageContext.setAttribute("info","page属性范围"); //request.setAttribute("info","request属性范围"); //session.setAttribute("info","session属性范围"); getServletContext().setAttribute("info","getServletContext()属性范围"); //application %> <h3>${info}</h3> </body> </html>如果现在不同的属性范围之中,保存了同名的属性,则EL的查找范围就是page --> request --> session ---> application 这个时候就可以依靠内置对象帮忙
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <body> <% //可以准确取得s pageContext.setAttribute("info","page属性范围"); request.setAttribute("info","request属性范围"); session.setAttribute("info","session属性范围"); application.setAttribute("info","application属性范围"); //getServletContext() %> <h3>PAGE属性内容: ${pageScope.info}</h3> <h3>REQUEST属性内容: ${requestScope.info}</h3> <h3>SESSION属性内容: ${sessionScope.info}</h3> <h3>APPLICATION属性内容: ${applicationScope.info}</h3> </body> </html>现在通过EL 的内置对象也可以发现pageContext, 之前在讲解内置对象的时候一直强调,pageContext 可以取得request、session、application 等对象,现在就可以通过EL直接完成内置对象的方法调用
在HttpServletRequest 接口中存在了一个getRemoteAddr() 方法
在HttpSession 接口中存在了getId() 方法,和isNew方法
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <body> <h3>IP地址: ${pageContext.request.remoteAddr}</h3> <h3>SESSION ID地址: ${pageContext.session.id}</h3> <h3>是否是新session: ${pageContext.session.new}</h3> </body> </html>
这样的命名及操作实际上是为了依靠反射机制完成的,在JAVA 开发实战经典中,已经详细讲解了反射机制的核心内容,现在这种操作形式实际上也是利用反射机制完成的。
表单可以传递参数,或者是通过URL 重写传递参数,如果要想接收参数“ param ” 对象完成
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <body> <h3>通过内置读写接收输入参数: <%=request.getParameter("ref")%></h3> <h3>通过表达式语言接收输入参数: ${param.ref}</h3> </body> </html>通过内置读写接收输入参数: null
通过表达式语言接收输入参数:
http://localhost:8080/demo/eldemo/get_param_el06.jsp?ref=llll
现在只是接收了一个参数,也可以完成一组参数的接收, paramValue
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <body> <form action="param_values_el07.jsp" method="post"> 兴趣: <input type="checkbox" name="inst" value="唱歌"> 唱歌 <input type="checkbox" name="inst" value="打拳"> 打拳 <input type="checkbox" name="inst" value="泡妞"> 泡妞 <input type="submit" value="显示"> </form> </body> </html><%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head> <title>欢迎光临</title> </head> <% //正常开放中,此代码要通过过滤器实现 request.setCharacterEncoding("GBK"); %> <body> <h3>第一个参数: ${paramValues.inst[0]}</h3> <h3>第二个参数: ${paramValues.inst[1]}</h3> <h3>第三个参数: ${paramValues.inst[2]}</h3> </body> </html>
现在JSP 接收的时候,肯定要使用paramValues接收一组参数,由于现在接收过来的是数组,如果是数组的话则需要下标进行访问。但是在开发中用的最多的还是param对象,接收一个参数,因为从MVC 设计模式来讲,所有的参数接收应该交给Servlet去做。
但是一般的开发中是回避免掉这些同名属性存在的
${属性}
集合操作
以下JAVA开发实战经典中汇讲解类集框架部分。List、Set、Map、Iterator、Map.Entry等一些基本知识
集合 Collection、Map、Iterator
Collection: List、Set
所有的集合都要使用Iterator 方法进行输出,而且List 和 Set集合的本质区别就在于List接口对Collection 接口进行了扩充,而Set接口并没用扩充
对于每次保存一对内容的操作使用Map 集合,而且Map每次保存都是Map.Entry接口对象
当然,此处的代码只是为了输出方便,而要想真正的起作用,必须结合MVC设计模式来看
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head> <title>欢迎光临</title> </head> <body> <% List all = new ArrayList(); all.add("独孤求败"); all.add("天天开心"); all.add("8888888"); request.setAttribute("allinfo",all); //集合保存在request 范围 %> <h3>第一个元素: ${allinfo[0]}</h3> <h3>第二个元素: ${allinfo[1]}</h3> <h3>第三个元素: ${allinfo[2]}</h3> </body> </html>
但是,在此处必须强调的是,以上的代码实际上JSP 文件之中,只关心蓝色字体部分,其他的部分都应该由Servlet 完成既然可以输出了Collection ,那么下面再来输出Map集合。
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head> <title>欢迎光临</title> </head> <body> <% Map map = new HashMap(); map.put("1","独孤求败"); map.put("2","天天开心"); map.put("3","8888888"); request.setAttribute("info",map); //集合保存在request 范围 %> <h3>KEY为1 的内容: ${info["1"]}</h3> <h3>KEY为2 的内容:: ${info["2"]}</h3> <h3>KEY为3 的内容:: ${info["3"]}</h3> </body> </html>现在的输出都是通过下标一个个的完成功能的,但是并没用涉及到具体的Iterator 的输出
集合的操作依然是通过Iterator 输出
输出时将集合中的每个元素都分别保存在page 的属性范围之后再使用表达式输出。
输出集合时可以直接通过下标完成
Map集合输出时依然要通过KEY 找到VALUE
下一章 是MVC中一ing有表达式语言