第十八天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>


第十八天3月14日之JSP标签,自定义标签和jstl,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。