【JSP】

news2024/11/14 17:36:16

文章目录

  • 简介
  • Scriptlet脚本小程序
  • JSP的指令标签
    • include静态包含
    • include动态包含
      • 不传参
      • 传参
  • JSP的四大域对象
    • 四种属性范围
    • 验证属性范围的特点
  • EL表达式
    • 操作字符串
    • 操作集合
    • empty
  • JSTL
    • 条件动作标签
      • if标签
      • choose、when 和 otherwise 标签
    • 迭代标签
      • foreach
    • 格式化动作标签
      • formatNumber标签
      • formatDate标签
    • parseNumber标签
      • parseDate标签

简介

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

Scriptlet脚本小程序

如果你想在HTML中写Java代码,就需要将Java代码写入Scriptlet中,有三种写法:

  1. 定义局部变量、编写语句等:<%在这里写Java代码%>。生成的代码在servlet中的service方法体中
  2. 声明,声明全局变量、方法、类等:<%!在这里声明全局变量%>。生成的代码在servlet的类体中
  3. 输出表达式,可以输出变量或字面量:<%=数值%>。生成的代码在servlet中的service方法体中,相当于out.print()输出
<body>
    <%-- 第一种:Java脚本段,可以写Java代码,定义局部变量、编写语句等 --%>
    <%
        // 定义局部变量
        String str = "Hello Jsp";
        // 输出内容到控制台
        System.out.println(str);
        // 输出内容到浏览器
        out.print(str);
        out.write("------");
        // 输出全局变量
        out.write("全局变量:" + num);
        out.write("------");
    %>

    <%-- 第二种:声明,声明全局变量、方法、类等 --%>
    <%!
        // 声明全局变量
        int num = 10;
    %>

    <%-- 第三种:输出表达式,可以输出变量或字面量 --%>
    <%=str %>
</body>

JSP的指令标签

使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。

  1. 方法一:在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容
  2. 方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入

很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在 JSP 中如果要想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用 include 指令即可,动态包含则需要使用 include 动作标
签。

include静态包含

语法:<%@ include file="要包含的文件路径(注意:要写相对路径,不能为空,可以为表达式)" %>
现在我们建一个header.jsp:

<head>
    <title>头部</title>
</head>
<body>
    <h2>头部内容</h2>
    <%
        int num = 1;
    %>
</body>

再建一个footer.jsp:

<head>
    <title>底部</title>
</head>
<body>
    <h2>底部内容</h2>
    <%
        int a = 10;
    %>
</body>

把上面两个文件引入进来

<body>
    <%--
        include静态包含
            格式:
                <%@include file="要包含的页面地址"%>
            特点:
                1. 将内容进行了直接的替换
                2. 静态包含只会生成一个源码文件,最终的内容全部在_jspService方法体中(源码文件中)
                3. 不能出现同名变量
                4. 运行效率高一点点。耦合性较高,不够灵活。
    --%>
    <%@include file="04-header.jsp"%>
    <h2>主体内容</h2>
    <%
        int num = 1;// 在这里还是可以定义num
    %>
    <%@include file="04-footer.jsp"%>
</body>

静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在 servlet 引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起, 全部放到_jspService 方法中),所以只生成了一个 servlet,所以两个
页面不能有同名的变量。

include动态包含

动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用,可以传递参数。

不传参

语法:<jsp:include page="要包含的页面路径(注意:要写相对路径,不能为空,可以为表达式)"></jsp:include>
注意:当动态包含不需要传递参数时,include双标签之间不要有任何内容,包括换行和空格:<jsp:include page="要包含的页面路径">这里啥都别写</jsp:include>

<body>
    <%--
        include动态包含不传递参数
            格式:
                <jsp:include page="要包含的页面路径"></jsp:include>
            特点:
                1. 动态包含相当于方法的调用
                2. 动态包含会生成多个源码文件,包含3个会生成4个源码文件(加上自己就是4个嘛)
                3. 可以定义同名变量
                4. 效率高,耦合度低
    --%>
    <jsp:include page="04-header.jsp"></jsp:include>
    <h2>主体内容</h2>
    <%
        int a = 1;
    %>
    <jsp:include page="04-footer.jsp"></jsp:include>
</body>

传参

语法:

<jsp:include page="要包含的页面路径(注意:要写相对路径,不能为空,可以为表达式)">
	<jsp:param name="参数名" value="参数值"/>
</jsp:include>

注意:name属性不支持表达式,value属性支持表达式

<body>
    <%
        String str = "hello";
        String url = "04-footer.jsp";
    %>
    <%--page的值为表达式--%>
    <jsp:include page="<%=url%>">
        <jsp:param name="uname" value="admin"/>
        <%--value属性支持表达式--%>
        <jsp:param name="msg" value="<%=str%>"/>
    </jsp:include>
</body>

获取参数:request.getParameter(name); 通过指定参数名获取参数值,04-footer.jsp:

