EL如果要想使用必须结合标志位的操作完成,所谓的标志位在Java WEB里面一共有四种:page(pageContext),request,session,application(四种属性范围).EL是针对于四种属性范围取值的支持,有了EL之后,在页面中就不应该再出现getAttribute()方法.
范例:观察基本操作
<% request.setAttribute("msg", "hello"); %> <% if(request.getAttribute("msg")!=null){ %> <%=request.getAttribute("msg") %> <% } %>
这样的做法为了避免出现空异常,这是古老的写法,下面是EL表达式实现
<% request.setAttribute("msg", "hello"); %> ${msg}
如果属性不存在则会使用空字符串("")代替null;
从此之后只要是编写jsp,并且取得属性的时候不允许再使用getAttribute()方法了,而使用${}的EL语法完成.
EL基础语法
通过演示可以发现,EL中的基本结构"${属性名称}",但是对于属性范围一共存在有四种,那么如果四种属性范围里面都有msg的属性名称会如何呢?<% pageContext.setAttribute("msg", "page"); request.setAttribute("msg", "request"); session.setAttribute("msg","ssion"); application.setAttribute("msg", "application"); %> ${msg}
默认情况下会按照page(pageContext)-request-session-application的顺序查找属性的内容,但是这样的顺序是不可靠的.所以此时最好的解决方案是直接设置要查找的范围
<% pageContext.setAttribute("msg", "page"); request.setAttribute("msg", "request"); session.setAttribute("msg","ssion"); application.setAttribute("msg", "application"); %> ${pageScope.msg} ${requestScope.msg} ${sessionScope.msg} ${applicationScope.msg}
以上只能说是为不同范围的同名属性的访问给了一个解决方案,但是从实际使用来讲,不建议设置属性使用重名,这样访问也会变得非常的方便.
EL之中除了可以接收四种属性范围的内容之外,也可以输出请求参数,格式:"${param.参数名称}".
范例:观察参数输出
<h1>参数:{param.msg}</h1> <h1>参数:<%request.getParameter("msg"); %></h1>
结果
参数:
参数:null
在整个EL里面最为重要的是提供三目运算,可以自动的进行包装类或字符串的"=="比较
<h1>参数:${param.msg=='hello'?"欢迎":"拜拜"}</h1> <h1>参数:<%request.getParameter("msg"); %></h1>
在直接编写的Scriptlet代码的时候,以上的"=="半段根本就无啊发使用;
范例:观察三目
<h1>参数:${param.msg==100?"欢迎":"拜拜"}</h1>//http://localhost:8080/ELProject/show.jsp?msg=100
如果此时的代码要通过Scriptlet完成编写,那么就需要先接收参数,而后参数内容使用Integer.parseInt()方法变为数字,然后再进行比较.