《Java Web程序设计任务教程》简要复盘:第七章 EL表达式和JSTL

it2025-04-25  16

《Java Web程序设计任务教程》简要复盘:第七章 EL表达式和JSTL

第七章 EL表达式和JSTLJavaBean概述规范要求useBean指令 EL表达式初识EL标识符保留字变量运算符获取并显示数据EL隐式对象 JSTL标签库概述下载与使用Core标签库out标签if标签choose标签forEach标签其他标签 作者:氯磷Rolin

目录:

第一章:网页开发基础(无)第二章:Java Web概述第三章:Servlet基础第四章:请求与响应第五章:会话及其会话技术第六章:JSP技术第七章:EL表达式和JSTL第八章:Servlet的高级特性第九章:JDBC第十章:数据库连接池与DBUtils工具第十一章:JSP开发模型第十二章:文件的上传和下载

第七章 EL表达式和JSTL

为了降低JSP页面的复杂度,增加代码的重用性,Sun公司制定了JavaBean技术、标准标签库JSTL和EL表达式等,大大简化了开发的难度

JavaBean

概述

JavaBean是Java开发语言中一个可以重复使用的软件组件,它本质就是一个Java类。

在JSP的开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更简洁。JSP搭配JavaBean来使用,有以下的优点:

可将HTML和Java代码分离,这主要是为了日后维护的方便。如果把所有的程序代码(HTML和Java)写到JSP页面中,会使整个程序代码又多又复杂,造成日后维护上的困难。

可利用JavaBean的优点。将日常用到的程序写成JavaBean组件,当在JSP要使用时,只要调用JavaBean组件来执行用户所要的功能,不用再重复写相同的程序,这样一来也可以节省开发所需的时间。

JavaBean是一个数据的容器,它序列化后可以负责传递数据,也可以存放一些重复使用的代码,例如数据库查询工作,可以大大减少JSP页面和Servlet的代码量,使代码更具有可读性。

规范要求

JavaBean本身就是一个类,属于Java的面向对象编程。

在JSP中如果要应用JSP提供的Javabean的标签来操作简单类的话,则此类必须满足如下的开发要求:

(1) 所有的类必须放在一个包中; (2) 所有的类必须声明为public class,这样才能够被外部所访问; (3) 类中所有的属性都必须封装,即:使用private声明; (4) 封装的属性如果需要被外部所操作,则必须编写对应的setter、getter方法; (5) 一个JavaBean中至少存在一个无参构造方法,此为JSP中的标签所使用。

一个简单的JavaBean: package com.Rolin.javabean; public class JavaBean{ private String name; private int age; public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } }

如果在一个类中只包含属性、setter、getter方法,那么这种类就成为简单JavaBean。

对于简单的JavaBean也有几个名词: (1)VO:与简单Java对象对应,专门用于传递值的操作上 (2)POJO:简单Java对象 (3)TO:传输对象,进行远程传输时,对象所在的类必须实现java.io.Serializable接口。

useBean指令

除了使用import的语句之外,也可以使用JSP中提供的:<jsp:useBean>指令完成操作,指令的操作语法如下所示:

<jsp:useBean id="实例化对象名称" scope=“保存范围” class=“包.类名称“/>

主要属性 (1)id:表示实例化对象的名称 (2)scope:表示此对象保存的范围,一共有四种属性范围:page、request、session、application (3)class:对象所对应的包.类名称

示例

<%@ page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="simple" scope="page" class="com.Rolin.javabean"/> <html> <head><title>专业开发者社区</title></head> <body> <% simple.setName("Rolin"); simple.setAge(23); %> <h3>姓名:<%=simple.getName()%></h3> <h3>年龄:<%=simple.getAge()%></h3> </body> </html> JavaBean的实现原理 依靠的是反射机制完成的,在使用<jsp:useBean>指令时需要定义对象所在的“包.类“名称,而且又要求类中存在无参构造方法,这就是反射操作的前提条件 所以<jsp:useBean>的语法实际上属于反射机制的操作实现。

EL表达式

在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写需要多Java代码,这样的做法会使JSP页面混乱,不利于维护 为此 JSP2.0 规范中提供了EL表达式(Expression Language)

初识EL

