第十八天3月14日之JSP标签,自定义标签和jstl
二、自定标签的作用
替换JSP中的java脚本<%%>
三、第一个自定义的标签(开发步骤)
1、编写一个类,直接或间接实现javax.servlet.jsp.tagext.Tag(一般选择继承TagSupport)
public class ShowRemoteIpTag extends TagSupport {
public int doStartTag() throws JspException {
String remoteIp = pageContext.getRequest().getRemoteAddr();
try {
pageContext.getOut().write(remoteIp);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
}
2、在WEB-INF目录下建立一个扩展名为tld(Tag Libary Definition)的xml文件。
<?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">
<tlib-version>1.0</tlib-version>
<short-name>itheima</short-name>
<uri>http://www.itheima.com/jsp/mytag</uri>
<tag>
<name>remoteIp</name>
<tag-class>com.itheima.tag.ShowRemoteIpTag</tag-class>
<body-content>empty</body-content><!-- 标签的主体内容 -->
</tag>
</taglib>
3、(可选)在web.xml中建立tld文件的名称空间和tld文件的存放位置的对应关系
<jsp-config>
<taglib>
<taglib-uri>http://www.itheima.com/jsp/mytag</taglib-uri>
<taglib-location>/WEB-INF/itheima.tld</taglib-location>
</taglib>
</jsp-config>
4、使用:
<%@ taglib uri="http://www.itheima.com/jsp/mytag" prefix="itheima"%>
**知识点:Tag接口
int SKIP_BODY
int EVAL_BODY_INCLUDE
int SKIP_PAGE
int EVAL_PAGE
void setPageContext(PageContext pc):容器会把当前页面的PageContext对象传给你。在doXXX之前。
void setParent(Tag t):容器会传入该标签的父标签类的实例。如果没有传入null
int doStartTag():遇到自定义标签的开始标签就执行。容器来调用
int doEndTag():遇到自定义标签的结束标签就执行。容器调用
自定义标签的执行过程和生命周期:
四、传统标签:附属功能
控制jsp页面某一部分内容是否执行。
控制结束标签后的JSP内容是否执行
控制jsp页面内容重复执行。
修改页面内容输出。
五、JSP中标签核心接口或类的类图
六、简单标签
简单标签的执行过程:
小结:(tld文件的主要标签和作用)
1、头部信息:
<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">
<tlib-version>1.0</tlib-version>
<short-name>sitheima</short-name>
<uri>http://www.itheima.com/jsp/smytag</uri>
</taglib>
2、主要元素:
tag:定义标签
name:标签的使用名称
tag-class:标签处理类的全名
body-content:标签主体内容的类型
可选值:
JSP jsp文件中可以出现啥,主体内容就可以出现啥。为传统标签服务。
empty 没有主体内容,都(传统和简单)可以用
scriptless 有主体内容,但不应该有java脚本。为简单标签服务
tagdependent 把主体内容当做普通字符串。为简单标签服务
attribute 定义该标签的属性
name 属性的使用名称。它与标签处理类的setter方法对应
required 是否是必须的属性
rtexprvalue 是否支持表达式(jsp表达式<%=%> EL表达式)
七、使用简单标签开发的几个案例
自己利用简单标签开发c:if标签:
import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class IfSimpleTag extends SimpleTagSupport { private boolean test; public void setTest(boolean test) { this.test = test; } public void doTag() throws JspException, IOException { if(test) getJspBody().invoke(null); } }
自己利用简单标签开发c:foreach标签:
package com.jxnu.example.tag; import java.io.IOException; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.SimpleTagSupport; public class ForEach2SimpleTag extends SimpleTagSupport { private Object items; private String var; private Collection collection = new ArrayList(); public void setItems(Object items) { if(items instanceof List){ collection = (Collection)items; }else if(items instanceof Map){ collection = ((Map)items).entrySet();// key=value }else if(items.getClass().isArray()){ //反射: java.lang.reflect.Array int length = Array.getLength(items); for(int i=0;i<length;i++){ Object element = Array.get(items, i); collection.add(element); } }else{ throw new RuntimeException("不支持该类型"); } } public void setVar(String var) { this.var = var; } public void doTag() throws JspException, IOException { PageContext pc = (PageContext)getJspContext(); if(collection!=null&&collection.size()>0){ for(Object obj:collection){ pc.setAttribute(var, obj); getJspBody().invoke(null); } } } }
八、JSTL中Core中剩余的标签
<%@page import="com.itheima.domain.Person"%> <%@ page 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</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> <br/>------------------- c:out 输出值到页面上-------------------<br/> <%pageContext.setAttribute("name", "<hr/>"); %> <c:out value="${name}" default="木有改变量" escapeXml="true"></c:out><br/> ${name}<br/> <br/>------------------- c:set 设置值到指定的域范围中-------------------<br/> <!-- scope:page(默认) request session application --> <c:set value="abc" var="s" scope="session"></c:set> ${pageScope.s }<br/> ${sessionScope.s }<br/> <br/>------------------- c:set 设置Map中的值: property指定的是key值,value指定的value的值-------------------<br/> <%pageContext.setAttribute("map", new HashMap()); %> <c:set property="key1" value="value1" target="${map}"></c:set> <c:forEach items="${map}" var="me"> ${me.key}=${me.value}<br/> </c:forEach> <br/>------------------- c:set 设置JavaBean的属性 支持基本类型的自动转换------------------<br/> <br/>保存数据:String--->其他类型 显示数据(回显):其他类型---->String<br/> <%pageContext.setAttribute("p", new Person()); %> <c:set property="name" value="CGX" target="${p}"></c:set> <c:set property="age" value="38" target="${p}"></c:set> <c:set property="birthday" value="<%=new Date()%>" target="${p}"></c:set> ${p.name}||${p.age}||${p.birthday} <br/>------------------- c:remove 从指定范围中删除域中的数据,若没有指定范围,全删------------------<br/> <c:set value="pa" var="a1" scope="page"></c:set> <c:set value="ra" var="a1" scope="request"></c:set> page:${pageScope.a1}<br/> request:${requestScope.a1}<br/> <c:remove var="a1"/> page:${pageScope.a1}<br/> request:${requestScope.a1}<br/> <br/>------------------- c:catch 在页面中抓异常 try{}catch(Exception e){e.getMessage()}------------------<br/> <c:catch var="e"><!-- pageContext.setAttribute("e",Exception对象) --> ${p.gender} </c:catch> ${e.message} </body> </html>
<%@ page 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>jstl中的core标签</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> <br/>---------------c:url构造一个url地址 ---------------<br/> <c:url value="/01.jsp" var="address" scope="page"></c:url> <a href="${address}">猛一点</a> <br/>---------------c:url和c:param传递参数 。中文参数自动url编码 ---------------<br/> <c:url value="/01.jsp"> <c:param name="username" value="wdx"></c:param> <c:param name="password" value="123"></c:param> <c:param name="gender" value="女性"></c:param> </c:url> <br/>---------------c:url 支持url地址重写(会话) ---------------<br/> <c:url value="/01.jsp"/> <br/>---------------c:import 动态包含 ---------------<br/> <br/>---------------转发:forward,目标只能是本应用中的。 redirect可以到任何地方,关键看你地址怎么写。 URL:协议+主机+资源 ---------------<br/> </body> </html>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。