JSTL
- jstl:jsp标准标签库。jstl有五个标签库,极大简化了我们的开发
- 核心标签库 c标签库
- 格式化标签库 fmt标签库
- 函数标签库
- sql库 sql
- xml库
- 使用步骤
- 导入两个包
1)taglibs-standard-impl-1.2.1.jar
2)taglibs-standard-spec-1.2.1.jar
- 在页面导入标签库
<!--导入核心库--> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!--导入函数库--> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
prefix:定义标签的前缀
uri:标签库的唯一识别符
- 使用核心标签库
1)<c:out>:用于计算一个表达式并将结果输出到当前页面
- value:代表要输出的内容,可以是EL表达式
- default:表示默认的值
- escapeXml:表示是否转义特殊字符
<% pageContext.setAttribute("msg",""); %> <c:out value="msg" default="123" escapeXml="true"></c:out>
2)<c:set>:用于添加或修改域中的属性
- var:表示要设置的属性的key
- property:戴白要修改的属性名
- scope:表示要设置在哪个域中(四个域)
- target:代表要修改的目标对象
- value:表示要设置属性的value
<!--给域中设置一个属性--> <c:set var="key" value="value" scope="request"></c:set> ${requestScope.key}
<!--修改对象的某个属性值--> <c:set property="username" value="newvalue" target="object"></c:set> <%=object.username%>
3)<c:remove>:用来移出域中的属性
- var:要移出的属性的key
- scope:要移出属性的域,若没指定哪个域,则把所有域中的key属性移出
<c:remove var="parakey" scope="request"></c:remove>
4)<c:if>:用于实现if功能,可以嵌套
- test:就是判断条件,如果是true执行标签体里的内容,否则不执行
- scope:指定判断结果保存到哪个域中,方便以后使用
- var:指定的key值保存判断的结果
<c:if test="${5<6}" scope="request" var="flag"> <h1>我是c:if里面的</h1> </c:if>
5)<c:choose>、<c:when>、<c:other>:是一套组合
- 功能和swich case功能是一样的
<c:choose> <c:when test="${16>15 }"> <h1>当条件满足执行这里</h1> </c:when> <c:when test="${16=15 }"> <h1>当条件满足执行这里</h1> </c:when> <c:when test="${16<15 }"> <h1>当条件满足执行这里</h1> </c:when> <c:otherwise> <h1>否则执行这里</h1> </c:otherwise> </c:choose>
6)<c:forEach>:用来做循环遍历
- begin:指定遍历开始的位置
- end:指定白能力的结束位置
- items:要遍历的东西 list array
- step:步长,一次跳过多少
- var:指定遍历的当前条目的变量名
- varStatus:封装当前遍历状态的详细信息,里面封装了当前遍历的所有状态信息 varStatus=“status"就会将当前遍历状态的详细信息对象赋值给status
<c:forEach begin="0" end="10" var="num"> <!-- foreach标签体相当于我们的循环体 --> <!-- 可以直接用el表达式获取 --> ${num}<br/> </c:forEach>
<!-- 使用foreach遍历一个list ,指定遍历哪些东西items,每个遍历出的数据放在var--> <% List<String> list=new ArrayList<String>(); list.add("张三"); list.add("李四"); list.add("赵武"); list.add("利卡将"); %> <c:forEach items="<%=list%>" var="stu"> ${stu}<br/> </c:forEach>
<c:forEach items="<%=list%>" var="stu" varStatus="status"> <!--status有如下图的属性--> ${stu}---->${status.start}<br/> </c:forEach>
7)<c:url>:
- value:指定要改装的路径
- scope:把改装后的返回值放到域中的uri属性中,方便以后获取
<c:uri value="index.jsp" var="uri" scope="request"></c:uri> ${uri}
8)<c:redirect>:重定向
- url:重定向的目标页面
- 函数库:函数标签库实在JSTL中定义的标准的EL函数集
<% request.setAttribute("msg", "Helloworlda"); %> 判断前面的字符串是否包含后面的(区分大小写)${fn:contains(msg,"a")}<br/> 判断前面的字符串是否包含后面的(不区分大小写)${fn:containsIgnoreCase(msg,"a")}<br/> 判断字符串是否以某个字符串开始(区分大小写):${fn:startsWith(msg,"H")}<br/> 判断字符串是否以某个字符串结束(区分大小写):${fn:endsWith(msg,"a")}<br/> 判断某个字符串的起始位置:${fn:indexOf(msg,"H")}<br/> 字符串替换:${fn:replace(msg,"Hello","Hi")}<br/> 截取字符串(不包含后面的索引):${fn:substring(msg,0,5)}
- 自定义标签
1)自定义标签
- 编写标签库的描述文件,描述标签的详细信息
- 库描述文件放在web-inf/tags
- 标签的实现类 SimpleTag
- 步骤:
- 在web-inf目录下新建文件tags
- 在tags中新建tld文件,并选择next
2)源文件
- mytag.tld
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://xmlns.jcp.org/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd "> <!-- 标签库的版本 --> <tlib-version>1.0</tlib-version> <!-- 指定下面所有定义的标签的前缀 --> <short-name>agg</short-name> <!-- 标签库的唯一标识,域名/tags/atguigu --> <uri>http://www.atguigu.com/tags/atguigu</uri> <!-- 定义一个可以使用的标签 --> <tag> <!-- 定义一个标签名 --> <name>hello</name> <!-- 定义标签的实现类,必须写全类名 --> <tag-class>com.aiguigu.tag.MyTag</tag-class> <!--empty:是一个空标签,就是没有标签体,代表当前是一个自结束标签 jsp:可以传入jsp表达式,scriptless可以传的jsp也可以 scriptless:不可以传jsp表达式,el及其他正常的可以 tagdependent:传入是啥就是啥 --> <body-content>empty</body-content> <!-- 使用attribute定义属性 --> <attribute> <!-- name指定属性名 --> <name>msg</name> <!-- 这个属性是否是必须的,true则是必须的 --> <required>true</required> <!--scriptless可以接收el表达式的值 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
- MyTag.java
package com.aiguigu.tag; import java.io.IOException; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.JspTag; import javax.servlet.jsp.tagext.SimpleTag; public class MyTag implements SimpleTag { //执行标签功能 private String msg; private PageContext pc; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } //处理标签的函数 @Override public void doTag() throws JspException, IOException { pc.getOut().write("<h1>"+msg+"</h2>"); } //获取父标签(只特指自定义标签) @Override public JspTag getParent() { // TODO Auto-generated method stub return null; } //设置JspBody标签体内容 服务器自动传入 @Override public void setJspBody(JspFragment arg0) { // TODO Auto-generated method stub } //设置jspContext==pageContext 服务器自动传入 @Override public void setJspContext(JspContext arg0) { // TODO Auto-generated method stub this.pc=(PageContext)arg0; } //设置父标签,服务器自动传进来 @Override public void setParent(JspTag arg0) { // TODO Auto-generated method stub } }
- index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page uri="http://www.atguigu.com/tags/atguigu" prefix="agg"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <agg:hello msg="你好"></agg:hello> </body> </html>
tml4/loose.dtd">
Insert title here ```