第7章 JSTL标签库

7.1 EL表达式获取域中数据

EL表达式概述:
EL 全名为Expression Language,它提供了在JSP中简化表达式的方法,让JSP的代码更加简化,可以嵌入在jsp页面内部,减少jsp脚本的编写
EL从域中取数据:
jsp脚本:<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:${requestScope.name}
EL最主要的作用是获得四大域中的数据,格式:
${EL表达式}
EL获得pageContext域中的值:

${pageScope.key}

EL获得request域中的值:

${requestScope.key}

EL获得session域中的值:

${sessionScope.key}

EL获得application域中的值:

${applicationScope.key}

EL从四个域中获得某个值${key}:
同样是依次从pageContext域,request域,session域,application域中获得属性,在某个域中获取后将不再向后寻找

<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    pageContext.setAttribute("name","张三");
//在脚本中存一下数据
    request.setAttribute("name","小明");
//    在session中存一个对象user
    User user=new User();//创建一个uesr对象
    user.setName("小红");
    user.setSex("女");
//    设置到session的作用域中
    session.setAttribute("user",user);
//    创建一个集合,将集合存入到application中
    List<User> list=new ArrayList<>();
    User user1=new User();
    user1.setName("小强");
    user1.setSex("男");
    User user2=new User();
    user2.setName("小丽");
    user2.setSex("女");

//将这两个用户加入到集合中
    list.add(user1);
    list.add(user2);
//    加入到application域中
    application.setAttribute("list",list);

%>
<%--通过jsp脚本形式,java代码获取数据--%>
<%=request.getAttribute("name")%>

<%--获取session域--%>
<%
    User user3 = (User) session.getAttribute("user");
    String name = user3.getName();
    out.write(name);
%>
<%--获取application中的list对象--%>
<%
    List<User> list1 = (List<User>) application.getAttribute("list");
    User user4 = list1.get(0);
    out.write(user4.getName());
//    遍历list集合
    for (User user5 : list1) {

    }
%>

<%--EL表达式从区域中获取数据的方式--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}

${name}
${user.name}
${list[0].name}

<%--EL执行表达式--%>
${1+1}
<%--关系运算--%>
${2>1}
${2 eq 2}
<%--逻辑运算--%>
${2>1 || 3>2}
<%--三元表达式--%>
${3>2 ? true:false}
${3>2 ? "正确":"呜呜"}
<%--判断对象是否为空--%>
${empty name}


</body>
</html>

package net_zixue.bean;

public class User {
//user的三个属性
    private String name;
    private String sex;
    private String id;
//get和set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

pageContext可以向指定的其他域中存取数据:

  • setAttribute(String name,Object obj,int scape)
  • getAttribute(String name,int scape)
  • removeAttribute(String name,int scape)
  • findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
    可以获得其他8大隐式对象:
    例如:pageContext.getRequest()
    pageContext.getSession()

7-2 EL的内置对象

EL的内置对象:
pageScope,requestScope,sessionScope,applicarionScope-------获取JSP中域中的数据
param,paramValues ----接收参数。相当于request.getParameter() request.getParameterValues()
header.headerValues -----获取请求头信息。 相当于request.getHeader(name)
initParam -----获取全局初始化参数。相当于this.getServletContext().getInitParameter(name)
cookie -----WEB开发中cookie。相当于request.getCookies()---->cookie.getName()------>cookie.getValue()
pageContext —WEB开发中的pageContext。pageContext获取其他八大对象


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--假如http请求中传入了一个username的参数--%>
<%
    request.getParameter("userName");

%>

<%--EL的内置对象--%>
${param.userName}
${header.host}

<%--获取项目路径--%>
${pageContext.request.contextPath}

<%--JSP主要用来展示数据,sevlet主要用来处理数据--%>
</body>
</html>

7-3 EL的执行表达式

<%--EL表达式从区域中获取数据的方式--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}

${name}
${user.name}
${list[0].name}

