前提:如果Tomcat服务器不能使用EL表达式
(1)升级成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>
引例:当我们用户登陆成功的时候,seesion就成功建立起来,我们就能这样写一个欢迎界面:
欢迎你!<%=((User)session.getAttribute("user")).getUsername()%>
然而!不觉得这样写java代码太多了吗?所以可以引用EL表达式:
欢迎你!${user.username} 也可以写成${user[“username”]}
达到简化代码的效果。在这里user.username自动对应的是user.getUsername()。
所以EL表达式也不是万能的,在这也能看出EL表达式的缺点:想要取到的属性值,必须要有相应的get方法!
EL中的隐含对象,即默认取值的对象,例如下面的与范围有关的隐含对象。
示例:${ username }
表示:取出某一范围中名称为username的属性变量。
解释:首先在page中找,即${ username }实际上是${pageScope.username},如果当前page中没有这个属性,那么就越到下一级request,此时${ username }实际上是${requestScope.username}...以此类推。注意:上述取得是“属性”,而非“参数”。隐含对象只能用来取得范围属性值,即JSP中的getAttribute(String name),例如response是不能使用EL表达式的,因为他没有getAttribute()——得到属性的方法。取参数是在request中取的(request也能取属性)。所以我们可以使用
${param.count + 20}
代替下面的代码,实现request中保存的某个int类型参数做加法,操作request中的参数
String str_count = request.getParameter("count"); int count = Integer.parseInt(str_count); count = count + 20;
提到EL表达式中的运算,我首先放个demo:
1.${17 / 5} <br> 2.${17 mod 3} <br> <% int i=1; String num="34"; request.setAttribute("i",num); %> 3.${i+num} <br> 4.${i} <br> 5.${num} <br> 6.${i+1} <br> 7.${0/20}<br> 8.${20/0}<br> 9.${0/0}<br>
输出是:
1.3.4
2.2
3.344.34
5.
6.35
7.0.0
8.Infinity
9.NaN
其中2的mod代表取余,我们也可以直接用%代替mod,mod等价于%,是%的别名。相应的/的别名是div
3就令人费解了,怎么得到的是34,不是134呢?
我们先看4——${i},这个和前面的${username}一样,代表取属性,默认先取的page中的属性i,如果没有又去找request中的....我们看到当前page中是没有这个属性的,往request中找,有,并且这个属性变量i的值是34,所以${i}就输出了34。
同理5中的${num},既不存在于page,也不存在于request中,session,aplication中也没有,所以取到的是空值(这就是el的好处之一:遇到空值不会报异常也不会变成null值)
所以回过头看3,${i+num},就是4,5的相加。注意:EL表达式中的“+”不做字符串的拼接。算术符中做的是运算操作。
如果问我们:判断password1==password2用EL怎么做:
${param.password1} = = ${param.password2} (错,这个直接输出两者相等,而没有进行关系比较)
${ ${param.password1 }==${ param.password2 } } (错,EL表达式就是为了简化代码设计的,不需要相互嵌套完成操作)
${ param.password1 = = param.password2 } (对)
最后再说一下保留字,所谓保留字的意思是指变量在命名时,应该避开的名字,以免程序编译时发生错误