javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)
一、自定义标签简介
//java类
public class ViewPortTag extends TagSupport{ @Override
public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
JspWriter out = this.pageContext.getOut();
int port = request.getRemotePort();
try {
out.print(port);
} catch (IOException e) {
throw new RuntimeException(e);//让调用者知道报错
}
return super.doStartTag();
}
}
<!--ku6.tld -->
<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>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>http://www.hgnc.net/jsp2-tag</uri>
<tag>
<description>show client IP</description>
<name>ViewPortTag</name>
<tag-class>com.ku6.web.tag.ViewPortTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
<!-- jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="ku6" uri="http://www.hgnc.net/jsp2-tag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
port:<ku6:ViewPortTag/>
</body>
</html>
查看编译后的jsp源码
package org.apache.jsp; import com.ku6.web.tag.ViewPortTag;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.el.ExpressionFactory;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspApplicationContext;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import org.apache.jasper.runtime.HttpJspBase;
import org.apache.jasper.runtime.InstanceManagerFactory;
import org.apache.jasper.runtime.JspSourceDependent;
import org.apache.jasper.runtime.TagHandlerPool;
import org.apache.tomcat.InstanceManager; public final class NewFile_jsp extends HttpJspBase
implements JspSourceDependent
{
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); private static Map<String, Long> _jspx_dependants = new HashMap(1);
private TagHandlerPool _005fjspx_005ftagPool_005fku6_005fViewPortTag_005fnobody;
private ExpressionFactory _el_expressionfactory;
private InstanceManager _jsp_instancemanager; static
{
_jspx_dependants.put("/WEB-INF/ku6.tld", Long.valueOf(1448265099457L));
} public Map<String, Long> getDependants()
{
return _jspx_dependants;
} public void _jspInit() {
this._005fjspx_005ftagPool_005fku6_005fViewPortTag_005fnobody = TagHandlerPool.getTagHandlerPool(getServletConfig());
this._el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
this._jsp_instancemanager = InstanceManagerFactory.getInstanceManager(getServletConfig());
} public void _jspDestroy() {
this._005fjspx_005ftagPool_005fku6_005fViewPortTag_005fnobody.release();
} public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
JspWriter out = null; JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try
{
response.setContentType("text/html; charset=UTF-8");
PageContext pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
pageContext.getServletContext();
pageContext.getServletConfig();
pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out; out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\tport:");
if (_jspx_meth_ku6_005fViewPortTag_005f0(_jspx_page_context))
return;
out.write(" \r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)) {
out = _jspx_out;
if ((out != null) && (out.getBufferSize() != 0)) try {
out.clearBuffer(); } catch (IOException localIOException) {
} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else
throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
} private boolean _jspx_meth_ku6_005fViewPortTag_005f0(PageContext _jspx_page_context)
throws Throwable
{
_jspx_page_context.getOut(); ViewPortTag _jspx_th_ku6_005fViewPortTag_005f0 = (ViewPortTag)this._005fjspx_005ftagPool_005fku6_005fViewPortTag_005fnobody.get(ViewPortTag.class);
_jspx_th_ku6_005fViewPortTag_005f0.setPageContext(_jspx_page_context);
_jspx_th_ku6_005fViewPortTag_005f0.setParent(null);
_jspx_th_ku6_005fViewPortTag_005f0.doStartTag();
if (_jspx_th_ku6_005fViewPortTag_005f0.doEndTag() == 5) {
this._005fjspx_005ftagPool_005fku6_005fViewPortTag_005fnobody.reuse(_jspx_th_ku6_005fViewPortTag_005f0);
return true;
}
this._005fjspx_005ftagPool_005fku6_005fViewPortTag_005fnobody.reuse(_jspx_th_ku6_005fViewPortTag_005f0);
return false;
}
}
二、Tag接口的执行流程
1、public void setPageContext(PageContext pc), JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信.
2、public void setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null.
3、public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法.
4、public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法.
5、public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法.
三、自定义标签功能扩展
四、简单标签
由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能.实现SimpleTag接口的标签通常称为简单标签.
**简单标签和传统标签的原理相同,只是api不同而已,实际开发中不会让自己写标签,会用就可以.
五、JSTL标签库 *重点
1、<c:out>标签