EL表达式是一种JSP技术,能够代替原本使用Java代码的语句,使得代码更加容易编写与维护。

最基本的语法是${express}

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

标识符

在EL表达式中,经常需要一些符号来标记一些名称,例如变量或自定义函数名等,这些符号被称之为标识符。

EL表达式中的标识符可以有任意大小写字母、数字和下划线组成,为了避免出现非法标识符,还要注意遵循以下规范:

不能以数字开头不能是EL中的保留字不能说EL隐式对象不能包含单引号、双引号、减号和正斜杠等特殊字符

保留字

保留字就是编程语言里实现定义好并赋予特殊含义的单词

和其他语言一样EL表达式也定义了许多保留字,具体如下:

and eq gt true instanceof or ne le false empty not lt ge null div mod

这些保留字都不能被作为标识符,否则程序编译时会出错

变量

EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上

具体示例: ${product}

product就是一个变量。EL表达式中的变量不用事先定义就可以直接使用,例如${product}就可以直接访问product的值

运算符

语法:${运算表达式}

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

判断是否为空:${empty name } 如果name不存在或者为null,则返回true

三目运算符:${name == null?“null”:name }

获取并显示数据

从四个域中通过key找到简单数据并显示出来:${name} 四个域的寻找顺序是page、request、session、application。若找不到名称为name的属性值,不会显示null,而是会显示空字符串,可以避免NullPointerException异常。若确定值是在resquest域中,则可以直接使用${requestScope.name}取值 从JavaBean中得到对象的某个属性值并显示出来。 <% Person p = new Person(); p.setName("mike"); //Person类中有私有String属性为name session.setAttribute("person", p); //存入sessionScope %> ${person.name} <!-- 从WEB域SessionScope中找到键值为person的对象,然后再person对象中找到name属性 -->

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

${person['name']} <!-- 也可以用[]方式 --> ${person['peicai-liang']} 从List集合对象中获取某个值并显示。 <% List<Person> list = new ArrayList<Person>(); list.add(new Person("kkk")); list.add(new Person("sss")); list.add(new Person("jjj")); application.setAttribute("list_1", list); %> ${list_1[1].name } 从Map键值对对象中获取某个值并显示 <% Map map = new HashMap(); map.put("a", new Person("aaa")); map.put("b", new Person("bbb")); map.put("1", new Person("ccc")); request.setAttribute("map", map); %> ${map['1'].name } <!-- 是数字的话只能用括号,就算put进去的key值是字符串类型--> ${map.a.name }

EL隐式对象

语法:${隐式对象名称}隐式对象列表 隐含对象名称描 述pageContext对于JSP页面中的pageContext对象pageScope代表page域中用于保存属性的Map对象requestScope代表request域中用于保存属性的Map对象sessionScope代表session域中用于保存属性的Map对象applicationScope代表application域中用于保存属性的Map对象param表示一个保存了所有请求参数(浏览器参数)的Map对象paramValues表示一个保存了所有请求参数的Map对象,他对于某个请求参数,返回的是一个String类型数组header表示一个保存了所有HTTP请求头字段的Map对象headerValues表示一个保存了所有HTTP请求头字段的Map对象,返回的是String类型数组cookie用来取得客户端的cookie值,返回一个map类型的值initParam表示一个保存了所有Web应用初始化参数的Map对象 pageContext可以用于获取其他的10个隐式对象 语法:${pageContext.request.requestURL}pageScope、requestScope、sessionScope、applicationScope 是用于获取指定域的隐式对象 语法:${requestScope.name}param和paramValues 是用于获取请求参数的隐式对象 语法:${param.num} ${paramValues.nums[0]}header和headerValues 是用于获取HTTP请求消息头的隐式对象cookie是用于获取Cookie 信息的隐式对象 语法:${cookie.userName} ${cookie.userName.name} ${cookie.userName.Value}initParam 是用于获取Web应用初始化信息的隐式对象

JSTL标签库

概述

什么是JSTL

Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用 于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库 操作等。

JSTL虽然被称为标准标签库,但实际上是由五个不同功能的标签库共同组成的。 JSTL包含的标签库如下:

标签库标签库的URL前缀Corehttp://java.sun.com/jsp/jstl/CorecI18Nhttp://java.sun.com/jsp/jstl/fmtfmtSQLhttp://java.sun.com/jsp/jstl/sqlsqlXMLhttp://java.sun.com/jsp/jstl/xmlxFunctionshttp://java.sun.com/jsp/jstl/functionsfn Core是一个核心标签库,它包含了实现Web应用中通用操作的标签。例如用于输出的<c:out>,用于迭代循环的<c:forEach>等I18N是一个国际化/格式化标签库,它包含实现Web应用程序的国际化标签和格式化标签。例如设置JSP页面的本地信息、设置JSP页面的时区等SQL是一个数据库标签库,它包含了用于访问数据库和对数据库中的数据进行操作的标签。例如从数据库获得数据库连接、检索数据等。但JSP页面很多时候仅作为表示层,一般不会在JSP页面中操作数据库XML是一个操作XML文档的标签库,它包含对XML文档中的数据进行操作的标签、例如解析XML文件、输出XML文档内容、迭代XML文档中的元素等,广泛用于Web开发。Functions是一个函数标签库。他提供了一整套的自定义EL函数,包含了JSP页面制作者常用的字符串操作,例如提取字符串中的子字符串、获取字符串的长度等。

下载与使用

要想在JSP页面中使用JSTL,首先需要安装JSTL。

下载JSTL 包括两个 JAR 文件,jstl.jar 和 standard.jar 是什么没有必要管,重在应用 ( 1+1 ? =2 ,我们没有必要深究,只需要知道这么用就行。) 可以在Apache的网站下载JSTL的JAR包:点击进入

其中,jstl.jar 包含了JSTL规范中定义的接口和相关类 standard.jar文件包含用于实现JSTL的class文件以及5个标签库的描述符文件

配置JSTL 将jstl.jar 和 standard.jar 这两个文件复制到项目的lib目录下即可在JSP页面中使用<%@ taglib url="http://java.sun.com/jsp/jstl/Core" prefix="c" %>导入Core标签库编写一个简单的JSP页面,其中含有<c:out value="Hello World!"></c:out>,如果浏览器正确输出Hello World!则配置完毕

Core标签库

out标签

<c:out>标签

该标签可以将一段文本内容或者表达式的结果输出到客户端,如果文本内容包含需要转义的字符,则默认会对他们进行HTML编码转化后再输出

语法格式([]里的参数可选) 没有标签体的情况<c:out value="value" [default="defaultValue"] [escapeXml="true"] /> 有标签体的情况<c:out value="value" [escapeXml="true"]> defaultValue </c:out> 属性 value属性用于指定输出的文本内容default属性指定value值为null时的默认值,如果没有该属性,则输出空字符串escapeXml属性用于指定是否将特殊字符转义,默认为true

if标签

<c:if>标签

如果要在JSP页面进行条件判断,就需要使用Core标签库提供的 <c:if> 标签,专门用于JSP页面的条件判断

语法格式(scope参数可选) 没有标签体的情况<c:if test="testCpndition" var="result" scope="session"> 2.有标签体的情况<c:if test="testCondition" var="result" scope="session"> body content </c:if> 属性 test 属性用于设置逻辑表达式var 属性用于指定逻辑表达式中变量代码名字scope属性用于指定var变量的作用范围默认值为page,如果属性test的计算结果为true,那么标签体将被执行 示例: <body> <c:set value="1" var="visitCount" property="visitCount" /> <c:if test="${visitCount==1 }"> This is you first visit. Welcome to the site! </c:if> </body>

choose标签

<c:choose> <c:when> <c:otherwise>标签

choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。

<c:choose>标签没有属性,他的标签体中只能嵌套一个或多个<c:when>标签和零个或一个 <c:otherwise>标签。

<c:when> 只有一个test属性,该属性的值为boolean类型,其值可以是一个条件表达式,如果条件表达式的值为true ,则执行标签体内容。

<c:otherwise>标签没有属性,类似于switch语句中的default关键字,用于输出不满足上述条件时的默认输出选项

示例

<body> <c:choose> <c:when test="${empty param.username}"> unKnown user. </c:when> <c:when test="${param.username=='rolin'}"> ${ param.username} is manager. </c:when> <c:otherwise> ${ param.username} is employee. </c:otherwise> </c:choose> </body>

forEach标签

<c:forEach>标签

forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的 java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。