<%--EL执行表达式--%>
${1+1}
<%--关系运算--%>
${2>1}
${2 eq 2}
<%--逻辑运算--%>
${2>1 || 3>2}
<%--三元表达式--%>
${3>2 ? true:false}
${3>2 ? "正确":"呜呜"}
<%--判断对象是否为空--%>
${empty name}

7-4 JSTL的简介与基本配置

JSTL简介:
JSTL,JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能,jstl出现的目的同EL一样也是要代替jsp页面中的脚本代码,jstl标准标准标签库有5个子库,但随着发展,目前常使用的是它的核心库。
在这里插入图片描述
下载jstl标签库以OTD文件:
在这里插入图片描述
在项目下创建lib目录:

  1. 首先,在IDEA下创建lib目录用来存放第三方的jar文件
  2. 找到lib目录下的standard.jar和jstl.jar文件,复制文件,把它们粘贴在WEB_INF/lib目录下
    在这里插入图片描述

7-5 JSTL-if标签

jstl的标签:
<c:if>标签专门用于完成JSP界面中的条件判断
<c:if test=“表达式”>
//表达式成立执行语句
</c:if>
其中test是返回boolean的条件

<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--<c:if test="1+1==2">
    表达式成立,执行内部语句
</c:if>--%>
<%--使用JSTL的时候需要配合EL表达式--%>
<%--jstl标签不能独自执行运算--%>
<%--<c:if test="${1+1==2}">
    表达式成立,执行内部语句
</c:if>--%>
<c:if test="${requestScope.follow eq 1}">
<%--    字符串等于用eq--%>
<%--    没有else标签--%>
    取消关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
    关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>


<%
    List<User> list=new ArrayList<>();
    User user1=new User();
    user1.setName("小强");
    user1.setSex("男");
    User user2=new User();
    user2.setName("小丽");
    user2.setSex("女");

    list.add(user1);
    list.add(user2);
//    第一种遍历输出
    for (int i = 0; i < list.size(); i++) {
        System.out.println(i);
    }
    request.setAttribute("list",list);//list加入到一个域对象里

    for (User user : list) {
        System.out.println(user.getName());
    }

%>
<%--var变量的意思--%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
    <%--    el表达式--%>
    ${list[i].name}

</c:forEach>

<%--items代表的是一个集合或者是数组--%>
<%--var代表集合里面的每一个元素--%>
<c:forEach items="${list}" var="user">
    ${user.name}
</c:forEach>


</body>
</html>

package net_zixue.JSP;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "FollowServlet", value = "/follow")
public class FollowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


//        关注的时候传一个参数follow=1 不关注的时候传follow=0
        String follow = request.getParameter("follow");//获取请求参数
        request.setAttribute("follow",follow); //将值放到request域中
        request.getRequestDispatcher("/jstl/jstl.jsp").forward(request,response); //转发到JSP页面
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

7-6 JSTL-forEach标签

JSTL的forEach标签:
<c:forEach>用来循环遍历集合对象中的元素,如List、Map、数组等和java代码中的for循环一样,它也有两种形式

<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--<c:if test="1+1==2">
    表达式成立,执行内部语句
</c:if>--%>
<%--使用JSTL的时候需要配合EL表达式--%>
<%--jstl标签不能独自执行运算--%>
<%--<c:if test="${1+1==2}">
    表达式成立,执行内部语句
</c:if>--%>
<c:if test="${requestScope.follow eq 1}">
<%--    字符串等于用eq--%>
<%--    没有else标签--%>
    取消关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
    关注
    <%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>


<%
    List<User> list=new ArrayList<>();
    User user1=new User();
    user1.setName("小强");
    user1.setSex("男");
    User user2=new User();
    user2.setName("小丽");
    user2.setSex("女");

    list.add(user1);
    list.add(user2);
//    第一种遍历输出
    for (int i = 0; i < list.size(); i++) {
        System.out.println(i);
    }
    request.setAttribute("list",list);//list加入到一个域对象里

    for (User user : list) {
        System.out.println(user.getName());
    }

%>
<%--var变量的意思--%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
    <%--    el表达式--%>
    ${list[i].name}

</c:forEach>