例:
<c:out value="aabbcc<br/>" escapeXml="false"></c:out>
<c:out value="<a href=''>点点</a>" escapeXml="true"></c:out>
<%
request.setAttribute("data",null);
%>
<c:out default="bbbbbbbbbbbbb" value="${data}"></c:out>
2、<c:set>标签

*只要在标签中看到Var就表示把当前标签的执行结果以var定义的名称为关键字存在某个域里面.
<c:set var="dd" value="ddvalue" scope="page"/>
${dd}<br/> <% Map map=new HashMap();
request.setAttribute("map",map);
%>
<c:set property="dd" value="xxx" target="${map}" />
${map.dd }<br/> <%
Person p=new Person();
request.setAttribute("p",p);
%>
<c:set property="name" value="namevalue" target="${p}"></c:set>
<c:out value="${p.name}"></c:out>
3、<c:remove>标签
<c:remove var="varName" [scope="{page|request|session|application}"] />
4、<c:catch>标签
<c:catch [var="varName"]>nested actions</c:catch>
<c:catch var="myex">
<%
int i=10/0;
%>
</c:catch>
<c:out value="${myex}" /><br />
<c:out value="${myex.message}" /><br />
<c:out value="${myex.cause}" /><br />
<c:out value="${myex.stackTrace}" />
5、<c:if>标签

例:
<c:if var="aaa" test="${user==null}" scope="page"></c:if>
${aaa }
6、<c:choose>标签
<c:set value="2" var="count" />
<c:choose>
<c:when test="${count == 0}">
对不起,没有符合您要求的记录.
</c:when>
<c:otherwise>
符合您要求的记录共有${count}条.
</c:otherwise>
</c:choose>
7、<c:forEach>标签