<body>
    <h2>底部内容</h2>
    <%
        int a = 10;

        // 获取动态包含传递的参数
        String uname = request.getParameter("uname");
        String msg = request.getParameter("msg");
        out.print(uname+","+msg);
    %>
</body>

一个页面可以被重复包含多次:

<body>
    <jsp:include page="04-footer.jsp"></jsp:include>
    <jsp:include page="04-footer.jsp"></jsp:include>
</body>

JSP的四大域对象

四种属性范围

在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以在多少个页面中保存并继续使用

  1. page范围
  2. pageContext : 只在一个页面中保存属性,跳转之后无效
  3. request范围
    request : 只在一次请求中保存,服务器跳转后依然有效,客户端跳转失效
  4. session范围
    session : 在一次会话范围中,无论何种跳转都可以使用,只要session对象不销毁
  5. application范围
    application : 在整个服务器上保存,只要服务器不关闭,他就一直有效
方法类型描述
public void setAttribute(String name, Object o)普通设置属性的名称及内容
public Object getAttribute(String name)普通根据属性名称取属性
public void removeAttribute(String name)普通删除指定的属性

验证属性范围的特点

  1. page:本页面可以取得数据,服务器端跳转(<jsp:forward page="跳转的页面地址"></jsp:forward>)后无效
  2. request:服务器跳转有效,客户端跳转(超链接跳转)无效
    如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了;如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围。
  3. session:无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中,并在相关的页面取得。
    对于服务器而言,每一个连接到它的客户端都是一个session
    如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application
  4. application:所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得。只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置

注意:使用哪个范围在合理范围尽可能小,因为范围越大,损耗的资源越多

测试jsp中服务端跳转,新建06-JSP的四大域对象.jsp,在其中设置域对象:

<body>
    <%
        //  设置page范围的域对象
        pageContext.setAttribute("name1","zhangsan");
        //  设置request范围的域对象
        request.setAttribute("name2","lisi");
        //  设置session范围的域对象
        session.setAttribute("name3","wangwu");
        //  设置application范围的域对象
        application.setAttribute("name4","zhaoliu");
    %>

    <%-- jsp中服务端跳转 --%>
    <%--<jsp:forward page="06-JSP的四大域对象-02.jsp"></jsp:forward>--%>
</body>

在以上页面启动服务器,会自动跳转到06-JSP的四大域对象-02.jsp页面,该页面内容如下:

<body>
    <%
        // 获取域对象中的值
        out.print("page范围:" + pageContext.getAttribute("name1") + "<br>");
        out.print("request范围:" + request.getAttribute("name2") + "<br>");
        out.print("session范围:" + session.getAttribute("name3") + "<br>");
        out.print("application范围:" + application.getAttribute("name4") + "<br>");
    %>
</body>

06-JSP的四大域对象-02.jsp页面获取到的内容如下,因为页面做了跳转,所以page范围的域对象获取不到
在这里插入图片描述
如果使用客户端跳转,06-JSP的四大域对象.jsp中跳转方式改为超链接:

<body>
	<%
        //  设置page范围的域对象
        pageContext.setAttribute("name1","zhangsan");
        //  设置request范围的域对象
        request.setAttribute("name2","lisi");
        //  设置session范围的域对象
        session.setAttribute("name3","wangwu");
        //  设置application范围的域对象
        application.setAttribute("name4","zhaoliu");
    %>
    
    <%-- 超链接跳转--%>
    <a href="06-JSP的四大域对象-02.jsp">跳转</a>
</body>

06-JSP的四大域对象.jsp页面启动服务器,点击页面超链接,会自动跳转到06-JSP的四大域对象-02.jsp页面,获取到的内容如下,因为是超链接跳转,所以获取不到session范围的域对象
在这里插入图片描述
关闭浏览器,然后打开浏览器,在URL中输入地址,得到的数据如下,因为关闭了浏览器嘛,所以获取不到session范围的域对象
在这里插入图片描述

EL表达式

在这里插入图片描述

操作字符串

<body>
    <%--
        EL表达式
        作用:
            简化JSP代码
        格式:
            ${域对象的名称}
        操作对象:
            EL表达式一般操作的是域对象,不能操作局部变量。
        操作范围:
            page范围
                在当前页面
            request范围
                在一次请求
            session范围
                在一次会话
            application范围
                在整个应用程序
        注:
            1. 如果el表达式获取域对象的值为空,默认显示空字符串
            2. el表达式默认从小到大范围去找,找到即可,如果四个范围都未找到,则显示空字符串
    --%>

    <%-- 设置数据 --%>
    <%
        pageContext.setAttribute("uname","zhangsan"); // page作用域
        request.setAttribute("uname","lisi"); // request作用域
        session.setAttribute("uname","wangwu"); // session作用域
        application.setAttribute("uname","zaholiu"); // application

        // 定义局部变量
        String str = "Hello";
    %>
    
    <%-- 获取数据 --%>
    获取局部变量:${str} <br>
    获取域对象:${uname} <br>
</body>

