JSP的EL表达式语言

Java Web后端知识 专栏收录该内容
30 篇文章 3 订阅


1.EL表达式的简介

EL表达式是一种JSP技术,能够代替JSP中原本要用Java语言进行显示的语句,使得代码更容易编写与维护。最基本的语法是${express}。

EL的特点:



2.获取并显示数据

1)从四个域中通过key找到简单数据并显示出来。表达式代码:

[html]  view plain  copy
  1. ${name}      <!-- 类比于<%=pageContext.findAttribute("name") %> -->  
四个域的寻找顺序是 page,request,session,application。 用EL表达式还有个好处,若找不到键值为name的属性值,不会显示null,会显示空字符串。 若是确定键值是在request域中,则可以用如下EL表达式代码:
[html]  view plain  copy
  1. ${requestScope.name}  
2)从存储在WEB域中的封装了数据的JavaBean中得到对象的某个属性值并显示出来。
[html]  view plain  copy
  1. <%  
  2.     Person p = new Person();  
  3.     Address address = new Address();  
  4.     address.setCity("浙江");//Adress类中有个私有String属性为city  
  5.     p.setName("mike");//Person类中有私有String属性为name  
  6.     p.setAddress(address);//Person类中有私有Adress属性为address  
  7.     session.setAttribute("person", p);//存入sessionScope  
  8. %>  
  9. ${person.name}<!-- 从WEB域中找到键值为person的对象,然后再person对象中找到name属性 -->  
  10. ${person.address.city}  
[html]  view plain  copy
  1. ${person['name']}<!-- 也可以用[]方式 -->  
  2. ${person['address']['city']}  

除了用.方式获得对象的属性,也可以用[ ]方式,当然遇到键值名字中有-的,如mike-abc,或者key值为数字开头,则只能用[ ]方式。

苏小虎数组元素:


3)从List集合对象中获取某个值并显示。

<body>
<%
List<String> list=new ArrayList<String>();
list.add("hello");
list.add("this");
list.add("world");
session.setAttribute("word",list);
%>
<% 
List<String> list1=(List<String>)session.getAttribute("word");
for(int i=0;i<list1.size();i++){
	request.setAttribute("li",i);//JSP代码与java代码需要分开
	%>
${li}:${word[li]}  <br>

<%
}
%>	

</body>

<body>
<%
List<String> list=new ArrayList<String>();
list.add("hello");
list.add("this");
list.add("world");
session.setAttribute("word",list);
%>
<% 
List<String> list1=(List<String>)session.getAttribute("word");
for(int i=0;i<list1.size();i++){
	request.setAttribute("li",i);//JSP代码与java代码需要分开
	%>
${li}:${word[li]}  <br>

<%
}
%>	

</body>

[html]  view plain  copy
  1. <%  
  2.     List<Person> list = new ArrayList<Person>();  
  3.     list.add(new Person("kkk"));  
  4.     list.add(new Person("sss"));  
  5.     list.add(new Person("jjj"));  
  6.     application.setAttribute("list_1", list);  
  7. %>  
  8. ${list_1[1].name }  

4)从Map中获取某个值并显示。

[html]  view plain  copy
  1. <%  
  2.     Map map = new HashMap();  
  3.     map.put("a", new Person("aaa"));  
  4.     map.put("b", new Person("bbb"));  
  5.     map.put("1", new Person("ccc"));  
  6.     request.setAttribute("map", map);  
  7. %>  
  8. ${map['1'].name }<!-- 是数字的话只能用括号,就算put进去的key值是字符串类型-->  
  9. ${map.a.name }  

3.执行运算

1)语法:${运算表达式}

2)常见运算符:==(eq)   !=(ne)    <(lt)    >(gt)    <=(le)    >=(ge)    &&(and)   ||(or)   !(not)

3)判断是否为空:${empty name }

4)三目运算符:${name == null?"null":name }


4.获取常用对象

1)语法:${隐式对象名称}

2)隐式对象表

EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
  语法:${隐式对象名称}:获得对象的引用

