用EL和JSTL进行View层开发

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值