💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 简介 JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要代替jsp页面中的脚本代码。目的简化java代码 JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库 * EL表达式虽然可以替代jsp表达式,但是由于EL表达式仅仅具有输出功能,而不替代页面中的jsp脚本片段 * 自定义标签库可以在jsp页面中以类似于html标签的形式调用java中的方法.使用方法和jsp动作标签类似 | 标签库 | 标签库的URL | 前缀 | | --- | --- | --- | | Core | http://java.sun.com/jsp/jstl/core | c | | I18N | http://java.sun.com/jsp/jstl/fmt | fmt | | SQL | http://java.sun.com/jsp/jstl/sql | sql | | xml | http://java.sun.com/jsp/jstl/xml | x | | Functions | http://java.sun.com/jsp/jstl/functions | fn | # JSTL下载与导入 JSTL下载: 从Apache的网站下载JSTL的JAR包。进入`http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/`网址下载 JSTL的安装包。jakarta-taglibs-standard-1.1.2.zip,然后将下载好的JSTL安装包 进行解压, 此时,在lib目录下可以看到两个JAR文件,分别为jstl.jar和standard.jar。 其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于 实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD) 将两个jar包导入我们工程的lib中 使用jsp的taglib指令导入核心标签库 ~~~ <!-- taglib指令:用来引入标签库 uri:指定要引入标签库的位置 prefix:要使用的标签库的前置标签名[jsp:] --> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> ~~~ # JSTL核心库的常用标签 不要在JSTL标签里面加注释 ## `<c:out value="" default="">` 输出 这边的out遇到js脚本不会执行 ~~~ <!-- c:out 向页面输出内容 通常结合EL表达式使用 value:属性值中使用EL在域中取值 default:如果value值为空,显示default中的值(可不写) --> <% request.setAttribute("name", "x"); request.setAttribute("code", "<script>alert('11')</script>"); %> <c:out value="${name}" default="游客"></c:out> <br> <!-- jstl不会弹窗 escapeXml:是否自动转义标签,默认true转义 false就会弹窗了,(可不写) --> <c:out value="${code}" escapeXml="false"></c:out> <!-- EL会弹窗 --> ${code} ~~~ ## `<c:set var=" " value=" ">` 向域中存值,默认存到pageScope域 ~~~ <!-- c:set 向域中设置值 var: 向域中存值的key value: 值 scope: 指定域(可不写) page, request, session, application --> <!-- 向域中存值 --> <c:set var="address" value="hangzou" scope="request"></c:set> <!-- 取值 --> ${address} ~~~ ## `<c:remove >` 移除域中的属性值 全域移除,遍历每个域移除所有,可以指定域 ~~~ <c:set var="address" value="hangzou" scope="request"></c:set> <!-- c:remove 移除域中的属性值 var: 要移除属性的key scope: 指定域移除(可不写) --> <c:remove var="address" scope="request"></c:remove> <!-- 获取不到 --> ${address} ~~~ ## `<c:if test=" ">` 其中test是返回boolean的条件 ~~~ <!-- test表示boolean表达式的结果 --> <c:if test="true"> 1 </c:if> ~~~ 看用户名是否为空 ~~~ <c:if test="${empty param.username}"> 游客请登录 </c:if> <c:if test="${!empty param.username}"> 已登录 </c:if> ~~~ ~~~ <% request.setAttribute("count", 10); %> <!-- jstl标签经常会和el配合使用 --> <!-- test代表的返回boolean的表达式 --> <c:if test="${count==10 }"> xx </c:if> ~~~ ## `<c:choose>` 这个标签可以组成if-else语句 注释写的地方要注意 ![](https://box.kancloud.cn/ddcfa228edc08db06d8838f4d8fe7ad6_976x664.png) ~~~ <!-- 一下三个标签语句if-else c:choose if-else语句的开始 内部只有when或者c:otherwise两个 可以有多个when,但是是互斥关系,只会执行一个 c:when test:when语句的执行条件,只能接收布尔值 if或else if c:otherwise else otherwise语句可以没有,如果有些到最下面 --> <c:choose> <c:when test="${param.score>=80}"> 优秀 <br /> </c:when> <c:when test="${param.score>=60}"> 及格 <br /> </c:when> <c:when test="${param.score<=60}"> 不及格 <br /> </c:when> <c:otherwise> otherwise语句 </c:otherwise> </c:choose> ~~~ ## `<c:redirect>` `<c:redirect>`主要用于将请求重定向到另一个资源地址 可设置属性 * url 作用:指定要重定向到的目标地址,注意这里指定绝对路径会自动加上项目名 参数类型:string ~~~ <c:redirect url="/target.jsp"></c:redirect> ~~~ ## `<c:url value="" var="" scope="">` * value 设置要处理的URI地址,注意这里要以/开头 * var 修改后存储到域对象中的uri属性名 * scope 设置修改后uri存放的域 例: **使用相对路径** ~~~ <c:url value="index.jsp" var="uri" scope="request"> <c:param name="name" value="张三"></c:param> </c:url> ~~~ 会生成如下地址: index.jsp?name=%E5%bc%AO **使用绝对路径** 使用绝对路径会自动在路径前加上项目名 ~~~ <c:url value="/index.jsp" var="uri" scope="request"> <c:param name="name" value="张三"></c:param> </c:url> ~~~ 会生成如下路径 `/javaWeb/index.jsp?name=%E5%bc%AO` ## `<c:forEach>` 使用方式有两种组合形式 **forEach模拟** ~~~ <!-- forEach模拟 for (int i=0; i<5; i++) { syso(i); } --> <!-- begin:起始索引,必须大于等于0,小于0就报错 end:结束索引 var:每次遍历,系统会自动将正在遍历的索引存到page域中,key就是var的值,遍历执行完,系统会自动移除域中的值,foreach中var的属性值作用域就在标签内 step:每次遍历的步数 --> <c:forEach begin="0" end="5" var="i" step="1"> ${i} <br /> </c:forEach> ~~~ **增强for** ~~~ <!-- 模拟增强for productList---List<Product> for(Product product : productList) { syso(product.getPname()); } --> <!-- 这是域中取的 --> <!-- items:一个集合或数组 var:代表集合中的某一个元素 <c:forEach items="${productList }" var="pro"> ${pro.pname} </c:forEach> --> ~~~ 示例: 1. 遍历`List<String>`的值 2. 遍历`List<User>`的值 3. 遍历`Map<String,String>`的值 4. 遍历Map<String,User>的值 5. 遍历Map<User,Map<String,User>>的值 ~~~ entry.key-----User entry.value------List<String,User> ~~~ ~~~ <% //模拟List<String> strList List<String> strList = new ArrayList<String>(); strList.add("1111"); strList.add("222"); strList.add("333"); strList.add("444"); request.setAttribute("strList", strList); //遍历List<User>的值 List<User> userList = new ArrayList<User>(); User user1 = new User(); user1.setId(2); user1.setName("lisi"); user1.setPassword("123"); userList.add(user1); User user2 = new User(); user2.setId(3); user2.setName("wangwu"); user2.setPassword("123"); userList.add(user2); application.setAttribute("userList", userList); //遍历Map<String,String>的值 Map<String,String> strMap = new HashMap<String,String>(); strMap.put("name", "lucy"); strMap.put("age", "18"); strMap.put("addr", "西三旗"); strMap.put("email", "lqqdwdwd2cn"); session.setAttribute("strMap", strMap); //遍历Map<String,User>的值 Map<String,User> userMap = new HashMap<String,User>(); userMap.put("user1", user1); userMap.put("user2", user2); request.setAttribute("userMap", userMap); %> <h1>取出strList的数据</h1> <c:forEach items="${strList }" var="str"> ${str }<br/> </c:forEach> <h1>取出userList的数据</h1> <c:forEach items="${userList}" var="user"> user的name:${user.name }------user的password:${user.password }<br/> </c:forEach> <h1>取出strMap的数据</h1> <c:forEach items="${strMap }" var="entry"> ${entry.key }====${entry.value }<br/> </c:forEach> <h1>取出userMap的数据</h1> <c:forEach items="${userMap }" var="entry"> ${entry.key }:${entry.value.name }--${entry.value.password }<br/> </c:forEach> ~~~ # JSTL函数标签库 ## 导入 导入标签库 ~~~ <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> ~~~ ## replace 字符串替换 ~~~ <!-- 把第一个字符串中的那个字符串替换成第三个参数 --> ${fn:replace("123456", "2", "x")} ~~~ ## length 查看字符串长度 ~~~ ${fn:length("jdxia")} ~~~ ## toLowerCase 字符串中包含的所有字符转换为小写形式 ~~~ <%-- fn:toLowerCase函数将一个字符串中包含的所有字符转换为小写形式,并返回转换后的字符串, 它接收一个字符串类型的参数。 注意:fn:toLowerCase("")的返回值为空字符串。 --%> <%-- fn:toLowerCase("Www.CNBLOGS.COM")的返回值为字符串“www.cnblogs.com” --%> fn:toLowerCase("Www.CNBLOGS.COM")的结果是:${fn:toLowerCase("Www.CNBLOGS.COM") } ~~~ ## toUpperCase ~~~ <%-- fn:toUpperCase函数将一个字符串中包含的所有字符转换为大写形式,并返回转换后的字符串, 它接收一个字符串类型的参数。 注意:fn:toUpperCase("")的返回值为空字符串。 --%> fn:toUpperCase("www.cnblogs.com")的结果是:${fn:toUpperCase("www.cnblogs.com") } ~~~ ## trim ~~~ <%-- fn:trim函数删除一个字符串的首尾的空格,并返回删除空格后的结果字符串, 它接收一个字符串类型的参数。 需要注意的是,fn:trim函数不能删除字符串中间位置的空格。 --%> fn:trim(" cnblogs.com ")的结果是:${fn:trim(" cnblogs.com ") } ~~~ ## split ~~~ <%-- fn:split函数以指定字符串作为分隔符,将一个字符串分割成字符串数组并返回这个字符串数组。 fn:split函数接收两个字符串类型的参数,第一个参数表示要分割的字符串,第二个参数表示作为分隔符的字符串 --%> fn:split("www.cnblogs.com",".")[0]的结果是:${fn:split("www.cnblogs.com", ".")[0] } ~~~ ## join ~~~ <%-- fn:join函数以一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串并返回合并后的结果字符串。 fn:join函数接收两个参数,第一个参数是要操作的字符串数组,第二个参数是作为分隔符的字符串。 如果fn:join函数的第二个参数是空字符串,则fn:join函数的返回值直接将元素连接起来。 --%> <% String[] strs = {"www", "iteye", "com"}; pageContext.setAttribute("strs", strs); %> <%-- fn:join(StringArray,".")返回字符串“www.iteye.com”--%> fn:join(StringArray,".")的结果是:${fn:join(strs, ".") } <br/> <%-- fn:join(fn:split("www,iteye,com",","),".")的返回值为字符串“www.iteye.com”--%> fn:join(fn:split("www,iteye,com",","),".")的结果是:${fn:join(fn:split("www,iteye,com", ","), ".") } ~~~ ## indexOf ~~~ <%-- fn:indexOf函数返回指定字符串在一个字符串中第一次出现的索引值,返回值为int类型。 fn:indexOf函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串, 那么,不管第二个参数字符串在第一个参数字符串中出现几次,fn:indexOf函数总是返回第一次出现的索引值; 如果第一个参数中不包含第二个参数,则fn:indexOf函数返回-1。 如果第二个参数为空字符串,则fn:indexOf函数总是返回0。 --%> fn:indexOf("www.iteye.com","eye")的返回值为:${fn:indexOf("www.iteye.com","eye") } ~~~ ## contains ~~~ <%-- fn:contains函数检测一个字符串中是否包含指定的字符串,返回值为布尔类型。 fn:contains函数在比较两个字符串是否相等时是大小写敏感的。 fn:contains函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,则fn:contains函数返回true,否则返回false。 如果第二个参数的值为空字符串,则fn:contains函数总是返回true。 实际上,fn:contains(string, substring)等价于fn:indexOf(string, substring) != -1 忽略大小的EL函数:fn:containsIgnoreCase --%> fn:contains("aaaaaabbcc","ab")的结果为:${fn:contains("aaaaaabbcc","ab") } ~~~ ## startsWith ~~~ <h3>fn:startsWith函数和fn:endsWith函数使用范例:</h3> <%-- fn:startsWith函数用于检测一个字符串是否是以指定字符串开始的,返回值为布尔类型。 fn:startsWith函数接收两个字符串类型的参数,如果第一个参数字符串以第二个参数字符串开始,则函数返回true,否则函数返回false。 如果第二个参数为空字符串,则fn:startsWith函数总是返回true。 与fn:startsWith函数对应的另一个EL函数为:fn:endsWith,用于检测一个字符串是否是以指定字符串结束的,返回值为布尔类型。 --%> fn:startsWith("www.iteye.com","iteye")的返回值为:${fn:startsWith("www.iteye.com","iteye") } <br/> fn:endsWith("www.iteye.com","com")的返回值为:${fn:endsWith("www.iteye.com","com") } ~~~ ## replace ~~~ <h3>fn:replace使用范例:</h3> <%-- fn:replace函数将一个字符串中包含的指定子字符串替换为其它的指定字符串,并返回替换后的结果字符串。 fn:replace方法接收三个字符串类型的参数,第一个参数表示要操作的源字符串,第二个参数表示源字符串中要被替换的子字符串, 第三个参数表示要被替换成的字符串。 --%> fn:replace("www iteye com ", " ", ".")的返回值为字符串:${fn:replace("www iteye com ", " ", ".") } <hr/> ~~~ ## substring ~~~ <%-- fn:substring函数用于截取一个字符串的子字符串并返回截取到的子字符串。 fn:substring函数接收三个参数,第一个参数是用于指定要操作的源字符串,第二个参数是用于指定截取子字符串开始的索引值,第三个参数是用于指定截取子字符串结束的索引值, 第二个参数和第三个参数都是int类型,其值都从0开始。 --%> fn:substring("www.it315.org", 4, 9) 的返回值为字符串:${fn:substring("www.it315.org", 4, 9) } ~~~ ## substringAfter ~~~ <h3>fn:substringAfter函数和fn:substringBefore函数使用范例:</h3> <%-- fn:substringAfter函数用于截取并返回一个字符串中的指定子字符串第一次出现之后的子字符串。 fn:substringAfter函数接收两个字符串类型的参数,第一个参数表示要操作的源字符串,第二个参数表示指定的子字符串。 与之对应的EL函数为:fn:substringBefore。 --%> fn:substringAfter("www.it315.org",".")的返回值为字符串:${fn:substringAfter("www.it315.org",".") } <br/> fn:substringBefore("www.it315.org",".")的返回值为字符串:${fn:substringBefore("www.it315.org",".") } <hr/> ~~~ ## escapeXml ~~~ <h3>fn:escapeXml函数使用范例:</h3> fn:escapeXml("&lt;a href='www.cnblogs.com'&gt;点点&lt;/a&gt;")的结果是:${fn:escapeXml("<a href='www.cnblogs.com'>点点</a>") } ~~~