序号隐含对象名称描       述
1pageContext对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)
2pageScope代表page域中用于保存属性的Map对象
3requestScope代表request域中用于保存属性的Map对象
4sessionScope代表session域中用于保存属性的Map对象
5applicationScope代表application域中用于保存属性的Map对象
6param表示一个保存了所有请求参数的Map对象
7paramValues表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
8header表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”]
9headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
10cookie表示一个保存了所有cookie的Map对象
11initParam表示一个保存了所有web应用初始化参数的map对象


<!-- 1.such as -->
	${pageContext.request.serverPort}<br>

	${pageContext.response}<br>
	 ${pageContext.out}<br>
<jsp:useBean id="user" class="com.majun.demo.User">
<!-- 2.such as Scope-->
<jsp:setProperty property="name" name="user" value="谁主沉浮"/></jsp:useBean>${pageScope.user.name}<br><%request.setAttribute("userName","haha"); %>${requestScope.userName}
<%
Cookie cookie=new Cookie("name","lidehua");
response.addCookie(cookie);

%>
${cookie.name.value}


替换jsp中繁杂的代码量:

<%
/*
String user=request.getParameter("user");	//获取文本框的值
String pwd=request.getParameter("pwd");		//获取密码域的值
String email=request.getParameter("email");	//获取文本框的值
String sex=request.getParameter("sex");		//获取单选按钮的值
/*****************获取复选框的值**********************/
/*
String[] arrAffect=request.getParameterValues("affect");	//获取复选框的值
String affect="";
if(arrAffect!=null){
	//通过for循环遍历获取到的数组
	for(int i=0;i<arrAffect.length;i++){
		affect+=arrAffect[i]+",";					//输出当前元素
	}
	System.out.println(affect.length());
	affect=affect.substring(0,affect.length()-1);	//去除字符串中最后一个逗号
}
/*****************************************************/
/*
String memo=request.getParameter("memo");	//获取编辑框的值
*/
%>
使用EL表达式替换:

<form name="form1" method="post" action="">
<table width="400" height="30" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#333333">
  <tr>
    <td width="76" align="center" bgcolor="#FFFFFF">用 户 名:</td>
    <td width="324" bgcolor="#FFFFFF"> ${param.user }</td>
  </tr>
  <tr>
    <td align="center" bgcolor="#FFFFFF">密    码:</td>
    <td bgcolor="#FFFFFF"> ${param.pwd }</td>
  </tr>
  <tr>
    <td align="center" bgcolor="#FFFFFF">E-mail:</td>
    <td bgcolor="#FFFFFF"> ${param.email }</td>
  </tr>
  <tr>
    <td align="center" bgcolor="#FFFFFF">性    别:</td>
    <td bgcolor="#FFFFFF"> ${param.sex }</td>
  </tr>
  <tr>
    <td align="center" bgcolor="#FFFFFF">爱     好:</td>
    <td bgcolor="#FFFFFF"> ${paramValues.affect[0]} ${paramValues.affect[1]} ${paramValues.affect[2]} ${paramValues.affect[3]}</td>
  </tr>
  <tr>
    <td align="center" bgcolor="#FFFFFF">备    注:</td>
    <td bgcolor="#FFFFFF"> ${param.memo }</td>
  </tr>
  <tr>
    <td colspan="2" align="center" bgcolor="#FFFFFF"><a href="index.jsp">返回</a></td>
    </tr>
</table>
</form>




5.访问环境信息的隐含对象

使用EL调用Java方法

  EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。语法:${prefix:method(params)}
  在EL表达式中调用的只能是Java类的静态方法,这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
  EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。

5.5、EL Function开发步骤

  一般来说, EL自定义函数开发与应用包括以下三个步骤:
  1、编写一个Java类的静态方法
  2、编写标签库描述符(tld)文件,在tld文件中描述自定义函数。
  3、在JSP页面中导入和使用自定义函数

示例:开发对html标签进行转义的el function