语法:

迭代包含多个对象的集合(只有 items 是必写属性)<c:forEach items="collection" var="varName" varStatus="varStatusName" begin="begin" end="end" step="step"> 迭代指定范围内的集合(只有 begin 和 end 是必写属性)<c:forEach var="varName" varStatus="varStatusName" begin="begin" end="end" step="step"> boby content </c:forEach>

属性

var属性用于指定将当前迭代到的元素保存到Page域中的名词items属性用于指定将要迭代的集合对象varStatus属性用于指定当前迭代状态信息的对象保存到page域中的名称begin属性用于指定从集合的第几个元素开始迭代,索引值从0开始、如果没有指定items的值,则从begin指定的值开始迭代,直至迭代结束step属性用于指定迭代的步长,即迭代因子的增量

示例

<!-- forEach标签两种作用, 1,将主体内容循环多次 2,迭代集合 --> <!--将主体内容循环多次 --> <c:forEach var="i" begin="1" end="7"> <!--var:用来存放现在被指到的对象,begin开始的位置,end结束的位置 --> 主体内容:${i } </c:forEach> <!--结果为:主体内容:1 主体内容:2 主体内容:3 主体内容:4 主体内容:5 主体内容:6 主体内容:7 主体内容 --> <!-- 迭代集合 --> <!-- list --> <% List<String> list = new ArrayList<String>(); list.add("xiaoyan"); list.add("lingdong"); list.add("yefan"); request.setAttribute("list", list); %> <c:forEach items="${list}" var="str" varStatus="status" > ${str }:${status.index }:${status.count }:${status.first }:${status.last } <!--index表示索引,count表示出现的位数,first表示是否是第一个,last表示是否是最后一个 --> </c:forEach> <!--map --> <% Map<String,Object> map = new HashMap<String,Object>(); map.put("user1",new User("zs","123")); map.put("user2", new User("ls","1234")); request.setAttribute("map",map); %> <c:forEach items="${map}" var="user"> ${user.key }:${user.value } ${user.value.uname } ${user.value.upwd } </c:forEach> 补充 <c:forEach>标签的varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含了从集合取出元素的状态信息。 使用<c:forEach>标签的varStatus标签可以获取以下信息: count: 表示元素在集合中的序号,从1开始计数index: 表示当前元素在集合中的索引,从0开始技术first : 表示当前元素是否为集合中的第一个元素last: 表示当前元素是否为集合中最后一个元素 例子: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="java.util.*"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head></head> <body style="text-align: center;"> <% List userList = new ArrayList(); userList.add("Tom"); userList.add("Make"); userList.add("Lina"); %> <table border="1"> <tr> <td>序号</td> <td>索引</td> <td>是否为第一个元素</td> <td>是否为最后一个元素</td> <td>元素的值</td> </tr> <c:forEach var="name" items="<%=userList%>" varStatus="status"> <tr> <td>${status.count}</td> <td>${status.index}</td> <td>${status.first}</td> <td>${status.last}</td> <td>${name}</td> </tr> </c:forEach> </table> </body> </html>

其他标签

<c:set>

用于设置范围变量的值或者 javabean 对象的属性。

看个实际例子:

<c:set var=”username” value=”lisi” scope=”session”/>

这样就相当于设置了 session 。

<c:remove> 相对 <c:set> 其作用是移除范围变量。<c:remove var=”nusername” scope=”session”/> <c:catch>

用于捕获在其中嵌套的操作所抛出的异常对象,并将异常信息保存到变量中。

我们将有可能抛出异常的代码放置到开始标签 <c:catch> 和结束标签 </c:catch> 之间。如果其中代码出现异常,异常对象将被捕获,保存在 var 声明的变量中,该变量总是有 page 范围。如果没有发生异常,而 var 所标识的范围变量将被移除。 如果没有指定 var 属性,异常只是简单的被捕获,异常信息并不会被保存。

<c:catch var=”exception”> <% int i = 5; int j = 0; int k=i/j; %> </c:catch> <c:out value=”${exception}” /><br> <c:out value=”${exception.massage}”/> <!-- 后一句相当于: exception.getMessage() --> <c:redirect> 该标签用于重定向 语法:<c:redirect url="/web/nav/projects.html" />

最新回复(0)