概述
标签库作用
- 替代Java代码
- 替代EL表达式脚本
导入标签库
<%@ taglib prefix="c" uri=http://java.sun.com/jsp/jsti/core %>
- prefix(前缀):区别不同的标签库
- uri:标签库的路径
步骤:
- 安装JSTL
- taglib指令导入JSP
- 使用标签库
核心标签库
输出标签
<c:out value="表达式" [escapeXML="true|false"] default=""/>
- escapeXML:自动转义
遍历标签
<c:forEach var="x" begin="1" end="5">
<c:out value="${x}"/>
</c:forEach>
- items:对象
- begin:开始
- end:结束
- var:变量
- step:步长,默认1
<c:forTokens var="item" items="<..值...>" delims="<>,(%)>">
<li>${item}</li>
</c:forTokens>
- delims:定界符集
条件标签
<c:if test="${i>3}">
(greater than 3)
</c:if>
类似switch语句
<c:choose>
<c:when test ="${i<3}" > (less than 3) </c:when>
<c:when test ="${i<5}" > (less than 5) </c:when>
<c:otherwise>(greater than 5)</c:otherwise>
</c:choose>
变量操作
<c:set target="beanName" property="propertyName" [scope="varScope"] />
someValue
</c:set>
<c:remove var="" [scope=""]/>
- var:指定变量名称。
- scope:指定变量的作用范围,默认为page。
- value:待赋给变量的值,可以是一个常量、EL或JSP表达式
- target:target属性是结果为对象的表达式。如果对象实现了Map接口,c:set标签的property属性被当作键(值已指定),用来新建一个映射条目。如果target属性的结果为JavaBean,那么c:set标签的值就被传递给property属性所指定的目标JavaBean的属性值为null时,其结果相当于调用setAttribute(null)语句,可以是请求、响应或会话等,其结果是从作用域中删除了属性。
URL相关标签
<c:import url=http://www.baidu.com var="baidu"/>
- context:内容
- scope:作用范围
- charEncoding:编码
- url:导入的资源
<c:param name="paraName" value="paramValue"/>
<c:url value="URL" [var="name"] [scopr=""] [context="context"]/>
重定向标签
<c:redirect url="url" [context="context"]>
</c:redirect>
自定义标签
步骤
- 创建标签处理类(注意要遵循Javabean的规则)
- TLD文件,用于将XML元素映射到标签实现
- 使用标签库的JSP文件
注意:
载入标签处理类之后,Tomcat首先用无参数构造函数实例化该类。
因此每个标签处理类必须有一个无参数构造函数,否则实例化时将会失败。
实例(计算三角形的面积)
创建标签处理类
- 继承SimpleTagSupport
- 实现SimpleTag接口
- 多个属性创建对应的setXXX方法
- doTag()方法
注意:
执行标签实际动作的代码定义在doTag方法内。
通常,通过调用JspWriter类的print方法将内容输出到JSP页面。为了获得JspWriter类的一个实例,在doTag方法内部调用getJspContext().getOut()。
doTag方法是在请求时调用的。SimpleTag模型不会重用标签处理类的实例,标签处理类为页面上出现的每个标签创建一个新实例。
要想输出标签体的内容,需要在doTag方法内部通过下述方式获取表示标签体的JspFragment实例:
调用getJspBody方法,然后使用其invoke方法,为它传递null作为参数。
getJspBody().invoke(null);
Tomcat像处理其他JSP页面内容一样处理标签体中的JSP内容。如果向invoke方法传递参数为null,那么JSP内容的输出结果会被逐字传递到客户端。因此,doTag方法没有任何访问标签体输出的任何方式中,它所做的仅仅是遍历标签体。
package jsplearn.w10;
import jsplearn.w8.bean.Triangle;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter;
public class computerTag extends SimpleTagSupport {
private String sideA;
private String sideB;
private String sideC;
public computerTag() {
}
public void setSideA(String sideA) {
this.sideA = sideA;
}
public void setSideB(String sideB) {
this.sideB = sideB;
}
public void setSideC(String sideC) {
this.sideC = sideC;
}
public String getSideA() {
return sideA;
}
public String getSideB() {
return sideB;
}
public String getSideC() {
return sideC;
}
@Override
public void doTag() throws JspException, IOException {
Triangle triangle = null;
StringWriter stringWriter = new StringWriter();
double d1=Double.valueOf(sideA);
double d2=Double.valueOf(sideB);
double d3=Double.valueOf(sideC);
if (d1 >= 0 && d2 >= 0 && d3 >= 0) {
triangle = new Triangle(d1,d2,d3);
JspWriter out= getJspContext().getOut();
if (triangle.isTriangle()) {
out.println("三角形的面积是:"+triangle.getArea());
}else{
out.println("这不是一个三角形");
}
}
}
}
TLD文件
- description:描述
- tlib-version:标签的版本
- uri:统一资源定位符
- tag-class:对应的标签处理类
- body-content:标签体
- attribute:属性
- required:是否可选
- rtexprvalue:可选元素。rtexprvalue设置为true时,表明属性值是一个<%=expression%>形式的JSP脚本表达式或如${bean.value}的JSP EL。rtexprvalue设置为false时,表明属性值必须是一个固定的字符串。默认值是false。
注意:
定义标签处理类后,需要向服务器标识这个类,并将其与特定的XML标记名称相关联。
这个任务是通过一个XML格式的TLD(taglib description)文件来完成的。
该文件包含固定的信息(如XML Schema实例声明)、标签库描述及标签描述等内容。TLD文件需要放在WEB-INF目录或其子目录下。
body-content,告诉Tomcat如何处理标签开始和结束之间的内容,可设置值包括:
- empty:不允许任何内容出现在标签体中。将任何内容(包括空格)放在标签体内会产生页面翻译错误。
- scriptless:允许标签体中有JSP内容,但是不能包含<%…%>或<%=…%>之类的任何脚本元素。
- tagdependent:允许标签像其主体一样有任何类型的内容。但是,这些内容根本不会被处理,并会被完全忽略。由标签处理类开发人员来决定访问这些内容,并对其进行处理。
JSP:向后兼容servlet2.4之前定制标签的传统定义方式。不能用于使用SimpleTag接口的标签处理类。
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>computer</short-name>
<uri>http://mycompany.com</uri>
<!-- Invoke 'Generate' action to add tags or functions -->
<tag>
<name>Triangle</name>
<tag-class>jsplearn.w10.computerTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>sideA</name>
<required>true</required>
</attribute>
<attribute>
<name>sideB</name>
<required>true</required>
</attribute>
<attribute>
<name>sideC</name>
<required>true</required>
</attribute>
</tag>
</taglib>
使用标签库
<%--
Created by IntelliJ IDEA.
User: max
Date: 2018/11/13
Time: 12:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="computer" uri="/WEB-INF/tags.tld" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<H3>以下是调用Tag文件的效果:</H3>
<computer:Triangle sideA="5" sideB="6" sideC="7"/>
</body>
</html>
最后
以上就是威武小伙为你收集整理的JSP 标签库的全部内容,希望文章能够帮你解决JSP 标签库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复