Java就业-EL和JSTL核心技术

前文

书接上文,我们知道了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也是比较基础的内容,学过一段时间可能就会忘记,要经常翻翻笔记哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值