name支持标签体的标签
- 在标签处理类中,可以通过getJsoContext()来设置/获取共享变量。
- 输出标签体的内容:getJspBody().invoke(null);
demo.tld
注意:为了支持标签体,body-content要设置成scriptless。iterator.jsp
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><%@ taglib uri="http://www.lijinlong.cn/demotaglib" prefix="demo"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>自定义标签 - iterator</title></head><body> <h2>我们给您的建议:</h2> <ol> <demo:iterator collection="${requestScope.adviceList}" eleAttrName="item"> <li>${pageScope.item}</li> </demo:iterator> </ol></body></html>
- 这里从request scope取得的adviceList是在Servlet中放进去的。
- iterator标签设计为,将集合中的每一个元素设置到page scope的属性中,其name由eleAttrName指定。
- 我们的jsp非常的简洁。
IteratorServlet.java
package cn.ljl.javaweb.demo.jsp2taglib.servlet;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(name = "iteratorServlet", urlPatterns = { "/demo/jsp2taglib/iterator" })public class IteratorServlet extends HttpServlet { private static final long serialVersionUID = 4201830343915991973L; private static final String VIEW_SHOW = "/demo/jsp2taglib/iterator.jsp"; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<String> advices = new ArrayList<String>(); advices.add("早睡早起。"); advices.add("坚持锻炼身体。"); advices.add("每天留半个小时发呆或者冥想。"); advices.add("保持心情平和。"); advices.add("专注认真但不要急功近利。"); advices.add("赶紧脱单。"); req.setAttribute("adviceList", advices); req.getRequestDispatcher(VIEW_SHOW).forward(req, resp); } }
支持JspFragment的标签
文件内容
Topic.java
package cn.ljl.javaweb.demo.jsp2taglib.domain;/** * 这是一个pojo,用于封装一个问题及其唯一的答案. * @author lijinlong * */public class Topic { private String question; private String answer; public Topic(String question, String answer) { super(); this.question = question; this.answer = answer; } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } public String getAnswer() { return answer; } public void setAnswer(String answer) { this.answer = answer; }}
TopicServlet.java
package cn.ljl.javaweb.demo.jsp2taglib.servlet;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.ljl.javaweb.demo.jsp2taglib.domain.Topic;@WebServlet(name = "topicServlet", urlPatterns = { "/demo/jsp2taglib/topic" })public class TopicServlet extends HttpServlet { private static final long serialVersionUID = -2717086554249858215L; private static final String VIEW_SHOW = "/demo/jsp2taglib/topic.jsp"; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Topic> topicList = new ArrayList<Topic>(); topicList.add(new Topic("我很想做一件事,但是又害怕失败,怎么办?", "害怕失败比失败本身更可怕。失败只是一时的,害怕失败却会纠缠你很久。")); topicList.add(new Topic("最近被一些人否定了,我觉得自己很没用。", "别人轻视了你,是轻视你的过往;你轻视了自己,是放弃了你的未来。平静地对待,平静地加油。")); topicList.add(new Topic("我被一个同学骗了,再也不敢相信任何人了。", "所有的人都靠谱,就没有欺骗;所有的人都不靠谱,就欺骗不了。就是有人不可信,才会有些人可信,你要学会鉴别,不要失望。")); req.setAttribute("topicList", topicList); req.getRequestDispatcher(VIEW_SHOW).forward(req, resp); }}
总结
有必要对这一块做个总结,因为它看起来要“复杂”一点。支持动态属性,即支持不限定属性的个数和名称。demo.tld
<tag> <name>dynaAttr</name> <tag-class>cn.ljl.javaweb.demo.jsp2taglib.DynamicAttributesTag</tag-class> <body-content>empty</body-content> <dynamic-attributes>true</dynamic-attributes> </tag>
dynaAttr.jsp
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><%@ taglib uri="http://www.lijinlong.cn/demotaglib" prefix="demo"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>自定义标签 - dynaAttr</title></head><body><h2>指定了三个属性:</h2><demo:dynaAttr name="Adam" age="24" favorite="books" /></body></html>
DynaAttrServlet.java
package cn.ljl.javaweb.demo.jsp2taglib.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(name="dynaAttrServlet", urlPatterns={"/demo/jsp2taglib/dynaAttr"})public class DynaAttrServlet extends HttpServlet { private static final long serialVersionUID = -3146911293779890912L; private static final String VIEW_SHOW = "/demo/jsp2taglib/dynaAttr.jsp"; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher(VIEW_SHOW).forward(req, resp); } }
开源标签库
原标题:JSP2 自定义标签
关键词:JS