JavaEE基础(四)EL与JSTL

JavaEE基础(四)EL与JSTL

EL表达式

EL用来在jsp中进行域中属性的显示或替代变量/对象(用于嵌入代码中)。分为两种域:1、jsp内置域对象域,2、form表单域。并且在显示过程中进行一些操作,例如判断非空,获取jsp内置对象等。

使用:

${域对象.属性.属性....}
<!--
在request中有setAttribute("student", student1)
-->
${requestScope.student.sname}

从上述可以看出EL表达式可以级联获取属性。

EL运算符

点运算符

使用点运算符进行属性的获取:

${requestScope.student.sname}
中括号运算符

中括号运算符比点运算符更强大一些。

强大之处:

  • 可包含特殊字符
  • 可访问数组、map、list中的元素
${requestScope["student"].sname}
${requestScope.student["sname"]}
${requestScope["student"]["sname"]}

<!--获取数组中的元素-->
${requestScope["students"][0]["sname"]}
${requestScope["students"][1]["sname"]}
<!--map与list与数组相似-->
关系、逻辑运算符

关系、逻辑运算符与java中相同。

${3>2}
<!--true-->
${3 == 2}
<!--false-->
${3>2 || 3==2}
<!--true-->
${requestScope.student.sname == 'zs'}
<!--等等等....-->
empty运算符

empt运算符用来判断域中属性是否为空。

空则返回一个true,非空返回一个false。

${empty requestScope.student}
<!--存在则返回一个false、不存在返回一个true-->

EL表达式中的三类隐式对象

隐式对象:不用new直接就能拿来用的对象。

作用域访问对象(用于服务器内部元素的获取)
  1. pageScope。当前页面有效。
  2. requestScope。当前请求有效。
  3. sessionScope。当前会话有效。
  4. applicationScope。当前项目有效。

在EL使用时需要对作用域进行明确的指明。如果不指明直接使用一个变量名则会从小到大作用域一个一个搜索,第一次找到这个变量名就会直接用这个变量。

参数访问对象(用于form表单中元素的获取)

单个字段用:${param}

多个字段用:${paramValues}

<form action="...jsp">
	用户名:<intput type="text" name="uname"/><br/>
    密码:<intput type="password" name="upwd"/><br/>
    爱好:
    <input type="checkbox" name="hobbies" value="foorball">足球
    <input type="checkbox" name="hobbies" value="basketball">篮球
    <input type="submit" value="提交">
</form>
${param.uname}
${param.upwd}
${paramValues.hobbies[0]}
${paramValues.hobbies[1]}
JSP隐式对象(用于获取JSP中隐式对象)

在jsp中可以用pageContext获取页面中所有的jsp隐式对象,所以在EL中也可以使用pageContext获取所有的jsp隐式对象。

${pageContext.request}
<!--获取request对象-->
${pageContext.session}
<!--获取session对象-->

也可以获取其他jsp隐式对象,从上述可以看出在java代码中需要getSession才能获取而在EL中直接使用session就可以。也就是说其他函数也是去掉第一个词、第一个驼峰小写来调用的。

JSTL表达式

JSTL用来在jsp中进行域中属性的增删改查、条件判断语句、循环语句。

Java没内置JSTL标签库,所以需要手动下载jstl.jar包。依赖standard.jar包。

JSP中引用jstl标签库需要使用一个jsp的taglib命令,如下:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!--c是一个前缀,也就是jstl标签库的意思-->

通用标签库(进行增删改查)

增、改

使用**<c:set>**(也就相当与java中的赋值)

  1. 增改变量
<!--增改域中变量(域中有次变量则修改,没有则增加)-->
<c:set var="vname" value="vvalue" scope="vscope"/>
<!--var:变量名、value:变量值、scope:变量的域-->
<c:set var="sname" value="张三" scope="request"/>

这就相当于request.setAttribute(“sname”, “张三”)。

  1. 修改对象的属性
<c:set target="${requestScope.student}" property="sname" value="李四"/>

使用**<c:out>**(相当于java中的prient,${}但是比EL表达式要厉害)

  1. 普通显示
<c:out value="zs"/>
<c:out value="${requestScope.student.sname}"/>

使用jstl进行输出,若值为空则显示空白、若不为空才显示他的值。(与EL类似)

  1. 有空缺省值的显示
<c:out value="${requestScope.student.sname}" default="张三"/>
  1. 是否逃避xml解析
<c:out value="<a href="https://baidu.com">baidu</a>" escapeXML="true"/>
<!--输出:<a href="https://baidu.com">baidu</a>-->
<c:out value="<a href="https://baidu.com">baidu</a>" escapeXML="false"/>
<!--输出:baidu。(这是一个超链接)-->

c:out只能用于页面上信息的输出,并不能像EL表达式中那样可以作为变量嵌入到代码中。

使用**<c:remove>**

用于删除某域中的某变量(域的属性)

<c:remove var="student" scope="request"/>

条件标签库(进行条件判断)

单重选择
  1. 简单使用:

使用**<c:if>**(也就相当于java中的if)

<c:if test="${10>3}">
	10确实大于3
</c:if>

​ 结果为10确实大于3。test中一般使用JSTL进行判断。(因为使用EL表达式进行判断会返回一个真或假,然后test=“true”/“false”)如果直接使用"10>3"则不会由任何的判断(因为使用字符串“10>3”并不会返回一个true/false)。

  1. 将判断结果放入某域中的某变量中:

使用属性 var、scope

<c:if test="${10>3}" var="result" scope="request">
	${requestScope.result}
</c:if>

将test的结果放在scope域中的var变量中。在if块内输出request域中的result。其实相当于<c: set var=“result” value="${10>3} scope=“request”>

也可以直接获取,例如:

<c:if test="${10>3}" var="result" scope="request">
	${request}
</c:if>

因为EL表达式中不写默认域就是从小到大域中依次寻找。

多重选择

使用**<c:choose>、<c:when>、<c:otherwise>**(相当于java中的switch…case…,java中的switch、case也可以看做if…else if…else)

<c:choose>
    <c:when test="...">
    	1
    </c:when>
    <c:when test="...">
    	2
    </c:when>
    <c:otherwise test="...">
    	2
    </c:otherwise>
</c:choose>

注意:在使用test时,引号中不能有空格等字符。否则就会变成"true "相当于加了空格后成了字符串了,但是只有“true”时才是真。

迭代标签库(循环)

普通迭代

使用**<c:forEach>**(相当于java中的for(int i; i < ; i++))

<c:forEach begin="1" end="10" step="1" varStatus="stasus">
	循环体
    <!--status是一个对象,拥有index等属性(也就是当前的下标值)-->
    ${status.index}
</c:forEach>

输出就是:循环体1循环体2循环体3…循环体10。注意:在<c:forEach>中是[begin,end],end不是超下标。

类java加强for循环迭代

也是用**<c:forEach>**(相当于java中的for(Object obj: objs))

<c:forEach var="name" items="requestScope.集合/数组/List等">
	${name}
</c:forEach>

<!--
相当于:
for(Object obj: objs){}
objs == items, obj == var
-->

<c:forEach>中是[begin,end],end不是超下标。==**

类java加强for循环迭代

也是用**<c:forEach>**(相当于java中的for(Object obj: objs))

<c:forEach var="name" items="requestScope.集合/数组/List等">
	${name}
</c:forEach>

<!--
相当于:
for(Object obj: objs){}
objs == items, obj == var
-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值