显然获取不到局部变量,显示空字符串。每个域中都定义了uname,但是取的是page作用域的值,因为他是从小到大取:
在这里插入图片描述
查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope,requestScope, sessionScope, applicationScope

<body>
    <%-- 设置数据 --%>
    <%
        pageContext.setAttribute("uname","zhangsan"); // page作用域
        request.setAttribute("uname","lisi"); // request作用域
        session.setAttribute("uname","wangwu"); // session作用域
        application.setAttribute("uname","zaholiu"); // application
    %>
    获取指定范围的域对象:<br>
    &nbsp;&nbsp;page范围:${pageScope.uname}<br>
    &nbsp;&nbsp;request范围:${requestScope.uname}<br>
    &nbsp;&nbsp;session范围:${sessionScope.uname}<br>
    &nbsp;&nbsp;application范围:${applicationScope.uname}<br>
</body>

获取结果:
在这里插入图片描述

操作集合

<body>
    <%--
        EL表达式的使用
            获取List
                获取List的size  ${list.size()}
                获取List的指定下标的值    ${list[下标]}
                注:list代表的是限域变量名,即存在域对象中的一个变量名
            获取Map
                获取Map中指定key的value   ${map.key} 或 ${map["key"]}
                注:map代表的是限域变量名
            获取JavaBean对象
                获取JavaBean中的属性
                    ${javaBean.属性名} 或 ${JavaBean对象.get属性名()}
                注:JavaBean中的属性字段必须提供get方法

    --%>
    <%
        // List
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        request.setAttribute("list", list);

        // Map
        Map map = new HashMap();
        map.put("aaa", "111");
        map.put("bbb", 2222);
        map.put("ccc-a", 333);
        request.setAttribute("map", map);

        // JavaBean对象
        User user = new User();
        user.setUserId(1);
        user.setUname("zhangsan");
        user.setUpwd("123456");
        request.setAttribute("user",user);

    %>
<h4>获取List</h4>
获取List的size:${list.size()} <br>
获取List的指定下标的值:${list[1]} <br>
<h4>获取Map</h4>
获取Map指定key的value值:${map.aaa} -- ${map["bbb"]}
<h4>获取JavaBean对象</h4>
获取JavaBean对象:${user}<br>
获取JavaBean中的属性:${user.uname} -- ${user.getUpwd()}
</body>

在这里插入图片描述

empty

<body>
    <%--
        EL表达式的使用
            empty
                判断域对象是否为空
                    为空,返回true;
                    不为空,返回false;
                如果域对象是字符串:
                    不存在的域对象:true
                    空字符串:true
                    null:true
                如果域对象是List:
                    null:true
                    没有长度的List(size):true
                如果域对象是Map:
                    null:true
                    空map对象:true
                如果域对象是Javabean对象:
                    null:true
                    空对象:false
            判断域对象不为空
                ${!empty 限域变量名}

         比较两个值是否相等,返回true或false
               ==  或  eq

    --%>
    <%
        // 字符串
        request.setAttribute("str1","abc");
        request.setAttribute("str2","");
        request.setAttribute("str3",null);
        // List
        List list1 = new ArrayList<>();
        List list2 = null;
        List list3 = new ArrayList<>();
        list3.add(1);
        request.setAttribute("list1",list1);
        request.setAttribute("list2",list2);
        request.setAttribute("list3",list3);
        // Map
        Map map1 = null;
        Map map2 = new HashMap<>();
        Map map3 = new HashMap<>();
        map3.put(1,2);
        request.setAttribute("map1",map1);
        request.setAttribute("map2",map2);
        request.setAttribute("map3",map3);
        // JavaBean
        User user1 = null;
        User user2 = new User();
        User user3 = new User();
        user3.setUserId(1);
        request.setAttribute("user1",user1);
        request.setAttribute("user2",user2);
        request.setAttribute("user3",user3);
    %>

<div>判断字符串是否存在</div>
${empty str} <br>
${empty str1} <br>
${empty str2} <br>
${empty str3} <br>
<hr>
<div>判断List是否为空</div>
${empty list1} <br>
${empty list2} <br>
${empty list3} <br>
<hr>
<div>Map</div>
${empty map1} <br>
${empty map2} <br>
${empty map3} <br>
<div>JavaBean对象</div>
${empty user1} <br>
${empty user2} <br>
${empty user3} <br>
<hr>
<%
    request.setAttribute("a", 10);
    request.setAttribute("b", 2);
    request.setAttribute("c", "aa");
    request.setAttribute("d", "bb");

%>
<%--
    比较两个值是否相等,返回true或false
        ==  或  eq
--%>
${a == b }
${c == d }
${c eq d }
${a == 5 }
${c == 'aa' }
<hr>
<%--
    加法: +
    减法: -
    乘法: *
    除法:	/ 或 div

	如果写${a} + {b}则表示取a的值和b的值拼在一起,字符串拼接,为102
