JavaWeb+在线图书商城+EL(表达式语言)+ JSTL(JSP标准标签库)(超详细)

🙈作者简介:练习时长两年半的Java up主
🙉个人主页:老茶icon
🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎
📚系列专栏:Java全栈,计算机系列(火速更新中)
💭 格言:种一棵树最好的时间是十年前,其次是现在
🏡动动小手,点个关注不迷路,感谢宝子们一键三连

课程名:Java

内容/作用:知识点/设计/实验/作业/练习

学习:Java

续前章内容:在线图书商城

续前章内容:在线图书商城

环境与设备

1.软件:IntelliJ IDEA 2022.3.2
2.环境:Windows 11 and JDK 11

内容:

EL

Expression Language 表达式语言

是为了使JSP中的输出写起来更加简便,替换JSP中的<%=%>,即表达式。

主要输出保存在某个作用域中的数据。

特点

  • 减少代码(获取对象、转换对象、获取对象属性)

    • 如果通过"某个作用域对象.setAttribute(String str,Object obj)"方法保存的对象,

      在JSP页面中,如果用表达式,写为<%=str>;如果使用EL,写为${str}。

      会依次从pageContext–>request–>session–>application中获取指定对象,如果一旦从某个作用域中获取到了对象,就不再判断后续作用域。

      也可以指定从某个作用域中获取对象,如${session.str}表示从session作用域中获取对象。

  • 免去非空判断

    • 如果要使用的某个对象不存在,不会输出null,而是输出空字符串""

使用

1.获取保存在作用域中的对象

  • 获取保存在某个作用域中的对象:${对象名}

  • 从指定的作用于中获取对象

    作用域单词对应作用域代码
    pageScope当前页pageContext${pageScope.对象}
    requestScope请求request${requestScope.对象}
    sessionScope会话session${sessionScope.对象}
    applicationScope项目application${applicationScope.对象}
  • 输出对象的属性

    ${对象名.属性名}   
    ${对象名["属性名"]}    
    
    要保证该属性有对应的get方法    
    
  • 输出对象的方法返回值

    ${对象名.方法名()}   
    
举例
//在servlet中,将一个集合保存在请求对象request中
//Person有name、sex和age属性
Person p1 = new Person("a","男",20);
Person p2 = new Person("b","男",20);
Person p3 = new Person("c","女",20);
List list = new ArrayList();
list.add(p1);
list.add(p2);
list.add(p3);
req.setAttribute("list",list);

使用请求转发跳转到页面中

<!--传统JSP中的表达式-->
<%
List list = (List)request.getAttribute("list");
//需要获取、转换后才能遍历使用
%>
<table>
    <%
    for(Object obj in 集合){
        %>

    <td><%=obj.get属性()%></td>

    <%
    }
    %>
</table>


<!--使用EL和JSTL后-->
<table>
    <c:forEach items="${list}" var="p">
        <!--使用EL-->
        <td>${p.name}</td>>
        <td>${p.sex}</td>>
        <td>${p.age}</td>>
    </c:forEach>
</table>

2.用户获取当前项目上下文路径(根目录+项目名)

如http://localhost:8080/book_shop是一个项目上下文路径。

在JSP中使用**${pageContext.request.contextPath}**获取项目上下文路径

<form action="${pageContext.request.contextPath}/book?op=xxx"></form>

<a href="${pageContext.request.contextPath}/book?op=xxx"></a>

<img src="${pageContext.request.contextPath}/pages/imgs/xxx.jpg">

<script>
	$.ajax({
        url:"${pageContext.request.contextPath}/book?op=xxx"
    });
</script>

3.在页面中获取请求中携带的参数

可以使用EL获取表单提交或地址中?后传递的数据

使用**${param.参数}**表示request.getParameter(“参数”)方法获取的数据

<form action="xxx.jsp">
    <input type="text" name="username">
    <input type="submit">
</form>

<a href="xxx.jsp?username=admin"></a>

在xxx.jsp中

${param.username}获取提交的数据

注意

  • web.xml版本在4.0之后,在JSP中使用EL时,默认可以识别。

  • 如果JSP中无法识别EL,原样输出${}符号时,在指令(<%@ %>)中加入 isELIgnored=“false” 表示不忽略EL

    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
    
  • 如果在使用EL的过程中,出现PropertyNotFoundException异常,表示未发现指定属性,原因有

    • 缺少指定属性
    • 指定属性没有对应的get方法

