• Jsp基础了解(一)


    JSP


    Jsp基础了解(二),点我去看看


    • 理解 JSP 及 JSP 原理
    • 能在 JSP中使用 EL表达式JSTL标签
    • 理解 MVC模式三层架构
    • 能完成品牌数据的增删改查功能

    1,JSP 概述

    JSP(全称:Java Server Pages):Java 服务端页面。 是一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,还可以定义 Java代码的动态内容,也就是 JSP = HTML + Java。如下就是jsp代码

    
        
            Title
        
        
            

    JSP,Hello World

    <% System.out.println("hello,jsp~"); %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上面代码 h1 标签内容是展示在页面上,而 Java 的输出语句是输出在 idea 的控制台。

    那么,JSP 能做什么呢?现在我们只用 servlet 实现功能,看存在什么问题。如下图所示,当我们登陆成功后,需要在页面上展示用户名

    上图的用户名是动态展示,也就是谁登陆就展示谁的用户名。只用 servlet 如何实现呢?在今天的资料里已经提供好了一个 LoginServlet ,该 servlet 就是实现这个功能的,现将资料中的 LoginServlet.java 拷贝到 request-demo 项目中来演示。接下来启动服务器并访问登陆页面

    输入了 zhangsan 用户的登陆信息后点击 登陆 按钮,就能看到如下图效果

    在这里插入图片描述

    当然如果是 lisi 登陆的,在该页面展示的就是 lisi,欢迎您,动态的展示效果就实现了。那么 LoginServlet 到底是如何实现的,我们看看它里面的内容

    上面的代码有大量使用到 writer 对象向页面写标签内容,这样我们的代码就显得很麻烦;将来如果展示的效果出现了问题,排错也显得有点力不从心。而 JSP 是如何解决这个问题的呢?在资料中也提供了一个 login.jsp 页面,该页面也能实现该功能,现将该页面拷贝到项目的 webapp下,需要修改 login.html 中表单数据提交的路径为下图

    在这里插入图片描述

    重新启动服务器并进行测试,发现也可以实现同样的功能。那么 login.jsp 又是如何实现的呢?那我们来看看 login.jsp 的代码

    在这里插入图片描述

    上面代码可以看到里面基本都是 HTML 标签,而动态数据使用 Java 代码进行展示;这样操作看起来要比用 servlet 实现要舒服很多。

    JSP 作用:简化开发,避免了在Servlet中直接输出HTML标签。

    2,JSP 快速入门

    接下来我们做一个简单的快速入门代码。

    2.1 搭建环境

    创建一个maven的 web 项目,项目结构如下:

    pom.xml 文件内容如下:

    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
    
        <groupId>org.examplegroupId>
        <artifactId>jsp-demoartifactId>
        <version>1.0-SNAPSHOTversion>
        <packaging>warpackaging>
    	
        <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
        properties>
    
        <dependencies>
          <dependency>
                <groupId>javax.servletgroupId>
                <artifactId>javax.servlet-apiartifactId>
                <version>3.1.0version>
                <scope>providedscope>
            dependency>
        dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.mavengroupId>
                    <artifactId>tomcat7-maven-pluginartifactId>
                    <version>2.2version>
                plugin>
            plugins>
        build>
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    2.2 导入 JSP 依赖

    dependencies 标签中导入 JSP 的依赖,如下

    <dependency>
        <groupId>javax.servlet.jspgroupId>
        <artifactId>jsp-apiartifactId>
        <version>2.2version>
        <scope>providedscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    该依赖的 scope 必须设置为 provided,因为 tomcat 中有这个jar包了,所以在打包时我们是不希望将该依赖打进到我们工程的war包中。

    2.3 创建 jsp 页面

    在项目的 webapp 下创建jsp页面

    通过上面方式创建一个名为 hello.jsp 的页面。

    2.4 编写代码

    hello.jsp 页面中书写 HTML 标签和 Java 代码,如下

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
        

    hello jsp

    <% System.out.println("hello,jsp~"); %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.5 测试

    启动服务器并在浏览器地址栏输入 http://localhost:8080/jsp-demo/hello.jsp,我们可以在页面上看到如下内容

    同时也可以看到在 idea 的控制台看到输出的 hello,jsp~ 内容。

    3,JSP 原理

    我们之前说 JSP 就是一个页面,那么在 JSP 中写 html 标签,我们能理解,但是为什么还可以写 Java 代码呢?

    因为 JSP 本质上就是一个 Servlet。 接下来我们聊聊访问jsp时的流程

    在这里插入图片描述

    1. 浏览器第一次访问 hello.jsp 页面
    2. tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlet
    3. tomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.class
    4. tomcat 会执行该字节码文件,向外提供服务

    我们可以到项目所在磁盘目录下找 target\tomcat\work\Tomcat\localhost\jsp-demo\org\apache\jsp 目录,而这个目录下就能看到转换后的 servlet

    在这里插入图片描述

    打开 hello_jsp.java 文件,来查看里面的代码

    由上面的类的继承关系可以看到继承了名为 HttpJspBase 这个类,那我们在看该类的继承关系。到资料中的找如下目录: 资料\tomcat源码\apache-tomcat-8.5.68-src\java\org\apache\jasper\runtime ,该目录下就有 HttpJspBase 类,查看该类的继承关系

    可以看到该类继承了 HttpServlet ;那么 hello_jsp 这个类就间接的继承了 HttpServlet ,也就说明 hello_jsp 是一个 servlet

    继续阅读 hello_jsp 类的代码,可以看到有一个名为 _jspService() 的方法,该方法就是每次访问 jsp 时自动执行的方法,和 servlet 中的 service 方法一样 。

    而在 _jspService() 方法中可以看到往浏览器写标签的代码:

    以前我们自己写 servlet 时,这部分代码是由我们自己来写,现在有了 jsp 后,由tomcat完成这部分功能。

    4,JSP 脚本

    JSP脚本用于在 JSP页面内定义 Java代码。在之前的入门案例中我们就在 JSP 页面定义的 Java 代码就是 JSP 脚本。

    4.1 JSP 脚本分类

    JSP 脚本有如下三个分类:

    • <%…%>:内容会直接放到_jspService()方法之中
    • <%=…%>:内容会放到out.print()中,作为out.print()的参数
    • <%!…%>:内容会放到_jspService()方法之外,被类直接包含

    代码演示:

    hello.jsp 中书写

    <%
        System.out.println("hello,jsp~");
        int i = 3;
    %>
    
    • 1
    • 2
    • 3
    • 4

    通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,i 变量定义在了 _jspService() 方法中

    hello.jsp 中书写

    <%="hello"%>
    <%=i%>
    
    • 1
    • 2

    通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,该脚本的内容被放在了 out.print() 中,作为参数

    hello.jsp 中书写

    <%!
        void  show(){}
    	String name = "zhangsan";
    %>
    
    • 1
    • 2
    • 3
    • 4

    通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,该脚本的内容被放在了成员位置

    4.2 案例

    4.2.1 需求

    使用JSP脚本展示品牌数据

    说明:

    • 在资料 资料\1. JSP案例素材 中提供了 brand.html 静态页面
    • 在该案例中数据不从数据库中查询,而是在 JSP 页面上写死
    4.2.2 实现
    • 将资料 资料\1. JSP案例素材 中的 Brand.java 文件放置到项目的 com.itheima.pojo 包下

    • 在项目的 webapp 中创建 brand.jsp ,并将 brand.html页面中的内容拷贝过来。brand.jsp 内容如下

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
      
          
          Title
      
      
      

      序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
      1 三只松鼠 三只松鼠 100 三只松鼠,好吃不上火 启用 修改 删除
      2 优衣库 优衣库 10 优衣库,服适人生 禁用 修改 删除
      3 小米 小米科技有限公司 1000 为发烧而生 启用 修改 删除
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55

      现在页面中的数据都是假数据。

    • brand.jsp 中准备一些数据

      <%
          // 查询数据库
          List brands = new ArrayList();
          brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
          brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
          brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
      %>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      注意: 这里的类是需要导包的,例:
      <%@ page import=“java.util.List” %>
      <%@ page import=“java.util.ArrayList” %>

    • brand.jsp 页面中的 table 标签中的数据改为动态的

      
          
          <%
           for (int i = 0; i < brands.size(); i++) {
               //获取集合中的 每一个 Brand 对象
               Brand brand = brands.get(i);
           }
          %>
          
      序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
      1 三只松鼠 三只松鼠 100 三只松鼠,好吃不上火 启用 修改 删除
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28

      上面的for循环需要将 tr 标签包裹起来,这样才能实现循环的效果,代码改进为

      
          
          <%
           for (int i = 0; i < brands.size(); i++) {
               //获取集合中的 每一个 Brand 对象
               Brand brand = brands.get(i);
          %>
          	 
          <%
           }
          %>
         
      
      序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
      1 三只松鼠 三只松鼠 100 三只松鼠,好吃不上火 启用 修改 删除
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31

      注意:<%%> 里面写的是 Java 代码,而外边写的是 HTML 标签

      上面代码中的 td 标签中的数据都需要是动态的,所以还需要改进

      
          
          <%
           for (int i = 0; i < brands.size(); i++) {
               //获取集合中的 每一个 Brand 对象
               Brand brand = brands.get(i);
          %>
          	 
          <%
           }
          %>
         
      
      序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
      <%=brand.getId()%> <%=brand.getBrandName()%> <%=brand.getCompanyName()%> <%=brand.getOrdered()%> <%=brand.getDescription()%> <%=brand.getStatus() == 1 ? "启用":"禁用"%> 修改 删除
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
    4.2.3 成品代码
    <%@ page import="com.itheima.pojo.Brand" %>
    <%@ page import="java.util.List" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    <%
        // 查询数据库
        List brands = new ArrayList();
        brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
        brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
        brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
    
    %>
    
    
    
    
    
        
        Title
    
    
    

    <% for (int i = 0; i < brands.size(); i++) { Brand brand = brands.get(i); %> <% } %>
    序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
    <%=brand.getId()%> <%=brand.getBrandName()%> <%=brand.getCompanyName()%> <%=brand.getOrdered()%> <%=brand.getDescription()%> <%=brand.getStatus() == 1 ? "启用":"禁用"%> 修改 删除
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    4.2.4 测试

    在浏览器地址栏输入 http://localhost:8080/jsp-demo/brand.jsp ,页面展示效果如下

    在这里插入图片描述

    4.3 JSP 缺点

    通过上面的案例,我们可以看到 JSP 的很多缺点。

    由于 JSP页面内,既可以定义 HTML 标签,又可以定义 Java代码,造成了以下问题:

    • 书写麻烦:特别是复杂的页面

      既要写 HTML 标签,还要写 Java 代码

    • 阅读麻烦

      上面案例的代码,相信你后期再看这段代码时还需要花费很长的时间去梳理

    • 复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE…

    • 占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存

    • 调试困难:出错后,需要找到自动生成的.java文件进行调试

    • 不利于团队协作:前端人员不会 Java,后端人员不精 HTML

      如果页面布局发生变化,前端工程师对静态页面进行修改,然后再交给后端工程师,由后端工程师再将该页面改为 JSP 页面

    由于上述的问题, JSP 已逐渐退出历史舞台, 以后开发更多的是使用 HTML + Ajax 来替代。Ajax 是我们后续会重点学习的技术。有个这个技术后,前端工程师负责前端页面开发,而后端工程师只负责前端代码开发。下来对技术的发展进行简单的说明

    在这里插入图片描述

    1. 第一阶段:使用 servlet 即实现逻辑代码编写,也对页面进行拼接。这种模式我们之前也接触过

    2. 第二阶段:随着技术的发展,出现了 JSP ,人们发现 JSP 使用起来比 Servlet 方便很多,但是还是要在 JSP 中嵌套 Java 代码,也不利于后期的维护

    3. 第三阶段:使用 Servlet 进行逻辑代码开发,而使用 JSP 进行数据展示

    在这里插入图片描述

    1. 第四阶段:使用 servlet 进行后端逻辑代码开发,而使用 HTML 进行数据展示。而这里面就存在问题,HTML 是静态页面,怎么进行动态数据展示呢?这就是 ajax 的作用了。

    那既然 JSP 已经逐渐的退出历史舞台,那我们为什么还要学习 JSP 呢?原因有两点:

    • 一些公司可能有些老项目还在用 JSP ,所以要求我们必须会 JSP
    • 我们如果不经历这些复杂的过程,就不能体现后面阶段开发的简单

    接下来我们来学习第三阶段,使用 EL表达式JSTL 标签库替换 JSP 中的 Java 代码。

    5,EL 表达式

    5.1 概述

    EL(全称Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。

    EL 表达式的主要作用是 获取数据。其实就是从域对象中获取数据,然后将数据展示在页面上。

    而 EL 表达式的语法也比较简单,${expression}
    例如:${brands} 就是获取域中存储的 key 为 brands 的数据。

    5.2 代码演示

    • 定义servlet,在 servlet 中封装一些数据并存储到 request 域对象中并转发到 el-demo.jsp 页面。

      @WebServlet("/demo1")
      public class ServletDemo1 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //1. 准备数据
              List<Brand> brands = new ArrayList<Brand>();
              brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
              brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
              brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
      
              //2. 存储到request域中
              request.setAttribute("brands",brands);
      
              //3. 转发到 el-demo.jsp
              request.getRequestDispatcher("/el-demo.jsp").forward(request,response);
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doGet(request, response);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      注意: 此处需要用转发,因为转发才可以使用 request 对象作为域对象进行数据共享

    • el-demo.jsp 中通过 EL表达式 获取数据

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          Title
      
      
          ${brands}
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 在浏览器的地址栏输入 http://localhost:8080/jsp-demo/demo1 ,页面效果如下:

      在这里插入图片描述

    5.3 域对象

    JavaWeb中有四大域对象,分别是:

    • page:当前页面有效
    • request:当前请求有效
    • session:当前会话有效
    • application:当前应用有效

    在这里插入图片描述

    ServletContext 域--- application
    ServletContext代表整个web应用的对象。
    生命周期:web应用被tomcat服务器加载时,ServletContext对象产生,生命周期开始。
    web应用被移除容器或者tomcat服务器关闭的时候,ServletContext对象销毁,生命周期结束。
    作用范围:整个web应用。
    主要功能:在整个web应用范围内共享数据。
    session 域---session
    Session代表整个会话的对象
    生命周期:当调用request.getSession()时,Session对象被创建。生命周期开始
    调用session.invalidate()方法销毁Session对象
    在设定的时间内,Session对象没有被使用,则Session对象被销毁。默认为30分钟
    当服务器意外关闭的时候,Session对象被销毁。当服务器正常关闭的时候,Session对象中仍有数据,会序列化到磁盘上形成一个文件,
    这个过程称之为钝化。在服务器再次启动的时候,这个文件会被重新读取到服务器中使用,这个过程称之为活化。
    作用范围:整个会话范围
    主要功能:在会话范围内共享数据
    request 域---request
    Request代表请求的对象
    生命周期:请求链开始,request对象被创建,请求链结束,request对象销毁。
    作用范围:整个请求链
    主要功能:在请求链内共享数据
    pageContext域---pageContext
    PageContext代表当前页面的对象
    生命周期:在访问jsp页面时,pageContext对象产生,生命周期开始。在结束访问jsp页面时,pageContext对象销毁,生命周期结束。
    作用范围:整个jsp页面
    主要功能:在整个jsp页面内共享数据

    el 表达式获取数据,会依次从这4个域中寻找,直到找到为止。而这四个域对象的作用范围如下图所示

    在这里插入图片描述

    例如: ${brands},el 表达式获取数据,会先从page域对象中获取数据,如果没有再到 requet 域对象中获取数据,如果再没有再到 session 域对象中获取,如果还没有才会到 application 中获取数据。

    6,JSTL标签

    6.1 概述

    JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码。如下代码就是JSTL标签

    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面代码看起来是不是比 JSP 中嵌套 Java 代码看起来舒服好了。而且前端工程师对标签是特别敏感的,他们看到这段代码是能看懂的。

    JSTL 提供了很多标签,如下图

    在这里插入图片描述

    我们只对两个最常用的标签进行讲解, 标签和 标签。

    JSTL 使用也是比较简单的,分为如下步骤:

    • 导入坐标

      <dependency>
          <groupId>jstlgroupId>
          <artifactId>jstlartifactId>
          <version>1.2version>
      dependency>
      <dependency>
          <groupId>taglibsgroupId>
          <artifactId>standardartifactId>
          <version>1.1.2version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 在JSP页面上引入JSTL标签库

      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
      
      • 1
    • 使用标签

    6.2 if 标签

    :相当于 if 判断

    • 属性:test,用于定义条件表达式
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码演示:

    • 定义一个 servlet ,在该 servlet 中向 request 域对象中添加 键是 status ,值为 1 的数据

      @WebServlet("/demo2")
      public class ServletDemo2 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //1. 存储数据到request域中
              request.setAttribute("status",1);
      
              //2. 转发到 jstl-if.jsp
              数据request.getRequestDispatcher("/jstl-if.jsp").forward(request,response);
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doGet(request, response);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
    • 定义 jstl-if.jsp 页面,在该页面使用 标签

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
      
          Title
      
      
          <%--
              c:if:来完成逻辑判断,替换java  if else
          --%>
          
              启用
          
      
          
              禁用
          
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      注意: 在该页面已经要引入 JSTL核心标签库

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

    6.3 forEach 标签

    :相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的 也有两种用法

    6.3.1 用法一

    类似于 Java 中的增强for循环。涉及到的 中的属性如下

    • items:被遍历的容器

    • var:遍历产生的临时变量

    • varStatus:遍历状态对象

    如下代码,是从域对象中获取名为 brands 数据,该数据是一个集合;遍历遍历,并给该集合中的每一个元素起名为 brand,是 Brand对象。在循环里面使用 EL表达式获取每一个Brand对象的属性值

    
        
            ${brand.id}
            ${brand.brandName}
            ${brand.companyName}
            ${brand.description}
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码演示:

    • servlet 还是使用之前的名为 ServletDemo1

    • 定义名为 jstl-foreach.jsp 页面,内容如下:

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
      
      
      
          
          Title
      
      
      

      <%----%>
      序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
      ${brand.id}${status.count} ${brand.brandName} ${brand.companyName} ${brand.ordered} ${brand.description} 启用 禁用 修改 删除
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
    6.3.2 用法二

    类似于 Java 中的普通for循环。涉及到的 中的属性如下

    • begin:开始数

    • end:结束数

    • step:步长

    实例代码:

    从0循环到10,变量名是 i ,每次自增1

    
        ${i}
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    adb shell执行定时2小时命令
    百度、阿里、腾讯、有道各平台翻译API申请教程
    1166 Summit – PAT甲级真题
    opencv相机校准和3D重建代码部分
    这才叫良心软件!
    go语言学习之旅之Go语言函数
    springmvc-day03
    测试人员的职业规划
    c/c++开发时的VsCode插件
    Hashmap 原理、源码、面试题(史上最全)
  • 原文地址:https://blog.csdn.net/m0_58730471/article/details/128167267