ps:上面没有列出varStatus.
例1,没有items:
<c:forEach var="i" begin="1" end="9" step="1" >
${i}
</c:forEach>
例2,实现表格隔行变色:
<% List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
request.setAttribute("list",list);
%>
<style>
.odd{background-color: blue;}
.even{background-color: red;}
tr:hover{background-color: green;}
//如果不支持鼠标放上去变色,可从tomact默认网页上拷头<!DOCTYPE html>
</style>
<table>
<c:forEach var="str" items="${list}" varStatus="status">
<tr class="${status.count%2==0?'even':'odd'}"><td> ${status} ::: ${str }</td></tr>//el表达式可以写各种java表达式,但是不能实现字符串拼接,像个bug一样
</c:forEach>
</table>
例3,varStatus的属性:
<%
String atts[] = new String [5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="pen";
request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item" varStatus="s">
<c:out value="${item}"/>的四种属性:
index:${s.index}</br>
count:${s.count}</br>
first:${s.first}</br>
last:${s.last}</br>
</c:forEach>
8、<c:url>标签 ,<c:param>标签 , *重点

2>在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数.<c:param>标签可以嵌套在<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数.<c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处.
例:
<c:url var="url" value="/index.jsp">
<c:param name="name" value="中国"></c:param>
</c:url>
<a href="${url }">购买</a>//会自动补全路径
ps:若果刷新页面,发现sessionId没有传递给客户端,因为服务器发现客户端没有禁ip后,第二次就不会在传递sessionId.
9、<c:redirect>标签,用于实现请求重定向

10、forTokens标签,分割字符串
<% String data="aa,bb,cc,dd";
request.setAttribute("data",data);
%>
<c:forTokens items="${data}" delims="\," var="c">${c}
javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)的更多相关文章
- JSTL(JSP Standard Tag Library ,JSP标准标签库)
JSTL标签之核心标签 JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个实现 Web应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管 ...
- 自定义标签 与 JSTL(JSP Standard Tag Library)
1.自定义标签 [理解] [1]简介 > 在JSP2.0以后,在jsp页面中不建议使用脚本片段<% %>和JSP表达式<%= %> ...
- JSTL(JSP Standard Tag Library)读书笔记
分类 Preifx 范例 核心标签库--- ...
- EL表达式,JSTL:jsp standard Tag Library
1.EL表达式的作用: 1.1访问Bean的属性. 方式一:${对象名 . 属性名} eg:${user.name} 方式二:${对象名["属性名"]} 1.2输出简单的运 ...
- JSTL的全称:JSP Standard Tag Library, jsp 标准标签库
JSTL的全称:JSP Standard Tag Library, jsp 标准标签库 JSTL的作用 提供给Java web开发人员一个标准通过的标签函数库和EL来取代传统直接在页面上嵌入j ...
- JSTL 标准标签库 (JavaServer Pages Standard Tag library, JSTL)
JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个定制标签库的集合,用来解决 像遍历Map或集合.条件测试.XML处理,甚至数据 库访问和数 ...
- JSP 标准标签库(JSTL)(JSP Standard Tag Library)
[1] JSTL简介 > JSTL是JSP的标准标签库 > JSTL为我们提供了一些常用的标签,供我们日常开发使用(if . if...else .遍历 . 日期格式化) ...
- EL(Expression Language)和JSTL标签(JSP Standard Tag Library)
一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java代码的 ...
- 标准标签库JSTL(JSP Standard Tag Library)
1, 核心标签(最常用, 最重要的) 表达式控制标签 out 输出常量 value---直接赋值 输出变量 default---默认值 escapeXml---控制转义字符(默认为true, 如果需要 ...
随机推荐
- laravel 报错htmlspecialchars() expects parameter 1 to be string, object given
翻译过来就是 期望参数1是字符串 意思就是说变量为数组,应以数组的方式输出 @foreach($xxx as $k=>$y) {{$k}}{{$y}} @endforeach
- luogu P3600 随机数生成器【dp】
把期望改成方案数最后除一下,设h[i]为最大值恰好是i的方案数,那么要求的就是Σh[i]*i 首先包含其他区间的区间是没有意义的,用单调栈去掉 然后恰好不好求,就改成h[i]表示最大值最大是i的方案数 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session技术
Servlet提供了HttpSession接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式. Servlet容器使用这个接口来创建一个HTTP客户端和HTTP服务器之 ...
- hyperledger fabric 1.0.5 分布式部署 (一)
环境是个人虚拟机ubuntu 16.04 64 位版本 前期用户需要先安装好:gcc.g++.git 软件 安装 golang 首先给环境安装一个 go 语言环境,版本最好在1.8 以上 golang ...
- 关于maven项目导入后缺jar包问题的处理方法
1.maven项目的好处:方便,我们在把自己写好的代码发送给目标人物时可以精简代码——把target目录,一些设置目录之类的都删除掉,接下来要做的就是尽可能的只留下一个src文件夹及pom.xml文件 ...
- python错误之RuntimeError: dictionary changed size during iteration
pythonn报错信息: C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/Ad ...
- 判断EditText输入的字符串中是否包含有emoji表情
我们在实际的开发中经常需要用到EditText 但是有一个不好的地方就是我们在前端用EditText输入了带有emoji表情的字符串之后 服务器是无法识别的,这就需要我们前端根据需求来决定表情的去留, ...
- B. Hierarchy
http://codeforces.com/problemset/problem/17/B 用邻接矩阵建图后, 设cost[v]表示去到顶点v的最小值. 很多个人去顶点v的话,就选最小的那个就OK 然 ...
- javaScript中的闭包原理 (译)
这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...
- 将Object转换成Dictionary方法
如果Object是Dictionary类型,直接返回 如果Object是NameValueCollection类型,则添加到Dictionary里 如果Object是Hashtable类型,添加到Di ...