文章目录
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直接就能拿来用的对象。
作用域访问对象(用于服务器内部元素的获取)
- pageScope。当前页面有效。
- requestScope。当前请求有效。
- sessionScope。当前会话有效。
- 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中的赋值)
- 增改变量
<!--增改域中变量(域中有次变量则修改,没有则增加)-->
<c:set var="vname" value="vvalue" scope="vscope"/>
<!--var:变量名、value:变量值、scope:变量的域-->
<c:set var="sname" value="张三" scope="request"/>
这就相当于request.setAttribute(“sname”, “张三”)。
- 修改对象的属性
<c:set target="${requestScope.student}" property="sname" value="李四"/>
查
使用**<c:out>**(相当于java中的prient,${}但是比EL表达式要厉害)
- 普通显示
<c:out value="zs"/>
<c:out value="${requestScope.student.sname}"/>
使用jstl进行输出,若值为空则显示空白、若不为空才显示他的值。(与EL类似)
- 有空缺省值的显示
<c:out value="${requestScope.student.sname}" default="张三"/>
- 是否逃避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"/>
条件标签库(进行条件判断)
单重选择
- 简单使用:
使用**<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)。
- 将判断结果放入某域中的某变量中:
使用属性 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
-->