<%--items代表的是一个集合或者是数组--%>
<%--var代表集合里面的每一个元素--%>
<c:forEach items="${list}" var="user">
    ${user.name}
</c:forEach>


</body>
</html>

7-7 案例:实现商品列表展示

package net_zixue.JSP;

import net_zixue.bean.Phone;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "PhoneListServlet", value = "/phoneList")
public class PhoneListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //通过servlet从数据库中获取数据,我们这里暂时通过手动创建数据

        Phone phone=new Phone(); //创建手机的对象 alt+enter选择bean目录下的包
        //手动设置数据
        phone.setName("iphone6");
        phone.setId(001);
        phone.setImage("https://img10.360buyimg.com/n7/jfs/t277/193/1005339798/768456/29136988/542d0798N19d42ce3.jpg");//图片的地址
        phone.setPrice("3900");

        Phone phone1=new Phone();
        phone1.setName("坚果pro");
        phone1.setId(002);
        phone1.setPrice("1799");
        phone1.setImage("https://img13.360buyimg.com/n7/jfs/t5377/56/1578379545/209772/32105f74/5911bcbdN7afa707b.jpg");

        Phone phone2=new Phone();
        phone2.setName("vivo x9");
        phone2.setPrice("2345");
        phone2.setId(003);
        phone2.setImage("https://img12.360buyimg.com/n7/jfs/t6067/340/2101390376/231820/750cc50e/593aa83fN8b0829fc.jpg");

        Phone phone3=new Phone();
        phone3.setName("oppo A57");
        phone3.setId(004);
        phone3.setPrice("1399");
        phone3.setImage("https://img10.360buyimg.com/n7/jfs/t4978/185/135948089/78285/f6a84203/58db6fa4N354322d9.jpg");

        Phone phone4=new Phone();
        phone4.setName("诺基亚6");
        phone4.setId(005);
        phone4.setPrice("1699");
        phone4.setImage("https://img11.360buyimg.com/n7/jfs/t4930/86/192598423/86027/36a57ccf/58dcbfa5N5c41cbfd.jpg");

        Phone phone5=new Phone();
        phone5.setName("小米MIX");
        phone5.setId(006);
        phone5.setPrice("3999");
        phone5.setImage("https://img13.360buyimg.com/n7/jfs/t4264/215/455518113/309855/38fe41f1/58b4fc81N1d924112.jpg");

        List<Phone> list=new ArrayList<>();
        list.add(phone);
        list.add(phone1);
        list.add(phone2);
        list.add(phone3);
        list.add(phone4);
        list.add(phone5);
//把数据传送给jsp
        //把数据存放在request域中
        request.setAttribute("list",list);
        //将数据转发给jsp页面
        request.getRequestDispatcher("/phone_list.jsp").forward(request,response);


    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

package net_zixue.bean;

public class Phone {

    private int id;
    private String name;
    private String image;
    private String price;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }
}

<%--
  Created by IntelliJ IDEA.
  User: 随身汀
  Date: 2021/5/9
  Time: 18:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--jstl用来遍历数据--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<%--接收数据--%>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>商品列表</title>
<%--    配置前端的css文件--%>
<%--    <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css" />--%>
<%--    <script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>--%>
<%--    <script src="js/bootstrap.min.js" type="text/javascript"></script>--%>
    <!-- 引入自定义css文件 style.css -->


</head>

<body>
<%--动态显示界面里的数据--%>
<%--将得到的数据替换掉里面写死的数据--%>
<%--遍历一下放在request域中的list集合--%>
<c:forEach items="${list}" var="phone">

    <div class="col-md-2" style="height:250px">
<%--        替换图片的地址--%>
        <img src="${phone.image}" width="170" height="170" style="display: inline-block;">
        </a>
<%--    替换手机的名字--%>
        <p>
            <a href="product_info.html" style='color: green'>${phone.name}</a>
        </p>
<%--    替换价格--%>
        <p>
            <font color="#FF0000">商城价:&yen;${phone.price}</font>
        </p>
    </div>

</c:forEach>



</body>

</html>
<%--在实际开发中,通过servlet来获取数据传递给jsp,jsp用来显示数据--%>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值