- 浏览: 725314 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
yukang1:
太适合新手了 谢主隆恩
tomcat结合nginx使用小结 -
singformyself:
确实,楼主写的很好。必须赞一个。让我这个nginx新手如获至宝 ...
tomcat结合nginx使用小结 -
光太狼Leon:
这才是真正对新手有用的文章。
tomcat结合nginx使用小结 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
JAVA webservice之CXF -
MCLoginandPwd:
如今,java技术框架太多了,给你分享一个好玩代码生成器,ht ...
论JAVA框架
已经好久没有写博客了,这段时间看过很多书,包括《浪潮之巅》(好书,推荐大家看看),《暗时间》(也很不错,刘末鹏讲时间管理的),还有断断续续研究了IOC和spring的实现代码,这部分收获不大,单纯的为了看代码而看代码,现在打算学习设计模式后再来深入。这段时间,在看martin的《企业应用模式》,这是本好书,但翻译看着感觉怪怪的,好多名词怪怪的。但买了就要学习一下,基本看下还是可以的。
今天来重新学习一下基本的东西。很久以前就学习过JSP自定义标签,JSTL更是经常使用,但说到写一个自定义标签,如果没有重新看一下,倒真不知道如何下手。相信很多朋友有同样的感觉,看过的东西,没用一段时间很快就忘记了,特别是技术方面的。究其原因,还是我们没能深入了解它的本质,没有深入理解。
我们一起来看一下。
首先我们必须知道一个标签可以包含什么东西:拿一个JSTL核心标签来看一下:
<c:forEach var="item" items="${items}"> XXXX </c:forEach>
我们看到,一个标签可以包含属性,这个可以随便,自己定个数,也可以有标签体,当然这个标签体又可以是另外一个标签,如此类推。
那究竟怎么来实现呢?首先我们可以看看JAVA EE中的Tag相应的层级结构。
我们可以看到基本的接口是JspTag,当然我们没必要去实现这个接口,因为JAVA EE已经帮我们实现了一部分,如果
我们不需要标签体,我们可以简单地继续TagSupport,而如果我们需要标签体,我们可以直接继承BodyTagSupport。这
个在我们之后的例子可以看到。(我们只看有标签体的例子,没有标签体的大家可以自己试下,很简单)。
那么基本的信息,我们知道了,是时候开始代码了。建项目这些就不废话了。
自定义标签包括如下几个步骤:
1)自定义标签处理类(即我们刚才说的继承TagSupport或BodyTagSupport,或者在新的JSP2里面的SimpleTag)。
2)一个标签描述文件,tld,这个我们可以通过打JAR包或者直接放在META—INF文件夹下,容器会自动进行搜索。
3)在web.xml中进行配置jsp-config进行配置taglib-uri及taglig-location。
4)在JSP页面上用taglib命令引用,然后就可以使用了。
看起来很简单,对吧。实际上也就那么回事。开始我们的代码。
1)首先来自定义标签处理类:
我这里写了一个进行循环输出的,这里我暂时处理 的是String类型,其他类型的大致相同。
package com.shun.customtag; import java.io.IOException; import java.util.Collection; import java.util.Iterator; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class IteratorTag extends BodyTagSupport{ private static final long serialVersionUID = 1L; private Iterator<String> it; private String name;//这里name作为循环的变量名称,相当于forEach中的var public void setName(String name) { this.name = name; } public void setItems(Collection<String> items){ if(items.size() > 0) { it = items.iterator(); } } public int doAfterBody() throws JspException { return iterateItems(); } public int doEndTag() throws JspException { //这里必须把body里面的内容输出,否则标签内的内容会为空 if (bodyContent != null) { try { bodyContent.writeOut(bodyContent.getEnclosingWriter()); } catch (IOException e) { e.printStackTrace(); } } return EVAL_PAGE; } public int doStartTag() throws JspException { if (it == null) { return SKIP_BODY; } else { return iterateItems(); } } /** * 这里进行遍历传入的items对象 * @return */ private int iterateItems(){ //如果还存在值,则把它放入pageContext,即当前页面下,以便我们可以在body中进行取出 if (it.hasNext()) { pageContext.setAttribute(name, it.next()); return EVAL_BODY_AGAIN; } return EVAL_PAGE; } }
看到这里,也许有些人有疑问,怎么来确定返回的是EVAL_啥呢?
这个基本上是下面的情况:
doStartTag(标签处理开始,即遇到开始标签时)一般返回EVAL_BODY_INCLUDE或者SKIP_BODY
doEndTag(标签处理结束,即遇到结束标签时)一般返回EVAL_PAGE或者SKIP_PAGE。
doAfterBody(标签体处理完成后)一般可以返回EVAL_BODY_AGAIN或者EVAL_BODY_BUFFER(这个是JSP2新的,JSTL1.1是没有的)或者EVAL_PAGE
应该很容易想明白,在开始标签处理完后,就要考虑标签体的处理,那么EVAL_BODY_INCLUDE或者SKIP_BODY就很自然了,在结束后就开始考虑剩余的页面处理,那么返回SKIP_PAGE或者EVAL_PAGE也很有道理,而doAfterBody就是在标签体处理完成后要干什么,可以继续处理页面EVAL_PAGE,或者重新处理标签体(这个以前用的是EVAL_BODY_TAG,但这个已经在JAVA EE6中被抛弃了)。
代码基本上没啥问题的。可能很多人会说,那个bodyContent是干啥用的。这个实际上可以把它看成一个内容的缓冲器,它把我们所有标签体中的内容进行缓冲,当我们调用writeOut时,才进行写出。
2)标签处理类有了,那么接着就来标签描述文件了。
<?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 web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>myTag</short-name> <uri>http://com.shun/myTag</uri> <tag> <name>iterator</name> <tag-class>com.shun.customtag.IteratorTag</tag-class> <body-content>JSP</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
这里也是简单得很,但有几个地方要注意:
(1)这里的URI和我们稍后配置的在web.xml中的taglib-uri需要一致,容器就是靠这个URI来查找标签库的。
(2)rtexprvalue为true表明了指定的属性可以用EL表达式或其他的JSTL标签等。
3)写完之后就来配置web.xml了:
简单的一段配置就OK了。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <jsp-config> <taglib> <taglib-uri>http://com.shun/myTag</taglib-uri> <taglib-location>/META-INF/myTag.tld</taglib-location> </taglib> </jsp-config> </web-app>
这里taglib-uri在上面已经强调过,需要和引用的tld中的URI一致。
4)接下来我们就可以直接使用了:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <%@ taglib uri="http://com.shun/myTag" prefix="myTag" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% List<String> items = new ArrayList<String>(); items.add("test1"); items.add("test2"); items.add("test3"); request.setAttribute("items",items); %> <myTag:iterator items="${items }" name="item"> ${item } </myTag:iterator> </body> </html>
这里我们构造了一个List,然后让它循环输出,很简单。
当我们进行访问时,可以看到:
这样表明我们的标签运行正常,这样就搞定了我们的自定义标签开发了。当然,当我们项目需要用到时,肯定不会这么简单的,这里只是抛砖引玉,大家可以深入研究。
发表评论
-
你的单元测试有多稳定?提升自动测试质量的最佳实践
2014-03-21 13:12 1636本文转载自http://www.importnew.com ... -
Protobuffer和json深度对比
2013-11-13 22:53 96953JSON相信大家都知道是什么东西,如果不知道,那可就真的O ... -
小记S2SH开发
2013-07-08 23:23 3660相信S2SH没人不知道了吧,struts2+ ... -
论JAVA框架
2013-04-14 15:09 6103进入新公司已经差不多三个星期了,上次一篇文章 ... -
struts2.x样式修改
2012-11-22 10:09 1589好久没弄过三大框架相关的东西了,今天重新拾起,弄了一下str ... -
tomcat结合nginx使用小结
2012-05-19 13:51 221340相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apa ... -
自定义标签之EL函数
2012-05-10 22:44 2431前几天写了篇博客回顾了一下自定义标签的,这次也来重新回顾一下 ... -
JAVA处理XML
2011-12-13 22:04 2787网上有很多讲解JAVA怎么处理XML,当然文章并不会再讲那些 ... -
JAVA webservice之Jersey
2011-11-28 23:34 6749前几天我们一起学习了CXF和xfire,那两天都存在WSDL ... -
JAVA webservice之CXF
2011-11-23 22:32 153586昨天我们一起学习了一下xfire,今天我们来看一下CXF, ... -
JAVA webservice之xfire
2011-11-22 21:37 20568最近公司最近需要将以前提供出去的接口统一用一个标准来实现,考 ... -
JDBC对clob和blob的相关操作
2011-11-12 22:58 3604这段时间经常接触到需要对clob和blob字段进行操作的情况 ... -
jsp相对路径和绝对路径小谈
2011-07-14 00:32 33274很长一段时间纠结过JSP ... -
ajax小谈
2011-07-07 21:51 2163最近在做项目时经常用到ajax,当然有个很好的jquery在 ... -
oracle分页小谈
2011-06-17 00:02 3908今天做项目时要实现分页功能,以前只在mysql上弄过,ora ... -
EL表达式遇到的问题
2011-06-14 22:43 3276今天在为客户做一个新需求,重新做几个JSP页面和几个serv ... -
solr初体验(3)
2011-05-12 19:55 2291前两天,学习了solr的 ... -
jsp:include和@include学习
2011-03-27 15:16 2138一直以来做项目都是用@include,很少去用到JSP:in ...
相关推荐
### 小结 通过上述步骤,我们成功地创建了一个简单的自定义标签 `helloTag` 并在 JSP 页面中使用了它。这种自定义标签的方式不仅提高了代码的复用性,还使得 JSP 页面更加简洁和易于理解。在实际项目开发中,合理...
### jsp自定义标签知识点详解 #### 一、自定义标签概述 在JavaServer Pages (JSP) 技术中,自定义标签是一种强大的功能,它允许开发者创建可重用的代码片段,并以类似HTML标签的方式在JSP页面中使用。这种机制极大...
5. **仅有的三个数据导向的JSP操作**:在JSP中,只有`<jsp:useBean>`、`<jsp:setProperty>`和`<jsp:getProperty>`这三个动作标签与数据处理相关,自定义标签可以大大扩展这一范围,提供更多灵活的数据处理方式。...
通过增加窗口特征字符串,我们可以自定义弹出窗口的样式和行为。例如: ```html <!-- window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, ...
6. JSP标签库:`<c:forEach>`和`<c:out>`的使用。 7. EL(Expression Language)的运用。 通过这个实验,学生可以深入理解Web应用程序的工作原理,以及JSP和Servlet如何协作处理用户请求和展示结果。这对于理解Web...
- **`<%@ taglib ... %>`**:引入自定义标签库,指定URI和别名。 ### 4. JSP脚本元素 - **`<%-- ... --%>`**:JSP注释,服务器端不会执行。 - **`! ... %>`**:声明区,用于声明变量和方法,相当于Java类的一部分...
JSP 的主要特点之一是其能够在服务器端执行 Java 代码片段,并且能够通过 JSP 自定义标签库来简化 HTML 和 XML 的使用。此外,JSP 还提供了一套标准的 HTML 和 XML 标签用于简化页面开发过程。JSP 标签库提供了一...
5. **本章小结**: 学习JSP的基础知识,包括理解JSP的运行环境,掌握JDK和Tomcat的安装配置,选择合适的开发工具,以及如何编写和运行第一个JSP程序,这些都是成为一名合格的JSP开发者的基础。 在实际开发中,了解...
- **Taglib指令**:用于引入自定义标签库。 #### 脚本元素 脚本元素允许在JSP页面中嵌入Java代码,包括: - **声明**:`! %>`,用于声明变量或方法,这些变量和方法在整个JSP页面中都可见。 - **Java程序段**:`...
1.4 小结 13 第2章初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例...
##### 2.4 JSP语法小结 通过这些基本语法,开发者可以灵活地控制页面内容的生成逻辑,同时保持良好的可维护性和可读性。 #### 三、JSP内置对象 JSP 提供了一系列内置对象,简化了开发过程中的常见任务: - **...
5. **JSP标签库**:Struts提供了一系列自定义JSP标签,如`<s:form>`, `<s:textfield>`等,简化视图层的开发,提高可读性和可维护性。 6. **Struts ActionServlet**:这是Struts的核心控制器,负责解析请求、调用...
1.4 小结 13 第2章 初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例 26 ...
第一部分 Strut 2:一个全新的框架 第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 ...15.7 小结 332
14.2.2 开发自定义标签 179 14.3 Grails对Ajax的支持 182 14.4 本章小结 184 第15章 实现Web Service 185 15.1 REST风格的Web Service 185 15.1.1 什么是REST 185 15.1.2 在Grails中实现REST 185 15.1.3 在Client端...
3.4自定义标签库 51 3.5预处理用户请求:filter 53 3.6使用listener 56 3.7项目实战——用户登录 59 本章小结 62 课后练习 63 第4章sql与jdbc 64 4.1sql 64 4.1.1sql概述 64 4.1.2ddl与dml简介 64 4.1.3...