1、编写html转义处理工具类,工具类中添加对html标签进行转义的静态处理方法,如下:

复制代码
 1 package me.gacl.util;
 2 
 3 /**
 4 * @ClassName: HtmlFilter
 5 * @Description: html转义处理工具类
 6 * @author: 孤傲苍狼
 7 * @date: 2014-8-27 上午12:09:15
 8 *
 9 */ 
10 public class HtmlFilter {
11 
12     /**
13     * @Method: filter
14     * @Description: 静态方法,html标签转义处理
15     * @Anthor:孤傲苍狼
16     *
17     * @param message 要转义的内容
18     * @return 转义后的内容
19     */ 
20     public static String filter(String message) {
21 
22         if (message == null)
23             return (null);
24 
25         char content[] = new char[message.length()];
26         message.getChars(0, message.length(), content, 0);
27         StringBuffer result = new StringBuffer(content.length + 50);
28         for (int i = 0; i < content.length; i++) {
29             switch (content[i]) {
30             case '<':
31                 result.append("&lt;");
32                 break;
33             case '>':
34                 result.append("&gt;");
35                 break;
36             case '&':
37                 result.append("&amp;");
38                 break;
39             case '"':
40                 result.append("&quot;");
41                 break;
42             default:
43                 result.append(content[i]);
44             }
45         }
46         return (result.toString());
47     }
48 }
复制代码

2、在WEB-INF目录下编写标签库描述符(tld)文件,在tld文件中描述自定义函数

  

  elFunction.tld的代码如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
 3  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
 4  <tlib-version>1.0</tlib-version>
 5  <short-name>EL Function</short-name>
 6  <!-- 
 7      自定义EL函数库的引用URI,
 8      在JSP页面中可以这样引用:<%@taglib uri="/ELFunction" prefix="fn" %> 
 9  -->
10  <uri>/ELFunction</uri>
11  
12  <!--<function>元素用于描述一个EL自定义函数 -->
13   <function>
14         <description>html标签转义处理方法</description>
15         <!--<name>子元素用于指定EL自定义函数的名称-->
16         <name>filter</name>
17         <!--<function-class>子元素用于指定完整的Java类名-->
18         <function-class>me.gacl.util.HtmlFilter</function-class>
19         <!--<function-signature>子元素用于指定Java类中的静态方法的签名,
20             方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。-->
21         <function-signature>java.lang.String filter(java.lang.String)</function-signature>
22     </function>
23  
24 </taglib>
复制代码

3、在JSP页面中导入和使用自定义函数

复制代码
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%--引入EL自定义函数库 --%>
 3 <%@taglib uri="/ELFunction" prefix="fn" %>
 4 <!DOCTYPE HTML>
 5 <html>
 6   <head>
 7     <title>使用EL调用Java方法</title>
 8   </head>
 9   
10   <body>
11       <%--使用EL调用filter方法--%>
12       ${fn:filter("<a href=''>点点</a>")}
13   </body>
14 </html>
复制代码

运行结果如下:

  

5.6、开发EL Function注意事项

  编写完标签库描述文件后,需要将它放置到<web应用>\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。 
  TLD文件中的<uri> 元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。
  <function>元素用于描述一个EL自定义函数,其中:
  <name>子元素用于指定EL自定义函数的名称。
  <function-class>子元素用于指定完整的Java类名,
  <function-signature>子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。

5.7、EL注意事项

  EL表达式是JSP 2.0规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。
注意:有些Tomcat服务器如不能使用EL表达式
    (1)升级成tomcat6
    (2)在JSP中加入<%@ page isELIgnored="false" %>

5.8、EL表达式保留关键字

  



6.EL表达式原理及注意点

原理:EL表达式在获取某个对象的属性值时,先将某个属性值首字母变成大写,然后加上get前缀,拼接成getter方法,通过反射将该对象构建出来,然后再对该对象执行getter方法,这与私有属性并没有关系,所以要注意,JavaBean的属性名要小写,且要有getter方法,不然会报错。

 


  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值