--%>
${a + b }
${a / b } 或 ${a div b }
<hr>
<%--
    大于:>
    小于:<
    大于等于:>=
    小于等于:<=
--%>
${a > b}
${a + 1 > 10 }
${a + b >= 10 }
${a > b && b > 5 }
${a + b > 10 || a - b > 5 }
</body>

请添加图片描述

JSTL

一、Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。一共有五个,本文只介绍两个常用的:

  1. 核心标签库:http://java.sun.com/jsp/jstl/core。
    包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
  2. 格式化标签库:http://java.sun.com/jsp/jstl/fmt
    用来格式化显示数据的工作,比如:对不同区域的日期格式化等。

二、使用:

  1. 为了在JSP页面使用JSTL类库,必须以下列格式使用taglib指令:<%@taglib uri="库地址,如核心标签库地址/格式化标签库地址" prefix="该标签的别名" %>
  2. 导入两个jar包:
    请添加图片描述
    官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/。下载 jakarta-taglibs-standard-1.1.2.zip包并解压,将jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:standard.jar和jstl.jar文件拷贝到项目的指定目录下。
  3. 使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 通过taglib标签引入所需要的标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>JSTL的使用</title>
    <%--
        JSTL的使用
            1. 下载JSTL所需要的jar包 (standard.jar 和 jstl.jar)
            2. 在项目的web目录下的WEB-INF中新建lib目录,将jar拷贝进去
            3. 选择"File",再选择"Project Structure"
            4. 选择"Modules",选择右侧的"Dependencies",选择右侧的"+"号,将对应的lib目录加载进来
            5. 在需要使用标签库的JSP页面通过taglib标签引入指定库
    --%>
</head>
<body>
    <c:if test="${1==1}">
        Hello JSTL
    </c:if>
</body>
</html>

三、条件动作标签、迭代动作标签、可视化动作标签操作的都是域对象,即都是从域对象中取值然后操作
四、标签中可以写html代码

条件动作标签

条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在 Java 中是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标签可以执行条件式动作指令:if、 choose、when 和 otherwise。

if标签

一、if 标签先对某个条件进行测试,如果该条件运算结果为 true, 则处理它的主体内容,测试结果保存在一个 Boolean 对象中,并创建一个限域变量来引用 Boolean 对象。可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。
二、语法:

<c:if test="<boolean>" var="<string>" scope="<string>">
     ...
</c:if>

三、属性:

属性描述是否必要默认值
test条件
var用于存储条件结果的变量(限域变量名)
scopevar属性的作用域 可取值:pagerequestsession

四、使用:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>if 标签</title>
</head>
<body>
    <%--
        if 标签
            格式:
                <c:if test="<boolean>" var="<string>" scope="<string>">
                   ...
                </c:if>
             常用属性:
                test:条件判断,操作的是域对象,接收返回结果是boolean类型的值 (必要属性)
                var:限域变量名(存放在作用域中的变量名),用来接收判断结果的值(可选属性)
                scope:限域变量名的范围(page、request、session、application)(可选属性)
             注:
                1. 标签操作的一般都是域对象
                2. if标签标签没有else,如果想要else的效果,就需要设置两个完全相反的条件
    --%>
    <%
        // 设置数据
        request.setAttribute("num",0);

    %>
    <c:if test="${num > 0}" >
        数值大于0
    </c:if>
    <c:if test="${num <= 0}">
        数值不大于0
    </c:if>
    <br>
    
    <%--将num > 100的判断结果放在request域的flag变量中--%>
    <c:if test="${num > 100}" var="flag" scope="request"></c:if>
    <%--取值的时候会先去page作用域取,取不到会去request域中取,所以这里只写了flag,如果你page中也有个flag,那么request.不能像下面这样省略--%>
    ${flag}-- ${requestScope.flag} -- ${sessionScope.flag}
</body>

五、一般情况下是在后台的servlet中设置数据,然后跳转前台页面,然后在前台页面中取值,本文为了方便,直接在jsp中写了java代码,正常情况下一定是在后台写Java代码,然后跳转到前台,然后前台获取数据

choose、when 和 otherwise 标签

一、choose和when标签的作用与Java中的switch和case关键字相似,用于在众多选项中做出选择。也就是说,他们为相互排斥的条件式执行提供相关内容。 switch语句中有case,而choose标签中对应有when,switch语句中有default,而choose标签中有otherwise。
二、语法:

<c:choose>
      <c:when test="<boolean>">
...
      </c:when>
      <c:when test="<boolean>">
...
	  </c:when>
      ...
      ...
      <c:otherwise>
...
      </c:otherwise>
</c:choose>

三、属性:

  1. choose标签没有属性。
  2. when标签只有一个test属性。
  3. otherwise标签没有属性。

