【JavaWeb开发】EL表达式和JSTL标签的使用

JSP本身的代码块实在是令人抓狂与无语,拆分标签到了令人无语的境地,于是EL表达式和JSTL救星横空出世,救jsp于水火之中。

1.JSTL下载

下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

拉到下面下最新版
在这里插入图片描述
下完解压后进入lib文件夹把两个jar复制到你项目的lib里面并导入项目
在这里插入图片描述

2.EL表达式

书写格式(写几个最常用的,其他用JSTL更规范):

${标识符} 输出变量 而取的值跟内置对象有优先级关系
${对象.属性} 输出对象的属性值
${empty 对象名?"为空":“不为空”}

使用EL表达式则可以减少很多取值的代码。
这些值是从哪取的呢,实际上就是从四大作用域中获取的。
servlet中的四个作用域分别为page,request,session,application

简单介绍一下四种属性范围(从上到下,范围从小到大):

  • page(pageContext):只在一个页面中保存属性。 跳转之后无效。
  • request:只在一次请求中有效,服务器跳转之后有效。 客户端跳无效
  • session:再一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效
  • application:在整个服务器上保存,所有用户都可使用。 重启服务器后无效

而EL表达时中的值的优先级也是从范围小的开始先取
page先于request先于session先于application

3.JSTL使用

JSP标准标签库(JavaSeverPages Standard Tag Libary)
同样的也是为了简化jsp代码,一般与EL表达式结合使用
EL表达式多用于取值操作,而JSTL则可以方便我们对集合进行遍历,对数据进行判断等操作。

3.1 jsp中引入JSTL标签

在jsp开头加上

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

注意:core是核心标签,一定是jsp内的jstl/core,并且prefix其实可以自己定,但最好还是用c比较规范

3.2 常用标签

set标签:将值保存在指定的作用域中

<%-- var="变量名"  value="值" scope="保存在哪个作用域(page、request、session、application)"--%>
<c:set var="userName" value="cicheng" scope="page"></c:set>
<%-- 可配合EL表达式取值 --%>
${userName}

out标签:将结果输出

<%--取值--%>
<c:out value="${userName}"></c:out>
<%-- 可以替换成EL,更简单 --%>
${userName}

remove标签:删除某个值

<%--删除userName的值--%>
<c:remove var="userName"></c:remove>

if标签:if判断(单纯的一个判断)

<%--test内是判断条件,一般写EL表达式来当条件--%>
<c:if test="${userName == 'cicheng'}">
	${userName}
</c:if>

choose标签(when标签和otherwise标签):if else判断

<c:choose>
    <%-- 如果userName=cicheng --%>
    <c:when test="${userName == 'cicheng'}">
        ${userName}
    </c:when>
    <%-- 如果userName=此成 --%>
    <c:when test="${userName == '此成'}">
        ${userName}
    </c:when>
    <%-- 如果userName以上条件都不符合 --%>
    <c:otherwise>
        userName=${userName},不符合标准
    </c:otherwise>
</c:choose>

forEach标签:遍历集合

<%-- 基础用法,用于迭代集合,将users集合依次用user遍历 --%>
<c:forEach items="${users}" var="user">
    <span>${user.name}</span>
    <span>${user.password}</span>
    <br>
</c:forEach>

着重讲一下forEach标签

全部属性的意义

  • items:迭代的集合
  • var:集合的每一项的别称
  • begin:从哪个下标开始迭代,默认值为0
  • end:迭代到第几个,默认值为集合的长度,即集合.size()
  • step:迭代的步长,默认为1
  • varStatus:迭代项的状态变量名,可以获取迭代项的相关状态
    有begin,end,step三个不变状态,
    count-当前迭代次数,
    current-当前对象,
    first-是否为第一个对象,
    last-是否为最后一个对象,
    index-当前下标

实验代码:
jsp

<c:forEach items="${users}" var="user" begin="0" end="${users.size()}" step="1"  varStatus="status">
    name=${user.name}<br />
    password=${user.password}<br />
    status.begin=${status.begin}<br />
    status.end=${status.end}<br />
    status.count=${status.count}<br />
    status.current=${status.current}<br />
    status.first=${status.first}<br />
    status.last=${status.last}<br />
    status.index=${status.index}<br />
    -----------------------------------------------<br />
</c:forEach>

后台测试集合
Servlet

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        List<User> users=new ArrayList<>();
        User user1=new User("此成","123");
        User user2=new User("小明","1234");
        User user3=new User("小红","12345");
        users.add(user1);
        users.add(user2);
        users.add(user3);
        req.setAttribute("users",users);
        req.getRequestDispatcher("index.jsp").forward(req,resp);
    }
}

User实体

public class User {
    private String name;
    private String password;

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

访问servlet运行结果:
在这里插入图片描述
可以很清楚的看到forEach标签的各个属性的作用。

以上为本文全部内容,如果对你有所帮助,请点个赞给作者一些鼓励~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值