J2EE之自定义标签的使用02
前言
前面我们学习了一些jsp自定义标签的一些基础知识,有out标签、if标签、set标签,今天我们来继续学习有关jsp自定义标签的知识,让我们根据思维导图一起来看看吧。
1. 自定义yx:foreach标签
1.1 创建yx:foreach标签的助手类
ForeachTag助手类
package com.YX.JSP.Tag; import java.util.Iterator; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; /*** * 自定义foreach标签的标签助手类 * 格式分析:<yx:foreach items="${}" var = "c"> 分析属性 items: list<Object>(类型) var : * String(类型) * * 分析线路: 第二条:Eval_body_include 第三条:eval_body_again * * @author 君易--鑨 * */ public class ForeachTag extends BodyTagSupport { // 定义标签里面的两个属性 private List<Object> items;// 存储数据的数据源 private String var;// 指针指向集合对象中的一个对象数据 // 获取两个属性的set和get方法 public List<Object> getItems() { return items; } public void setItems(List<Object> items) { this.items = items; } public String getVar() { return var; } public void setVar(String var) { this.var = var; } // 编写doStarTag()方法 @Override public int doStartTag() throws JspException { if (items==null || items.size()==0) //数据源为空 return SKIP_BODY;//跳过主体 // 获取到集合对象的迭代器 Iterator<Object> it = items.iterator(); // 通过pageContext.setAttribute的方法将集合中的每一个对象数据存储到对象数据容器中 pageContext.setAttribute(var, it.next()); // 为保留迭代器时针先有的位置,将Iterator对象利用setAttribute保存起来,方便后面调用 pageContext.setAttribute("it", it); return EVAL_BODY_INCLUDE; } // 编写doAfter()方法 @Override public int doAfterBody() throws JspException { // 获取之前保存的迭代器对象 Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");// 强转 if (it.hasNext()) {// 判断it迭代器中中是否有下一个数值;有 // 将迭代器中的下一个对象数值存储到对象容器中 pageContext.setAttribute(var, it.next()); // 再次保存迭代器时针原有的位置,方便下次再次调用 pageContext.setAttribute("it", it); // 返回EVAL_BODY_AGAIN再次计算主体 return EVAL_BODY_AGAIN; } else {// 迭代器后面没有下一个数据了 return SKIP_BODY;// 继续往下执行 } } }
1.2 在后缀名为.tld的文件中添加自定义foreach标签(for)
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <!-- 标签库描述符 --> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Simple Tags</short-name> <!--设置导入的路径名 --> <uri>/YX</uri> <!--添加标签 --> <tag> <!-- 设置标签名 --> <name>for</name> <!-- 绑定标签助手类 --> <tag-class>com.YX.JSP.Tag.ForeachTag</tag-class> <!--设置标签内容信息类型 --> <body-content>JSP</body-content> <!--添加属性 --> <attribute> <!-- 设置属性名(与助手类定义的要一致 ) --> <name>var</name> <!-- 设置是否为必要属性 --> <required>true</required> <!-- 设置是否接受El表达式 --> <rtexprvalue>false</rtexprvalue> <description>是对象数据用于输出页面</description> </attribute> <!--添加属性 --> <attribute> <!-- 设置属性名(与助手类定义的要一致 ) --> <name>items</name> <!-- 设置是否为必要属性 --> <required>true</required> <!-- 设置是否接受El表达式 --> <rtexprvalue>true</rtexprvalue> <description>是集合数据对象用于将数据带到页面上</description> </attribute> </tag> </taglib>
1.3 定义一个实体类用于创建数据实现效果
Student实体类
package com.YX.JSP.entity; /** * 实体对象:学生 * 属性:sid,sname,ssex,sage * * @author 君易--鑨 * */ public class Student { // 封装属性 private int sid;//学号 private String sname;//姓名 private String ssex;//性别 private int sage;//年龄 /** * 无参构造 */ public Student() { // TODO Auto-generated constructor stub } // 获取属性的get和set方法 public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } /** * 全参构造 * @param sid * @param sname * @param ssex * @param sage */ public Student(int sid, String sname, String ssex, int sage) { super(); this.sid = sid; this.sname = sname; this.ssex = ssex; this.sage = sage; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + ", ssex=" + ssex + ", sage=" + sage + "]"; } }
1.5 在jsp中引入自定义标签并使用
<%@page import="java.util.ArrayList"%> <%@page import="com.YX.JSP.entity.Student"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 导入自定义的yx标签 --> <%@ taglib uri="/YX" prefix="yx" %> <!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> <!--嵌套java代码存储要输出的数据 --> <% //实例化一个list集合对象 List<Student> list=new ArrayList<Student>(); //向集合中添加数据方便后续遍历显示到页面 list.add(new Student(1,"君易","男",18)); list.add(new Student(2,"木易","男",19)); list.add(new Student(3,"君易--鑨","男",20)); list.add(new Student(4,"木易鑫","男",22)); //利用request对象将list集合传输到页面上 request.setAttribute("list", list); %> <p>自定义yx:foreach标签实现结果</p> <yx:for items="${list }" var="yx"> <!--数据遍历 --> <p>编号:${yx.sid },姓名:${yx.sname },性别:${yx.ssex },年龄:${yx.sage }</p> </yx:for> </body> </html>
页面输出的结果
1.6 注意事项:
- 在jsp中记得导入自己写的自定义标签
2. 数据标签
2.1 概念:
JSP(JavaServer Pages)中,数据标签通常被称为JSP标签库(JSP tag library)或JSTL标签(JSTL tag),是一种使用XML与Java编写的模板标记语言,用于简化JSP页面的开发。
2.2 作用:
当某一些数据在多个页面或者多个地方被频繁的使用时,就可以制作成数据标签用于减少代码量,提高开发效率。
2.3 使用:
2.3.1 创建一个数据标签助手类
YxTag助手类
package com.YX.JSP.Tag; import java.util.ArrayList; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; import com.YX.JSP.entity.Student; public class YxTag extends BodyTagSupport { // 定义一个存放数据的名称 private String var; // 获取var的set和get标签 public String getVar() { return var; } public void setVar(String var) { this.var = var; } // 编写doStartTag()方法 @Override public int doStartTag() throws JspException { // 模拟访问获取数据库里的数据 //实例化一个list集合对象 List<Student> list=new ArrayList<Student>(); //向集合中添加数据方便后续遍历显示到页面 list.add(new Student(1,"君易","男",18)); list.add(new Student(2,"木易","男",19)); list.add(new Student(3,"君易--鑨","男",20)); list.add(new Student(4,"木易鑫","男",22)); // 利用pageContext将数据库里的数据放入var中存储起来 pageContext.setAttribute(var, list); return SKIP_BODY; } }
2.3.2 在.tld文件中添加数据标签
lly标签
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <!-- 标签库描述符 --> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Simple Tags</short-name> <!--设置导入的路径名 --> <uri>/YX</uri> <!--添加数据标签 --> <tag> <!-- 设置标签名 --> <name>lly</name> <!--绑定助手类 --> <tag-class>com.YX.JSP.Tag.YxTag</tag-class> <!--标签信息内容类型 --> <body-content>JSP</body-content> <!--添加属性 --> <attribute> <!-- 设置属性名 --> <name>var</name> <!-- 是否为必要属性 --> <required>true</required> <!-- 是否遵循el表达式 --> <rtexprvalue>false</rtexprvalue> <description>该标签是数据标签</description> </attribute> </tag> </taglib>
2.3.3 在jsp中运用数据标签:
<%@page import="java.util.ArrayList"%> <%@page import="com.YX.JSP.entity.Student"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 导入自定义的yx标签 --> <%@ taglib uri="/YX" prefix="yx" %> <!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> <p>自定义yx:lly数据标签实现结果</p> <yx:lly var="yx"></yx:lly> 老师所管理的学生:${yx } </body> </html>
页面输出的结果
3. select自定义标签
3.1 新建一个标签助手类(SelectTag)
package com.YX.JSP.Tag; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class SelectTag extends BodyTagSupport { // 定义标签属性 // 下拉框的数据源 private List<Object> items=new ArrayList<Object>(); // option标签的value值 private String optionVal; // option标签的文本内容 private String optionText; // 数据库中存储的数据回显到页面上,用下拉框绑定对应的选项 private String selectedVal; // 获取对应属性的set和get方法 public List<Object> getItems() { return items; } public void setItems(List<Object> items) { this.items = items; } public String getOptionVal() { return optionVal; } public void setOptionVal(String optionVal) { this.optionVal = optionVal; } public String getOptionText() { return optionText; } public void setOptionText(String optionText) { this.optionText = optionText; } public String getSelectedVal() { return selectedVal; } public void setSelectedVal(String selectedVal) { this.selectedVal = selectedVal; } // 编写doStart方法 @Override public int doStartTag() throws JspException { // 由于yx:select标签没有标签体,页面又要输出下拉框的内容,所以要获取jsp流对象输出 JspWriter out = pageContext.getOut(); try { // 输出到页面上 out.print(toJSp()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return super.doStartTag(); } /** * 拼接的方法 * @return * @throws SecurityException * @throws NoSuchFieldException * @throws Exception */ private String toJSp() throws Exception { StringBuffer sb=new StringBuffer("<select>"); // 中间的选项利用for循环遍历items for (Object object : items) { // 获取某个对象的某个属性值 String val=getObjAttrValue(object,optionVal);//id String text=getObjAttrValue(object,optionText);//name // 拼接选项 sb.append("<option "+(val.equals(selectedVal)? "selected" :"")+" value='"+val+"'>"+text+"</option>"); } // 拼接select结束标签 sb.append("</select>"); return sb.toString(); } /** * 获取某个对象的某个属性值 * @param object * @param attr id/name * @return * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalAccessException * @throws IllegalArgumentException */ private String getObjAttrValue(Object object, String attr) throws Exception{ //获取类类 Class c = object.getClass(); // 根据所传的值获取对应的属性 Field f = c.getDeclaredField(attr); // 获取私有化的访问权限 f.setAccessible(true); // 返回对应属性的值 return f.get(object).toString(); } }
3.2 在.tld文件中添加select标签
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <!-- 标签库描述符 --> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Simple Tags</short-name> <!--设置导入的路径名 --> <uri>/YX</uri> <!-- 添加select标签 --> <tag> <!-- 设置标签名 --> <name>select</name> <!-- 绑定标签熟手类 --> <tag-class>com.YX.JSP.Tag.SelectTag</tag-class> <!--设置标签内容信息类型 --> <body-content>JSP</body-content> <!--添加属性 --> <attribute> <!-- 设置属性名 --> <name>items</name> <!-- 是否为必要属性 --> <required>true</required> <!-- 是否遵循el表达式 --> <rtexprvalue>true</rtexprvalue> <!-- 标签说明 --> <description>该标签是数据标签</description> </attribute> <!--添加属性 --> <attribute> <!-- 设置属性名 --> <name>optionVal</name> <!-- 是否为必要属性 --> <required>true</required> <!-- 是否遵循el表达式 --> <rtexprvalue>false</rtexprvalue> <!-- 标签说明 --> <description>该标签是数据标签</description> </attribute> <!--添加属性 --> <attribute> <!-- 设置属性名 --> <name>optionText</name> <!-- 是否为必要属性 --> <required>true</required> <!-- 是否遵循el表达式 --> <rtexprvalue>false</rtexprvalue> <!-- 标签说明 --> <description>该标签是数据标签</description> </attribute> <!--添加属性 --> <attribute> <!-- 设置属性名 --> <name>selectedVal</name> <!-- 是否为必要属性 --> <required>false</required> <!-- 是否遵循el表达式 --> <rtexprvalue>true</rtexprvalue> <!-- 标签说明 --> <description>该标签是数据标签</description> </attribute> </tag> </taglib>
3.3创建实体类(Student )
package com.YX.JSP.entity; /** * 实体对象:学生 * 属性:sid,sname,ssex,sage * * @author 君易--鑨 * */ public class Student { // 封装属性 private int sid;//学号 private String sname;//姓名 private String ssex;//性别 private int sage;//年龄 /** * 无参构造 */ public Student() { // TODO Auto-generated constructor stub } // 获取属性的get和set方法 public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } /** * 全参构造 * @param sid * @param sname * @param ssex * @param sage */ public Student(int sid, String sname, String ssex, int sage) { super(); this.sid = sid; this.sname = sname; this.ssex = ssex; this.sage = sage; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + ", ssex=" + ssex + ", sage=" + sage + "]"; } }
3.4 在jsp文件中运用select标签
3.4.1 模拟添加下拉框选项
jsp代码
<%@page import="java.util.ArrayList"%> <%@page import="com.YX.JSP.entity.Student"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 导入自定义的yx标签 --> <%@ taglib uri="/YX" prefix="yx" %> <!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> <!--嵌套java代码存储要输出的数据 --> <% //实例化一个list集合对象 List<Student> list=new ArrayList<Student>(); //向集合中添加数据方便后续遍历显示到页面 list.add(new Student(1,"君易","男",18)); list.add(new Student(2,"木易","男",19)); list.add(new Student(3,"君易--鑨","男",20)); list.add(new Student(4,"木易鑫","男",22)); //利用request对象将list集合传输到页面上 request.setAttribute("list", list); %> <p>自定义select标签实现结果</p> <!--items取上面的list optionVal取对象中的sid optionText取对象中的sname --> <p>模拟添加下拉框的选项</p> <yx:select items="${list }" optionVal="sid" optionText="sname"></yx:select> </body> </html>
页面输出结果
3.4.2 模拟从数据库中获取数据进行相应绑定
jsp代码
<%@page import="java.util.ArrayList"%> <%@page import="com.YX.JSP.entity.Student"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 导入自定义的yx标签 --> <%@ taglib uri="/YX" prefix="yx" %> <!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> <!--嵌套java代码存储要输出的数据 --> <% //实例化一个list集合对象 List<Student> list=new ArrayList<Student>(); //向集合中添加数据方便后续遍历显示到页面 list.add(new Student(1,"君易","男",18)); list.add(new Student(2,"木易","男",19)); list.add(new Student(3,"君易--鑨","男",20)); list.add(new Student(4,"木易鑫","男",22)); //利用request对象将list集合传输到页面上 request.setAttribute("list", list); %> <p>自定义select标签实现结果</p> <p>模拟从数据中获取数据绑定下拉框的选项</p> <yx:select items="${list }" optionVal="sid" optionText="sname" selectedVal="2"></yx:select> <yx:select items="${list }" optionVal="sid" optionText="sname" selectedVal="3"></yx:select> <yx:select items="${list }" optionVal="sid" optionText="sname" selectedVal="1"></yx:select> </body> </html>
页面输出结果
3.5 注意事项
- 事项1
- 事项2
- 事项3
- 事项4