1、 为什么需要EL表达式
以MVC设计程序,JSP只是视图,视图的任务就是显示响应,而不是在JSP中做任何关于程序控制和业务逻辑的事情。所以在JSP页面中应该尽可能少的、或者是完全不出现Java代码。而单独使用JSP标准动作是无法达到要求的,所以出现了EL表达式。
2、 EL(Expression Language)表达式
EL表达式的语法:以“$”开头,并加以“{”开始,最终以“}”结束。
EL语法:
${EL表达式}
例如:${person.name}。
“.”被称点操作符,在点操作符左边可以是一个JavaBean对象,也可以是EL隐式对象,点号右边可以是一个JavaBean属性,也可以是一个映射键。
如果使用EL操作数组,应该使用“[]”。例如:${list[0]}。“[]”不但可以操作数组,还可以操作点操作符可以操作的对象,例如:${person[“name”]},使用“[]”操作符时,“[]”中应该含有“”””。${list[“0”]}相当于${list[0]}。
可以把EL理解成是不使用Java来访问Java对象或者变量的一种方法。
EL可以操作对象、数组、映射,还可以进行表达式的运算和逻辑运算。
3、 EL表达式的取值范围:EL表达式只能取到page、request、session、application范围中的属性值。取值的对象是存储的属性名称,与存进去的属性名称一样。
EL表达式是先取得get…方法,再取属性值,认为get后面的就是属性值。
例如:private String name;
public String getUsername(){
return name;
}
那么认为username就是属性值,而不是name。
隐式对象param。取得form表单的数据,<input type=”text” name=”username”> ${param.userName}
4、 什么是JSTL。
JSTL(Java Server Pages Standerd Tag Library,JSP标准标签库)包含用于编写和开发JSP页面的一组标准标签,它可以为用户提供一个无脚本环境。在此环境中,用户可以使用标签编写代码,而无须使用Java脚本。JSTL包含各种标签,如迭代标签、条件标签、SQL标签。迭代标签和条件标签用于处理页面流程控制,SQL标签用于访问数据库和更新数据库表数据。
5、 添加JSTL。
新建工程,MyEclipse->J2EE Projects->Web Project命令->在JSTL Support(支持JSTL)区域,选中Add JSTL Libraries to WEB-INF/lib folder(添加JSTL标签库到WEB-INF/lib文件夹)复选框,选中JSTL 1.1单选按钮。在项目WEB-INF/lib目录下会生成两个JAR文件:jstl.jar、standard.jar,在WEB-INF目录下会生成很多.tld文件,如:c.tld、sql.tld等。在使用使用JSTL标签的JSP页面上使用taglib指令导入标签库描述文件,就可以使用JSTL了。
taglib是JSP指令的一种,它的作用是在JSP页面中,将标签库描述文件(.tld)引入该页面中,并设置前缀,利用标签的前缀去使用标签库描述符文件中的标签。Taglib指令的语法如下:<%@ taglib uri=”标签库描述符文件” prefix=”前缀名” %>
6、 JSTL核心标签库分类:按功能划分为通用标签库、条件标签库、迭代标签库。
通用标签用于JSP页面创建的变量。条件标签用于对JSP页面中的代码进行条件判断和处理,而迭代标签用于循环遍历一个对象集合。
6.1、通用标签
通用标签用于在JSP页面内设置、删除变量和显示变量值。通用标签共有3个:set、remove、out。
<c:set>:设置指定范围内的变量值,如果该变量不存在,则创建它。语法如下:
<c:set var=”name” value=”value” scope=”page | request | session | application” />
Var指定变量的名称以存储value指定的值,value设置var指定的变量的值,scope指定变量的范围,默认为page。
<c:remove>:用于删除变量。
<c:remove var=”name” scope=”page | request | session | application” />
其中,var指定要删除的变量的名称,scope指定变量的范围。
<c:out>计算表达式并将结果显示在页面上。
<c:out value=”value” />
value指定表达式或变量。
例如:
<%@ page language=”java” pageEncoding=”GBK” %>
<%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=”c” %>
<html>
<head>
<title>JSTL例子</title>
</head>
<body>
//设置xinxin的值为1112,并且把变量保存在session中。
<c:set var=”xinxin” value=”${1110+2}” scope=”session” />
//在页面上显示变量xinxin的值
<c:out value=”${xinxin}” />
//从session中删除变量xinxin
<c:remove var=”xinxin” scope=”session” />
</body>
</html>
6.2、条件标签
语法如下:
<c:if test=”condition” var=”name” scope=”page”>
//条件为true时,执行的代码
</c:if>
test指定条件,通常使用EL方式进行条件的运算:${条件运算},运算符可以使用<、>、==、也可以使用and、or、还可以使用lt、eq、gt等。var指定变量,并把EL运算结果赋值给该变量。Scope指定变量的范围。
6.3、迭代标签
迭代标签用于多次计算标签的标签体,类似于流程控制的for循环语句。
<c:forEach items=”collection” var=”name”>
//循环体内容
</c:forEach>
var指定变量的名称,items指定要遍历的对象集合,可以是数组、List和Map。
7、 常见错误
Failed to load or instantiate TagLibraryValidator class(加载或实例化TagLibraryValidator类时失败)。
原因:没有在项目中添加JSTL标签库文件。
org.apache.jasper.JasperException:/work/register.jsp(10,0) According toTLD or attribute directive in tag file,attribute test does not accept any expression(给出JSTL标签的属性不支持表达式的错误)。
错误路径:<%@ taglib uri=http://java.sun.com/jstl/core” prefix=”c” %>
原因:在使用taglib指令导入描述符文件时,路径错误。
正确路径:<%@ taglib uri=http://java.sun.com/jsp/jstl/core“ prefix=”c” %>
8、 EL隐式对象
EL隐式对象是一组标准的类,JSP容器向用户提供类中的方法和变量。按功能划分隐式对象:
作用域访问对象
在使用JSP标准动作和JSTL中的通用标签时,定义和设置一个变量,都要同时指定它的范围,如果不设置,默认为page。范围有四个选项:page、request、session、application。
相对应的对象为pageScope、requestScope、sessionScope、applicationScope。
作用域访问对象及其说明
对象名称 | 说明 |
pageScope | 返回页面范围内的变量名,这些名称已映射至相应的值。 |
requestScope | 返回请求范围内的变量名,这些名称已映射至相应的值。 |
sessionScope | 返回会话范围内的变量名,这些名称已映射至相应的值。 |
applicationScope | 返回应用范围内的变量,并将变量名映射至相应的值。 |
当使用这个变量时,可以通过它的保存范围来获取,如:
<c:set var=”bookTitles” value=”${titleBean.titles}” scope=”session” />
<c:forEach var=”currentBook” items=”${sessionScope.bookTitles}”>
……
</c:forEach>
如果在获取变量值时,不使用作用域访问对象,系统就会按照page -->request -->session àapplication的顺序来查找。
8.2、参数访问对象
在JSP页面中,经常会进行接收其他页面或者Servlet传递过来的参数,EL为我们提供参数访问对象来获取这些参数值,如:${param.name}。
参数访问对象及其说明
对象名称 | 说明 |
param | 返回客户端的请求参数的字符串值。 |
paramValues | 返回映射至客户端的请求参数的一组值。 |
8.3、JSP隐式对象
JSP和EL有一个公共对象:pageContext,EL可以通过pageContext来访问JSP中其他的隐式对象(request、session等),如:${pageContext.request.requestURI}
JSP隐式对象及其说明
对象名称 | 说明 |
pageContext | 提供对用户请求和页面信息的访问。 |
9、 在JSP页面中使用EL和JSTL,主要的目的就是实现JSP中无脚本编程,从而提高项目的可维护性和可扩展性,包括美工的网页维护。
10、 SQL标签
定义数据源的setDataSource标签:
<sql:setDataSource url=”jdbcurl” | DataSource=”dataSource” driver=”driverclass” user=”username” password=”userpassword” var=”name” scope=”page” />
url指定与数据库关联的URL,DataSource指定JNDI资源的数据源名称,如:jdbc/test。user指定数据库的用户名。Password指定用户密码。var指定变量的名称。Scope指定变量范围。
修改数据库信息的update标签:
<sql:update var=”name” dataSource=”dataSource” scope=”page”>
SQL语句
</sql:update>
var指定变量的名称,dataSource指定数据源的名称,与<sql:setDataSource>标签中var的变量名称一致,scope指定变量范围,SQL语句可以是insert、update、delete。
传递参数的param标签:
<sql:param value=”value” />
value指定为SQL语句中的参数中“?”处的值。
例子:插入数据
……
<%@ taglib uri=”http://java.sun.com/jsp/jstl/sql” prefix=”sql” %>
……
<sql:setDataSource driver=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
url=”jdbc:microsoft:sqlserver://localhost:1433;DataBaseName=xinxin”
user=”sa” password=”sa” var=”conn” />
<sql :update var=”work” dataSource=”${conn}”>
insert into Work(username,zipcode,phone,creditcard,total) values(?,?,?,?,?)
<sql:param value=’${param[“username”]}’ />
<sql:param value=’${param[“zipcode”]}’ />
<sql:param value=’${param[“phone”]}’ />
<sql:param value=’${param[“creditcard”]}’ />
<sql:param value=’50’ />
</sql:update>
查询数据库信息的query标签:
<sql:query var=”name” dataSource=”dataSource” scope=”page”>
SQL语句
</sql:query>
var指定变量的名称。dataSource指定使用的数据源,与<sql:setDataSource>标签中var的变量名称一致。Scope指定变量范围。
例子:
……
<%@taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
<%taglib uri=”http://java.sun.com/jsp/jstl/sql” prefix=”sql”%>
……
<sql:setDataSource driver=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=xinxin”
user=”sa” password=”sa” var=”conn” />
<sql :query var=”rs” dataSource= ”${conn}”>
select orderid,username,zipcode,total from Work order by orderid
</sql :query>
......
<c :forEach var= ”row” items=”${rs.rows}”>
<tr>
<td>${row.orderid}</td>
<td>${row.username}</td>
<td>${row.zipcode}</td>
<td>${row.total}</td>
</tr>
</c:forEach>
SQL标签适用于开发中小型项目。因为它不符合MVC设计模式,不利于维护和扩展。
使用SQL标签可以进行数据库的如下操作:在JSP页面中使用taglib指令,导入描述符文件。使用setDataSource标签创建数据源。如果SQL语句中有参数,使用param标签进行参数的设置。如果是执行查询,则使用query标签后,使用forEach标签对返回的结果集进行遍历。
注意:SQL标签内部不要写注释(<!-- -->),有可能会报错:’<’附近有错。
11、JSTL中常用的标签归类:
核心标签:
通用标签:set、out、remove
条件标签:if
迭代标签:forEach
SQL标签:
定义数据源:setDataSource
修改数据库信息:update
传递参数:param
查询数据库信息:query
12、 fn.tld标签文件中的uri:
String name=”abc-def-gh”;
request.setAttribute(“nameReq”,”-”);
“-”的位置是:${fn:indexOf(nameReq,”-”)};
长度:${fn:length(nameReq)};
13、 怎样取出Map中的值。
<%
Map productMap = new HashMap();
productMap.put(“wow.apple”,”苹果”);
productMap.put(“wow.banan”,”香蕉”);
productMap.put(“orange”,”橘子”);
request.setAttibute(“productlist”, productMap);
%>
取出其中一个值:
${productlist[“wow.apple”]}
${productlist.orange}
全部输出:
<c:forEach items=”${productlist}” var=”woww”>
${wow}
</c:forEach>
-----------------------------------------------------------------------
Map中存储对象,循环输出的方法:
<c:forEach items=”${userList}” var=”userBean”>
用户名:${userBean.value.userName}
<c:choose>
<c:when test=”${userBean.value.userName == ‘tom’}”>
${userBean.value.userName}你好啊
</c:when>
</c:choose>
</c:forEach>