目录
模拟 if...else if...else if...else...
1、JSTL:JSP标准的标签库,作用是使用标签代替java代码。
2、JSTL:标准是SUN制定,apache实现的。(SUN收录了Apache的实现)
3、jstl标签可以使用内置的标签,也可以自定义标签。(这里只使用内置标签)
使用jstl的步骤
* 在项目中引入jstl的相关jar包,确保jar存在:jstl.jar、standard.jar,可以使用这个连接直接跳转到官网,在官网下,选择自己想要的jar包。
* 在需要使用标签的jsp页面上使用taglib指令引入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
解析:让jsp和核心标签库的相关配置文件c.tld建立连接。
* 在需要使用标签的位置直接使用标签
模拟 if
<c:if test="${empty param.username}" scope="page" var="a">
<h1 align="center"><font color="red">请提供用户名</font></h1>
</c:if>
<c:if test="${not empty param.username}" scope="page" var="b">
<h1 align="center"><font color="green">欢迎${param.username}</font></h1>
</c:if>
解析:
scope 指定test属性运算符结果保存范围,可选值:
"page" pageContext范围
"request" request范围
"session" session范围
"application" application范围
【注】scope如果不写默认值是“page”,耗费资源最少,范围最小。
url: localhost:8080/myweb/jstl_text.jsp,输出
请提供用户名
url :http://localhost:8080/myweb/jstl_text.jsp?username=lili,输出
欢迎lili
模拟 if...else if...else if...else...
<c:choose>
<c:when test="${param.age < 18}">
少年
</c:when>
<c:when test="${param.age < 35}">
青年
</c:when>
<c:otherwise>
老年
</c:otherwise>
</c:choose>
模拟 循环forEach
<c:forEach begin="1" end="10" step="1" var="i">
${i}
</c:forEach>
将上述代码转为java代码
for (int i=1; i<=10; i++){
作用域对象.setAttribute("i",i);
System.out.println(作用域对象.getAttribute("i") == null ? "" : 作用域对象.getAttribute("i"));
}
接收集合类型
<c:forEach items="${stuList}" var="stu" varStatus="stuStatus">
${stuStatus.count}、${stu.sno}、${stu.sname}<br/>
</c:forEach>
解析:
items 属性可以接受EL表达式,类型可以是数组或者集合。
var 代表集合中元素。
varStatus 属性指向了一个状态对象,状态对象都有一个count属性,count属性的值是序号。
将上述代码转为java代码
for (Student s : stuList){
pageContext.setAttribute("e",e);
System.out.println(((Student)作用域对象.getAttribute("s")).getSno());
System.out.println(((Student)作用域对象.getAttribute("s")).getSname());
}
附加:
<c:forTokens items="127.0.0.1,192.168.0.3,192.168.6.5" delims="," var="ip">
${ip}<br/>
</c:forTokens>
还可以把 items 的内容写在 webapp/WEB-INF/web.xml中
<context-param>
<param-name>ips</param-name>
<param-value>127.0.0.1,192.168.0.3,192.168.6.5</param-value>
</context-param>
用 initParma 内置对象接收数据
<c:forTokens items="${initParam.ips}" delims="," var="ip">
${ip}<br/>
</c:forTokens>
JSTL源码分析(if为例子)
<tag>
<description></description>
<name>if</name>
<tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<description></description>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>boolean</type>
</attribute>
</tag>
解析:
description:标签描述
name:标签名字
tag-class:标签对应的需要执行的类
body-content:标签体中的内容类型
attribute:标签可以出现的属性
description:对属性的描述
name:属性的名字
required:该属性是否必须的,true表示必须的
rtexprvalue:该属性是否可以接收EL表达式,true表示支持EL表达式
type:该属性的数据类型
函数
1、函数是对EL表达式的补充,函数是属于JSTL的一部分,对应的配置文件,standard.jar包中的fn.tld文件。
2、函数也是联合EL表达式也是代替JSP中的java代码
3、函数成分:内置函数、自定义函数(都需要掌握)
4、EL表达式怎么用,函数就怎么用。
内置函数的使用步骤
* 导入jar包(jstl.jar、standard.jar)
* 使用taglib指令导入函数库
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
* 在需要使用函数的位置使用即可
${fn:contains("HelloWorld.java", ".java")}
函数源码分析(contains方法为例)
<function>
<description></description> 函数描述
<name>contains</name> 函数名
<function-class>org.apache.taglibs.standard.functions.Functions</function-class> 函数对应的类
<function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature> 函数对应的类中需要执行的方法
<example>
<c:if test="${fn:contains(name, searchString)}"> 例子
</example>
</function>
解析:
description:函数描述
name:函数名
function-class:函数对应的类
function-signature:函数对应的类中需要执行的方法
example:例子
自定义标签的步骤
* 在WEB-INF目录下新建text.tld文件,从fn.tld文件中拷贝模板。
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>Text 1.1 functions library</description>
<display-name>Text functions</display-name>
<tlib-version>1.1</tlib-version>
<short-name>text</short-name>
<uri>http://www.km.com/jsp/jstl/functions</uri>
<function>
<name>getText</name>
<function-class>km.bean.StringUtil</function-class>
<function-signature>java.lang.String getText(java.lang.String))</function-signature>
</function>
</taglib>
* 编写一个类,在该类中编写一个方法,该方法必须是public的。并且必须是static的
package km.bean;
public class StringUtil {
/**
* 工具类的构造方法一定都是私有化的
*/
private StringUtil(){}
/**
* 通过属性配置文件中的key获取value
*/
public static String getText(String code){
return "方法执行了";
}
}
* 使用即可
<%=StringUtil.getText("000")%>
${text:getText("000")}
方法结果是一样的。