四、使用:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>choose、when 和 otherwise 标签</title>
</head>
<body>
    <%--
        choose、when 和 otherwise 标签
            格式:
                <c:choose>
                    <c:when test="<boolean>">
                        ...
                    </c:when>
                    <c:when test="<boolean>">
                        ...
                    </c:when>
                    ...
                    ...
                    <c:otherwise>
                        ...
                    </c:otherwise>
                </c:choose>
            属性:
                1. choose标签没有属性
                2. when标签只有一个test属性,必须属性
                3. otherwise标签没有属性
            注意:
                1. choose标签和otherwise标签没有属性,而when标签必须有一个test属性
                2. choose标签中必须包含至少一个when标签,可以没有otherwise标签 (Illegal "choose" without child "when" tag)
                3. otherwise标签必须设置在最后一个when标签之后 (Illegal "c:when" after "c:otherwise" tag in "c:choose" tag.)
                4. choose标签中只能设置when标签与otherwise标签(Illegal child tag in "c:choose" tag: "c:if" tag)
                5. when标签和otherwise标签中可以嵌套其他标签
                6. otherwise标签会在所有的when标签不执行时才会执行
    --%>
    <%
        request.setAttribute("score",90);
    %>
    <c:choose>

        <c:when test="${score < 60}">
            <h2>你个小渣渣!</h2>
        </c:when>
        <c:when test="${score == 60}">
            <h2>分不在高,及格就行!</h2>
            <c:if test="${1==1}">111</c:if>
        </c:when>
        <c:when test="${score > 60 && score < 80}">
            <h2>哎哟不错哦!</h2>
        </c:when>
        <c:otherwise>
            <h2>你很棒棒哦!</h2>
            <c:if test="${1==1}">111</c:if>
        </c:otherwise>
    </c:choose>
</body>
</html>

迭代标签

forEach是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可以迭代 java.util.Iterator 和 java.util.Enumeration,但不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者 Enumeration 都不能重置(reset)。

foreach

一、语法:

<c:forEach
      items="<object>"
      begin="<int>"
      end="<int>"
      step="<int>"
      var="<string>"
      varStatus="<string>">
</c:forEach>

二、属性

属性描述是否必要默认值
items要被循环的数据
begin开始的元素(0=第一个元素,1=第二个元素) end 最后一个元素(0=第一个元素,1=第二个元素) step 每一次迭代的步长0
end最后一个元素(0=第一个元素,1=第二个元素)Last element
step每一次迭代的步长1
var代表当前条目的变量名称
varStatus代表循环状态的变量名称

三、forEach varStatus属性

  1. index: 当前这次迭代从 0 开始的迭代索引
  2. count: 当前这次迭代从 1 开始的迭代计数
  3. first: 用来表明当前这轮迭代是否为第一次迭代的标志
  4. last: 用来表明当前这轮迭代是否为最后一次迭代的标志
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.xxxx.po.User" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Lisa Li
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>forEach标签</title>
</head>
<body>
    <%--
        forEach标签
            格式:
                <c:forEach
                    items="<object>"
                    begin="<int>"
                    end="<int>"
                    step="<int>"
                    var="<string>"
                    varStatus="<string>">
                </c:forEach>

            属性:
                begin:开始数
                end:结束数
                step:间隔数
                var:限域变量名,用来接收当前遍历的成员
                items:要循环的数据(数组、List、Map等)

            forEach varStatus 属性
                index: 当前这次迭代从 0 开始的迭代索引
                count: 当前这次迭代从 1 开始的迭代计数
                first: 用来表明当前这轮迭代是否为第一次迭代的标志
                last: 用来表明当前这轮迭代是否为最后一次迭代的标志

            1. 迭代主体内容多次
                <c:forEach begin="开始数" end="结束数" step="间隔数" var="限域变量名">
                </c:forEach>
                相当于Java中for...int
                for (int i = 0; i < 10; i++) {
                }

            2. 循环
                <c:forEach items="要被循环的数据" var="限域变量名">
                </c:forEach>
                相当于Java中的foreach
                for(String str : list) {
                }
    --%>

    <%-- 迭代主体内容多次 --%>
    <c:forEach var="i" begin="1" end="10" step="2">
        ${i} &nbsp;
    </c:forEach>
    <hr>
    <%-- 循环 --%>
    <%
        List<String> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list.add("A:" + i);
        }
        pageContext.setAttribute("li", list);
    %>
    <c:forEach items="${li}" var="item">
        ${item} &nbsp;
    </c:forEach>
    <hr>
    <table align="center" width="800" border="1" style="border-collapse: collapse;">
        <tr>
            <th>名称</th>
            <th>当前成员下标</th>
            <th>当前成员循环数</th>
            <th>是否第一次被循环</th>
            <th>是否最后一次被循环</th>
        </tr>
        <c:forEach items="${li}" var="item" varStatus="itemp">
            <tr>
                <td>${item}</td>
                <td>${itemp.index}</td>
                <td>${itemp.count}</td>
                <td>${itemp.first}</td>
                <td>${itemp.last}</td>
            </tr>
        </c:forEach>
    </table>
    <hr>
    <%-- 循环对象集合 --%>
    <%
        List<User> userList = new ArrayList<User>();
        User user = new User(1,"zhangsan","123456");
        User user2 = new User(2,"lisi","123321");
        User user3 = new User(3,"wangwu","654321");
        userList.add(user);
        userList.add(user2);
        userList.add(user3);
        // 将数据设置到作用域中
        request.setAttribute("userList", userList);
    %>
    <%-- 判断集合是否为空 --%>
    <c:if test="${!empty userList}">
        <%-- 当集合不为空时,遍历集合 --%>
        <table align="center" width="800" border="1" style="border-collapse: collapse;">
            <tr>
                <th>用户编号</th>
                <th>用户名称</th>
                <th>用户密码</th>
                <th>用户操作</th>
            </tr>
            <c:forEach items="${userList}" var="user">
                <tr align="center">
                    <td>${user.userId}</td>
                    <td>${user.uname}</td>
                    <td>${user.upwd}</td>
                    <td><button>修改</button></td>
                </tr>
            </c:forEach>
        </table>
    </c:if>

    <%-- 循环Map --%>
    <%
        Map<String,Object> map = new HashMap<>();
        map.put("map1", "aaa");
        map.put("map2", "bbb");
        map.put("map3", "ccc");
        pageContext.setAttribute("map", map);
    %>
    <c:forEach items="${map}" var="m">
        key:${m.key} &nbsp; value:${m.value} <br>
    </c:forEach>