JSTL

Java Server Page Standarded Tag Library JSP标准标签库

可以使用JSTL中的特定标签,来替换JSP中常见的java代码,如循环判断等。减少JSP中的java代码,提高页面的可读性。

使用

  • 导入jstl依赖

    <!-- jstl -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    
  • 在JSP页面中,加入标签库指令

    <!--在当前页面中使用jstl,以c为标签前缀-->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

    这句话可以在使用循环时自动生成

  • 具体使用

    • 定义变量或给变量赋值

      <c:set var="变量名" value="值"></c:set>
      <c:set var="name" value="admin"></c:set>
      
    • if判断

      <c:if test="判断条件">
      	满足时执行
      </c:if>
      
      session.setAttribute("user",用户对象);
      
      <c:if test="${empty user}">
      	<span>请登录</span>
      </c:if>
      
      <c:if test="${!empty user}">
      	<span>${user.username}</span>
      </c:if>
      
    • 遍历List集合

      //如在servlet中,将查询到的集合保存在request对象中
      request.setAttribute("list",查询到的集合)
      <table>
          <!--<c:forEach items="要遍历的集合" var="遍历出的每个对象">-->
          <c:forEach items="${list}" var="obj"> 
              <tr>
                  <td>${obj.属性}</td>
              </tr>
          </c:foreach>
      </table>
      
    • 遍历Map集合

      <%
          HashMap<String,String> hm = new HashMap();
          hm.put("yyds","永远单身");
          hm.put("awsl","阿伟死了");
          hm.put("u1s1","有一说一");
          application.setAttribute("hm",hm);
      %>
      <c:forEach items="${hm}" var="kv">
          <%--${键值对.key} 获取键   ${键值对.value} 获取值   --%>
          <h2>${kv.key}--${kv.value}</h2>
      </c:forEach>
      

使用JSTL和EL输出购物车中的信息

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.hqyj.book_shop.util.Cart" %>
<%@ page import="com.hqyj.book_shop.entity.BookInfo" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }

            body {
                background-color: #f5f5f5;
            }

            .main {
                width: 1240px;
                height: 628px;
                margin: 20px auto 20px;
                background-color: #fff;
            }

            table {
                float: left;
                width: 600px;
                margin-top: 50px;
                margin-left: 320px;
                border-collapse: collapse;
            }

            th, td {
                width: 120px;
                height: 20px;
                border: 1px solid skyblue;
            }
        </style>
    </head>
    <body>
        <jsp:include page="top.jsp"></jsp:include>
        <div class="main">
            <table>
                <tr>
                    <th>图书编号</th>
                    <th>图书名称</th>
                    <th>图书单价</th>
                    <th>购买数量</th>
                    <th>小计</th>
                    <th>操作</th>
                </tr>
                <c:if test="${empty cart.getCart()}">
                    <tr>
                        <td colspan="6">当前购物车中无商品</td>
                    </tr>
                </c:if>
                <c:if test="${!empty cart.getCart()}">
                    <%--定义变量表示总合--%>
                    <c:set var="sumPrice" value="0"></c:set>
                    <c:forEach items="${cart.getCart()}" var="kv">
                        <tr>
                            <td>${kv.key.bookId}</td>
                            <td>${kv.key.bookName}</td>
                            <td>${kv.key.bookPrice}</td>
                            <td>${kv.value}</td>
                            <%--el中可以使用算术运算--%>
                            <td>${kv.key.bookPrice*kv.value}</td>
                            <td>
                                <a href="${pageContext.request.contextPath}book?op=remove&bookId=${kv.key.bookId}">移除</a>
                            </td>
                            <%--每次循环将小计累加到总价中--%>
                            <c:set var="sumPrice" value="${sumPrice + kv.key.bookPrice * kv.value}"></c:set>
                        </tr>
                    </c:forEach>
                    <tr>
                        <td colspan="4">总计</td>
                        <td>${sumPrice}</td>
                        <td><a href="${pageContext.request.contextPath}/book?op=clear">清空购物车</a></td>
                    </tr>
                </c:if>
            </table>
        </div>
    </body>
</html>

总结

   好好学习,天天向上。

在这里插入代码片
往期专栏
Java全栈开发
数据结构与算法
计算机组成原理
操作系统
数据库系统
物联网控制原理与技术
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值