前文
书接上文,我们知道了jsp是如何在页面中获取内置对象的值,但是有一点在于,写法很长,而el表达式正可以解决这个痛点,让我们一起看下el表达式是如何简化的
一、访问数据
1.1 访问内置对象
原始访问形式:
<%pageContext.getAttribute("name")%>
el表达式形式:
${name}
是不是炒鸡简单!
不过这又引出了另一个问题,如果四个内置对象都有name属性,el表达式获取的是哪个对象的属性呢?
答案其实很简单,之前学四大内置对象的时候有提到过,每个对象的作用范围不同,从小到大依次是pageContext、request、session、application,而访问的优先级也是这样,优先访问作用域最小的,因此,如果这四个对象都有name属性,则默认访问的是pageContext域下的name属性
1.2 访问请求参数值
原始访问形式:
// 访问单个值
<%=request.getParameter("inputName")%>
// 访问数组
<%=Arrays.toString(request.getParameterValues("checkBoxName"))%>
el表达式形式:
// 访问单个值
${param.inputName}
// 访问数组中第一个值
${paramValues.checkBoxName[0]}
可以看出来,param和paramValues其实是el表达式中的内置对象
1.3 访问bean对象
原始访问形式:
<%=person.getName()%>
el表达式形式:
${person.name}
可以看出来,el表达式是直接获取了person对象的name属性值,而原始形式需要访问getName这个方法来获取返回值
还有另一种写法:
${person["name"]} // 注意有双引号哦
那么有人可能想要问了,这种写法有什么用呢?
首先,如果想要访问的属性名字包含了特殊字符,如【.】,那么通过对象.属性的方式就无法访问,因为无法识别这个.到底是什么意思
其次,用这种方式可以动态的访问参数,我们可以在中括号中传递一些变量,想访问的属性赋值给变量即可
因此无特殊情况,还是推荐大家用第二种访问方式。
1.4 访问集合
访问list集合:
// 访问list集合
${listName}
// 访问list第一个元素
${listName[0]}
访问map集合
// 访问map集合
${mapName}
// 访问map集合中key为k的值
${mapName["k"]}
二、el表达式中的内置对象
三、常用运算符
Java里的运算符在el表达式里都支持,需要注意的是在进行操作时需要在【${}】中进行,如计算a+b:
${a+b}
说一个和Java中不太一样的表达式:${empty 表达式},返回值是布尔类型,用来判断表达式是否为空,这里需要注意的是,null值、无元素的集合或数组、长度为0的string均被认为是空值
四、JSTL标签
4.1 定义
JSTL其实就是jsp的标签库,我们可以用标签的形式来取代一部分Java代码,提高程序可读性
4.2 使用
1、下载jstl的jar包:https://tomcat.apache.org/download-taglibs.cgi
2、在jsp页面中引入标签库:
<-- prefix用来指定库的引用名字,通过c:指令来使用 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
4.3 常用标签库
4.3.1 输出标签
没啥可说的,就是打印
<c:out value="hello world!"></c:out>
4.3.2 设置标签
1、对指定范围的内置对象设置值
<-- 相当于pageContext.setAttribute("name","test") -->
<c:set var="name" value="test" scope="page"></c:set>
<-- 打印 -->
<c:out value="${name}"></c:out>
2、设置对象的属性值
<jsp:useBean id="person" class="com.Person" scope="page"></jsp:useBean>
<c:set property="name" value="test" target="${person}"></c:set>
<-- 输出 -->
<c:out value="${person.name}"></c:out>
4.3.3 删除标签
删除指定的数据
<--设置一个属性值-->
<c:set var="name" value="test" scope="page"></c:set>
<--删除一个属性值,范围需要保持一致-->
<c:remove var="name" scope="page"></c:remove>
4.3.4 单条件判断标签
只有一个if
<c:if test="el表达式">
满足条件执行代码
</c:if>
4.3.5 多条件判断标签
不光有if,还有else呢!
<c:choose>
<c:when test="${score>60}">
满足条件执行代码
</c:when>
<c:when test="${score==60}">
满足条件执行另一种代码
</c:when>
<c:otherwise>
前两个条件都不满足,执行最后一种代码
</c:otherwise>
</c:choose>
4.3.5 循环标签
1、普通循环
<c:foreach var="变量名" items="集合">
</c:foreach>
2、跳跃性循环
<-- 下标间隔两个遍历 -->
<c:foreach var="变量名" items="集合" step="2">
</c:foreach>
3、指定起始和结束位置
<-- 从下标1开始至3结束,包含1和3 -->
<c:foreach var="变量名" items="集合" begin="1" end="3">
</c:foreach>
4.3.6 函数标签
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
fn下有很多方法,如判断字符串是否包含某一关键字等等
${fn:contains(原始字符串,“包含的内容”)}
4.3.7 格式化标签
提供数据的格式化,如格式化时间日期
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd"></fmt:formatDate>
4.3.8 自定义标签
如果以上几种标签都不能满足开发需要,我们可以定义自己的标签
1、编写标签类继承SimpleTagSupport类或TagSupport类,重写doTag方法或doStartTag方法
public class HelloTag extends SimpleTagSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out = this.getJspContext().getOut();
out.println("自定义标签的参数为:" + name);
}
}
2、创建标签库文件
在WEB-INF下New-》XML Configuration File-》JSP Tag Library Descriptor
在文件中添加标签
<tag>
<-- 标签的名称 -->
<name>helloTag</name>
<-- 标签所对应的class -->
<tag-class>com.HelloTag</tag-class>
<body-content>empty</body-content>
<attribute>
<-- 参数名 -->
<name>name</name>
<required>true</required>
</attribute>
</tag>
在jsp中添加引用
<%@ taglib prefix="hello" uri="http://lagou.com" %>
以上就是jsp的所有内容啦,jsp也是比较基础的内容,学过一段时间可能就会忘记,要经常翻翻笔记哦