</body>
</html>

请添加图片描述

格式化动作标签

JSTL 提供了格式化和解析数字和日期的标签,我们讨论里面有:formatNumber、formatDate、parseNumber及
parseDate。

formatNumber标签

一、formatNumber标签用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字。(将数值型数据转 换成指定格式的字符串类型。)
二、语法:

  <fmt:formatNumber
    value="<string>"
    type="<string>"
    var="<string>"
    scope="<string>"/>

三、属性

属性描述是否必要默认值
value要显示的数字
typeNUMBER,CURRENCY,或 PERCENT类型
var存储格式化数字的变量Print to page
scopevar属性的作用域page

如果不设定var,会将格式化的结果直接输出,如果设定了var,他不会直接暑促,需要你单独取var,如果你有很多地方都需要用格式化的结果,那么就用var接收一下,哪里要用,就在哪里取var,如果只使用一次,那就不用var接收,直接输出
四、注意:

  1. 如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名
  2. 默认的类型(type)的取值为number。可取值:number数值型、percent百分比类型、currency货币型

五、使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入格式化标签库 --%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>格式化动作标签</title>
</head>
<body>
    <%--
        格式化动作标签
            formatNumber标签
                将数值型转化成指定格式的字符串
                语法格式:
                    <fmt:formatNumber
                      value="<string>"
                      type="<string>"
                      var="<string>"
                      scope="<string>"/>
                常用属性:
                    value:要格式化的数值
                    type:要格式化的类型
                        number 数值型 (默认)
                        percent 百分比类型
                        currency 货币类型
                    var:限域变量名,用来接收格式化后的结果
                    scope:var属性的范围 (page|request|session|apllication)

                注:
                    1. 如果使用了var属性,标签不会输出结果,需要通过el表达式获取
                    2. 默认的类型(type)的取值为number
    --%>
    <fmt:formatNumber value="10" type="number" var="num" /> ${num } <br>
    <fmt:formatNumber value="10" type="percent"  />  <br>
    <fmt:formatNumber value="10" type="currency"  />  <br>
    <!-- 设置时区  -->
    <fmt:setLocale value="en_US"/>
    <fmt:formatNumber value="10" type="currency"  />  <br>
</body>
</html>

formatDate标签

一、formatDate标签用于使用不同的方式格式化日期。(将Date型数据转换成指定格式的字符串类型。)
二、语法:

<fmt:formatDate
  value="<string>"
  type="<string>"
  dateStyle="<string>"
  timeStyle="<string>"
  pattern="<string>"
  timeZone="<string>"
  var="<string>"
  scope="<string>"/>

三、属性

属性描述是否必要默认值
value要显示的日期
typeDATE, TIME, 或 BOTHdate
dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
pattern自定义格式模式
timeZone显示日期的时区默认时区
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面

四、标签格式模式
请添加图片描述
五、使用

<body>
    <%--
            formatDate标签
                将Date型的数据转化成指定格式的字符串
                语法格式:
                    <fmt:formatDate
                      value="<string>"
                      type="<string>"
                      dateStyle="<string>"
                      timeStyle="<string>"
                      pattern="<string>"
                      timeZone="<string>"
                      var="<string>"
                      scope="<string>"/>
                常用属性:
                    value:要格式化的日期
                    type:格式化的类型
                        date 日期型  年月日
                        time 时间型  时分秒
                        both 日期时间型
                    dateStyle:日期格式
                    timeStyle:日期时间
                    pattern:自定义模式
                        y M d H m s
                    timeZone
                    var
                    scope
    --%>
    <%-- 格式化日期 --%>
    <%
        request.setAttribute("myDate",new Date());
    %>
    ${myDate} <br>
    <fmt:formatDate value="${myDate}" /> <br>
    <fmt:formatDate value="${myDate}" type="date" /> <br>
    <fmt:formatDate value="${myDate}" type="time" /> <br>
    <fmt:formatDate value="${myDate}" type="both" /> <br>
    <fmt:formatDate value="${myDate}" type="both" dateStyle="FULL" /> <br>
    <fmt:formatDate value="${myDate}" type="both" timeStyle="short" /> <br>
    <fmt:formatDate value="${myDate}" pattern="yyyy-MM-dd" /> <br>
