在javaee中,需要了解的还有其丰富的核心标签库,包括c标签、struts标签....
现在先来了解标签的底层机制:
package gz.itcast.tags.cases;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//自定义的标签需要继承SimpleTagSupport接口,并且实现doTag()方法
public class WhenTag extends SimpleTagSupport{
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
//根据test的值判断是否显示标签内容
if(test){
<span style="white-space:pre"> </span>//通过getJspBody()在自定义标签内写出数据
this.getJspBody().invoke(null);
}
//得到父标签对象
ChooseTag parent = (ChooseTag)this.getParent();
parent.setFlag(test);
}
}
package gz.itcast.tags.cases;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//登录UI界面的标签
public class LoginUITag extends SimpleTagSupport{
private String name;
private String password;
//用于给属性赋值的
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public void doTag() throws JspException, IOException {
String html = "";
html += "<table border='1' width='300px'>";
html += "<tr>";
html += "<td>用户名</td>";
html += "<td><input type='text' name='"+name+"'/></td>";
html += "</tr>";
html += "<tr>";
html += "<td>密码</td>";
html += "<td><input type='password' name='"+password+"'/></td>";
html += "</tr>";
html += "<tr>";
html += "<td colspan='2' align='center'><input type='submit' value='登录'/><input type='reset' value='重置'/></td>";
html += "</tr>";
html += "</table>";
<span style="white-space:pre"> </span>//通过getJspContext()方法可以得到PageContext对象,并可以得到其他的对象和方法
this.getJspContext().getOut().write(html);
}
}
除了定义完doTag方法以后,还需要在web-inf的目录下创建一个.tld文件,该文件是一个自定义标签的配置文件,每一个自定义的标签都需要在该文件进行配置才能使用,如下就是tld文件的具体配置
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签声明文件 -->
<!-- 标签库 -->
<taglib>
<!-- 标签库的版本:不改 -->
<tlib-version>1.0</tlib-version>
<!-- 运行的jsp版本 :不改-->
<jsp-version>1.2</jsp-version>
<!-- 在jsp页面上访问标签库的前缀 建议名称 -->
<short-name>itcast</short-name>
<!-- 在jsp页面导入标签库时的唯一的名称(路径) -->
<uri>http://www.itcast.cn</uri>
<!-- 声明一个标签 -->
<tag>
<!-- 标签名称 -->
<name>showip</name>
<!-- 指定标签的类全名(用于找到标签处理类) -->
<tag-class>gz.itcast.tags.ShowIPTag</tag-class>
<!-- 标签内容类型 -->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demo1</name>
<tag-class>gz.itcast.tags.Demo1Tag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demo2</name>
<tag-class>gz.itcast.tags.Demo2Tag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demo3</name>
<tag-class>gz.itcast.tags.Demo3Tag</tag-class>
<body-content>scriptless</body-content>
<!-- 声明一个属性 -->
<attribute>
<name>num</name>
<!-- 是否必须填写 -->
<required>false</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>demo4</name>
<tag-class>gz.itcast.tags.Demo4Tag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>loginUI</name>
<tag-class>gz.itcast.tags.cases.LoginUITag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>password</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<tag>
<name>if</name>
<tag-class>gz.itcast.tags.cases.IfTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>when</name>
<tag-class>gz.itcast.tags.cases.WhenTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>otherwise</name>
<tag-class>gz.itcast.tags.cases.OtherwiseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>choose</name>
<tag-class>gz.itcast.tags.cases.ChooseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>forEach</name>
<tag-class>gz.itcast.tags.cases.ForEachTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
javaee自带的标签c标签,使用c标签需要导入该标签的uri
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> //这个是导入的标签的地址
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>核心标签库</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%--数据操作: --%>
<%--c:set :保存数据到域对象中
page: 默认 pageContext
request:
session
application
--%>
<%--<c:set value="狗娃" var="name" scope="request"></c:set> --%>
<%--
pageContext.setAttribute("name","狗娃");
--%>
${name}
<hr/>
<%-- c:out: 从域对象中取出数据
default: 默认值,当没有数据时生效
escapeXml: 是否需要对其内容进行转义
--%>
<c:out value="${name}" default="<h3>标题</h3>" escapeXml="false"></c:out>
<hr/>
<%-- 条件判断 --%>
<%--c:if --%>
<c:if test="false">
是否被显示
</c:if>
<%--c:choose + c:when + c:othwise --%>
<c:choose>
<c:when test="false">
没有登录
</c:when>
<c:otherwise>
登录成功了
</c:otherwise>
</c:choose>
<hr/>
<%--循环 --%>
<%--c:forEach:循环集合或者数组 --%>
<%
List<String> list = new ArrayList<String>();
list.add("eric");
list.add("rose");
list.add("lucy");
request.setAttribute("list", list);
%>
<%--
itmes: 需要遍历的数据
var: 每个对象的名称(使用时)
begin: 从哪个开始
end: 到哪个结束
step:每次跳过几个
--%>
<c:forEach items="${list}" var="name">
姓名:${name}<br/>
</c:forEach>
<hr/>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("s1", "狗娃");
map.put("s2", "狗蛋");
map.put("s3", "狗剩");
request.setAttribute("map", map);
%>
<c:forEach items="${map }" var="entry">
key: ${entry.key },value: ${entry.value}<br/>
</c:forEach>
<hr/>
<%--c:forTokens :循环特殊字符串--%>
<c:set value="java-net-ios-php" var="course"></c:set>
<c:forTokens items="${course}" delims="-" var="c">
课程:${c}<br/>
</c:forTokens>
<%-- c:redirect --%>
<%
//response.sendRedirect(request.getContextPath()+"/target.jsp");
%>
<%--
url: 自动带上项目名称
--%>
<%--<c:redirect url="/target.jsp"></c:redirect> --%>
<%-- c:url: 简化路径写法 --%>
<a href="<c:url value="/target.jsp"/>">跳转</a>
</body>
</html>
通过javaee的标签,以后能够在页面尽可能的不写入java脚本代码,通过el表达式和标签的使用能够取代之
javaee自带的标签c标签,使用c标签需要导入该标签的uri