网站seo策划/提升排名
day13内容
1、JSTL标签库
jstl是apache对EL表达式的扩展,依赖EL使用jstl需要导入jstl1.2.jarjstl标签库中四大库core:核心标签库fmt:格式化标签库 日期、数字sql: 过时xml: 过时使用前先通过taglib导入标签库。
在jsp页面中:<%taglib prefix="前缀 "uri="路径"%>
2、core库 –> c标签
1) 输出:
value : 可以是字符串常量,也可以是EL表达式
default: 当要输出的内容是null时,输出默认值
escapexml:为true时,将自动转义
<c:out value="${aaa}" default="xxx" escopexml="true"/>
2) 设置域的属性
var变量名
value:变量值
scope:域,默认为page。 可选值为四大域。
3)remove 删除域属性
var:变量名
scope: 表示删除所有域中指定名称的变量。指定域后范围为指定域
4)url:
value:指定一个路径,在路径前自动添加项目名。但必须以"/"开头
param: 表示给url后添加参数
var: 指定变量名。url将不会输出到页面中
5)if: 与java中用法相同。
6)choose:对应java中的if/else if/else语句
例如: 对应的if/else结构:
<c:choose> if(...){ <c:when test="">...</c:when> } else if{<c:when test="">...</c:when> } else if{<c:when test="">...</c:when> } ...<c:otherwise>...</c:otherwise> else{...}
</c:choose>
7)forEach:
1)可以用计数方式来循环属性:var:设置循环遍历 begin:设置起始值end: 结束值step:设置步长 等同于java中的 i++或i+=2 等。items: 指定循环谁,可以是数组或集合。计数方式:<c:forEach var="i" begin="1" end="10">${i} // i从1开始 到10结束。</c:forEach>2)用来循环遍历数组、集合String[] strs = {"one","two"}; //创建数组request.setAttribute("strs",strs); //设置属性,存放数组<c:forEach items="${strs}" var="str"> //遍历,相当于增强for${str}</c:forEach>varStatus : 循环状态 可以设置循环状态。count:已遍历元素个数index:当前元素下标first 是否为第一个元素last:是否为最后一个元素current:表示当前项目 Object类型eg:<c:forEach items="${strs}" var="str" varStatus="vs"> ${vs.index} ${vs.count}
</c:forEach>
3、fmt库 格式化输出
<fmt: formatDate value="" pattern="">
value:指定一个Date类型的变量
pattern:用来指定输出的模板! 例如: yyyy-MM-dd<fmt: formatNumber value="" pattern="0.00">
pattern表示四舍五,保留两位数。
4、自定义标签过程
步骤:
1)定义标签处理类 继承SimpleTagSupport
2)配置tld文件,是一个xml文件
3)在jsp页面中使用<%@taglib%> 来指定文件位置。
标签处理类介绍
simpleTag接口:void doTag(): 每次执行标签时都会调用JspTag getParent():返回父标签void setParent(JspTag):设置父标签void setJspBody(JspFragment):设置标签体void setJspContext(JspContext):设置jsp上下文对象,儿子是Pagecontext。
示例一:自定义标签(无标签体)
1)设置标签处理类:
1)继承SimpleTagSupport2)在setJspContext(JspContext context) 中//保存传过来的pagecontextthis.pagecontext = (PageContext) context; 3)在setJspBody(JspFragment body) 中//保存传过来的bodythis.body = body;
2)配置tld文件。
tld一般放在WEB-INF之下,保证客户端访问不到。<tag><name>myTag1</name> //指定当前标签的名称<tag-class>/tag/MyTag1.java</tag-class> //指定当前标签的标签处理类<body-content>empty</body-content> // 指定标签体的类型。这里使用空标签</tag>
3)在jsp页面中指定文件位置
<%@ taglib prefix="it" uri="/WEB-INF/tlds/tags.tld"%> prefix 为前缀。 uri 路径
4)在jsp中使用标签。
<body><h1><it:myTag1/> </h1> 使用prefix定义的前缀:和tld文件中的标签名称</body>
示例二:自定义标签(有标签体)
标签体内容:
empty: 无标签体
scriptless: 只能是EL表达式,也可以是其他的标签。
tagdependent:标签体内容不会被执行,而是直接赋值给标签处理类。
1)定义标签处理类:
public void doTag() throws JspException, IOException { //获取当前jsp页面的输出流。Writer out = this.getJspContext().getOut();out.write("**** TAG 3 ****");//得到标签体 ,执行标签体内容,把结果写到指定的流中this.getJspBody().invoke(out);}
2)配置tld文件
<tag><name>myTag3</name><tag-class>tag.MyTag3</tag-class><body-content>scriptless</body-content> //表示含有标签体</tag>
3)在jsp页面中指定文件位置
4)在jsp中使用标签
<body><%request.setAttribute("xxx", "张三"); //向request域中存放属性%><it:myTag3>我是TAG3</it:myTag3> //执行内容标签体<it:myTag3>${xxx} </it:myTag3> //执行内容为EL表达式的标签体</body>
SkipPageException异常:
在doTag()方法下抛出此异常,在执行完自定义标签后,不再执行jsp页面下的东西。
public void doTag() throws JspException, IOException { //得到已传递的JSP对象。得到用于输出的out内置对象 ,调用print方法输出this.getJspContext().getOut().print("**** TAG 4 ****");throw new SkipPageException; //抛出此异常,后面的将不执行
}
示例三:设置带标签属性的标签体。
步骤:
1)在标签处理类中添加属性属性至少含有setXxx()方法
2)在tld文件中配置属性。
3)在jsp中使用
1)添加属性 test
private boolean test;//此方法将由tomcat调用,并在daTag()之前
public void setTest(boolean test){this.test = test;
}
2)在tld文件中配置
<tag><name>myTag4</name> //指定当前标签的名称<tag-class>/tag/MyTag4.java</tag-class> //指定当前标签的标签处理类<body-content>scriptless</body-content> // 指定标签体的类型<tag><attribute> //属性标签<name>test</name> //指定属性名 <required>true</required> //指定属性是否必须存在<rtexprvalue>true</rtexprvalue> //指定是否可以使用EL表达式</attribute></tag>
3)在jsp页面中指定文件位置
4)在jsp中使用
//属性test必须有值(在tld中设置的)<it:myTag4 test="${empty param.xxx} }"></it:myTag4>