</body>

parseNumber标签

一、parseNumber标签用来解析数字,百分数,货币。即将指定格式的数值字符串转化成数值型。(parseNumber 标签可以将数字、货币或百分比类型的字符串转换成数值型。)
二、语法:

  <fmt:parseNumber
    value="<string>"
    type="<string>"
    var="<string>"
    scope="<string>"/>

三、属性

属性描述是否必要默认值
value要解析的数字Body
typeNUMBER,,CURRENCY,或 PERCENTnumber
var存储待解析数字的变量Print to page
timeStylevar属性的作用域page

四、使用

<body>
    <fmt:setLocale value="zh_CN"/>
    <fmt:parseNumber value="100"  /> <br>
    <fmt:parseNumber value="100"  type="number" /> <br>
    <fmt:parseNumber value="100%"  type="percent" /> <br>
    <fmt:parseNumber value="¥10.00"  type="currency" /> <br>
    <hr>
    <fmt:parseDate value="2020-01-06" type="date" /> <br>
    <fmt:parseDate value="2020/01/06" pattern="yyyy/MM/dd" />
</body>

parseDate标签

一、parseDate标签用于解析日期。即将指定格式(日期型)的字符串转换成Date类型。
二、语法:

  <fmt:parseDate
     value="<string>"
     type="<string>"
     dateStyle="<string>"
     timeStyle="<string>"
     pattern="<string>"
     var="<string>"
     scope="<string>"/>

三、属性
请添加图片描述

<body>
    <fmt:parseDate value="2020-01-06" type="date" /> <br>
    <%-- 默认日期格式是上面那一行那种:2020-01-06,下面这一行这种用/分隔的识别不出来,所以需要用pattern指定日期格式 --%>
    <fmt:parseDate value="2020/01/06" pattern="yyyy/MM/dd" /> 
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NProgress 进度条的使用方法

安装NProgress 进度条 npm install nprogress --save-dev 在vue项目中mian.js中或router.js或axios.js&#xff1a; import NProgress from nprogress import nprogress/nprogress.css 使用NProgress进度条 NProgress.start(); &#xff1a;进度条开始&#xff1b; NProgr…

GCD和LCM

目录 一 整除 定义 性质 二 GCD 1&#xff09;定义 2&#xff09;性质 3&#xff09;GCD编程 ①暴力法 ②欧几里得算法 ③更相减损术 ④Stein算法 三 LCM ①暴力法 ②最大公约数法 四 裴蜀定理 例题&#xff1a;裴蜀定理 一 整除 定义 a 能整除b,记为 a|b。其…

你还会想起这道题吗

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 原神是由米哈游自主研发的一款全新开放世界冒险游戏。游戏发生在一个被称作「提瓦特」的幻想世界&#xff0c;在这里&#xff0c;被神选中的人将被授予「神之眼」&#xff0c;导引元…

m基于神经网络的气候预测matlab仿真,气候数据采用的BoM气候数据,神经网络为matlab编程实现不使用工具箱函数

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工神经网络&#xff08;Artificial Neural Networks&#xff0c;简写为ANNs&#xff09;也简称为神经网络&#xff08;NNs&#xff09;或称作连接模型&#xff08;Connection Model&#xff09…

UICollectionView 实际使用

一. 使用UICollectionView制作书架 我想的书架是那种每一排都可以滑动的。暂时的想法是使用两个collectionView&#xff0c;第一个collectionView布置书架的每一排&#xff0c;第二个布置每一排内部的书。 布置外部的colletionView&#xff0c;这部分很简单&#xff0c;item的…

[ 数据结构 -- 手撕排序算法第五篇 ] 堆排序

文章目录前言一、常见的排序算法二、堆的概念及结构三、堆的实现3.1 堆的插入3.2 堆的删除四、堆排序4.1 向上调整建堆4.2 向下调整建堆4.3 建堆的时间复杂度4.4 堆排序五、堆排序的特性前言 手撕排序算法第五篇&#xff1a;堆排序&#xff01; 从本篇文章开始&#xff0c;我会…

Java+JSP超市管理系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术后台框架&#xff1a;Servlet、JSP、JDBC、UI界面&#xff1a;BootStrap、jQuery、数据库&#xff1a;MySQL 系统功能 该系统共包含两种角色&#xff1a;员工和管理员。系统的主要功能模块如下&#xff1a; 1.系统管理 系统登陆、系统退出、修改…

《Mysql是怎样运行的》补充

19 第19章 从猫爷被杀说起-事务简介 19.1 事务的起源 19.1.1 原子性&#xff08;Atomicity&#xff09; 19.1.2 隔离性&#xff08;Isolation&#xff09; 其它的状态转换不会影响到本次状态转换&#xff0c;这个规则被称之为 隔离性 19.1.3 一致性&#xff08;Consisten…

[ISITDTU 2019]EasyPHP rce替换字母

<?php highlight_file(__FILE__);$_ $_GET[_]; if ( preg_match(/[\x00- 0-9\"$&.,|[{_defgops\x7F]/i, $_) )die(ros will not do it);if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )die(you are so close, omg);eval($_); ?> 打开界面有两个i…

Mysql分布式锁(四)乐观锁实现并发

文章目录CAS - Compare And Swap业务改造1. 表结构新增version列2. 修改代码3. 测试问题1. 高并发情况下&#xff0c;性能极低2. ABA问题3. 读写分离情况下导致乐观锁不可靠CAS - Compare And Swap 先比较再交换&#xff0c;一般通过时间戳或者version版本号。 举例&#xff1…

【审计思路】如何快速定位SQLMS注入漏洞?

0x00 前言 MCMS是政府、教育等其他行业常用的CMS&#xff0c;应用广泛&#xff0c;但是底层的代码中仍然遗留不少的问题。这篇文章主要针对SQL注入进行审计并探讨如何快速定位SQL注入漏洞&#xff0c;以及其他工具的应用。 MCMS&#xff0c;是完整开源的Java CMS&#xff01;基…

[ vulhub漏洞复现篇 ] Apache Airflow Celery 消息中间件命令执行漏洞复现 CVE-2020-11981

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

基于asp.net企业网上办公自动化系统-计算机毕业设计

企业网上办公自动化通过对各办公自动化要素的闭环整合&#xff0c;实现了工作流、信息流、知识流和办公自动化系统的整合管理&#xff0c;提供了一个科学、开放、先进的信息化办公平台&#xff0c;实现办公自动化&#xff0c;并进行远程办公或在家办公。企业网上办公自动化将人…

redis开启二级缓存

目录 1. redis集成 2. pom.xml加入redis缓存支持 3. 在项目配置文件中加入cache配置 4. 在启动类开发缓存功能 5. 需要缓存的实体对象实现序列化接口 6. 缓存的使用 7. 测试 今天与大家分享&#xff0c;redis二级缓存实现案例。如有问题&#xff0c;望指教。 1. redis集…

计算机毕业设计springboot+vue基本微信小程序的校园二手物品交易平台系统

项目介绍 目的:设计一个同学们能自由发布和浏览求购或卖出商品信息的校园二手交易小程序,解决信息的不流通以及传统二手商品信息交流方式的笨拙等问题。 意义:在大学校园里,存在着很多的二手商品,但是由于信息资源的不流通以及传统二手商品信息交流方式的笨拙,导致了很多仍然具…

十年阿里测试工程师浅谈UnitTest单元测试框架

一、UnitTest单元测试框架提供了那些功能 1.提供用例组织和执行 如何定义一条“测试用例”? 如何灵活地控制这些“测试用例”的执行? 2.提供丰定的断言方法 当测试用例的执行结果与预期结果不一致时&#xff0c;判定测试用例失败。在自动化测试中&#xff0c;通过“断言”…

2022 软件测试简答题【太原理工大学】

四、简答题 1. 比较自顶向下集成测试方法和自底向上集成测试方法各自的优缺点。 ① 自顶向下集成 优点&#xff1a;较早地验证了主要控制和判断点:按深度优先可以首先实现和验证一个完整的软件功能;功能较早证实&#xff0c;带来信心;只需一个驱动&#xff0c;减少驱动器开发…

python+pyqt5设置窗体图标和任务栏图标及窗体标题的方法

本次设置窗体标题只用了一种方法&#xff0c;在进行窗体实例化后window Window()&#xff0c;使用setWindowTitle(str)命令&#xff0c;在主程序中的设置命令如下所示&#xff1a; if __name__ __main__:QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #Qt从5.6.0开…

机器学习——05线性回归

机器学习——05线性回归 参考资料 AIlearningMachine-Learning-in-Action庞善民.西安交通大学机器学习导论2022春PPT 使用Jupyter进行练习&#xff0c;python3 具体项目地址&#xff1a;https://github.com/yijunquan-afk/machine-learning/tree/master/basic-learn/05-reg…

ARM S5PV210 X210 刷机教程总结

前言 S5PV210 X210 开发板外观介绍 一、开发板刷系统1 1. 什么是刷系统 刷系统就是利用刷机工具&#xff0c;向开发板中烧录预先编译好的系统镜像&#xff0c;使之在开发板上运行起来。 2. 串口输出的意义&#xff08;做系统控制台&#xff09; 串口是一种硬件通信口&…