一.for标签
1.定义:
JSP中的for标签是JSTL中的核心标签库之一,用于迭代一个集合(比如数组、列表等)并在循环体中进行一些操作。
<c:forEach>
标签非常类似于Java中的for循环,它支持多种循环控制语句,如break、continue、varStatus 等。
2.语法:
<c:forEach var="item" items="${collection}"> <!-- 在这里生成 HTML 代码,用 ${item} 替代实际的循环变量值 --> </c:forEach>
其中,
var
参数指定了一个在每次循环中声明的局部变量名,并且该变量的值会设置为当前迭代中的集合元素。而items
参数指定了要循环的集合。在循环体中,可以使用
${item}
表达式引用变量或者在表达式中使用varStatus
变量访问迭代的状态信息。
3.自定义for标签
1.建立实现类
package com.lz.text; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class Text1 extends BodyTagSupport { /*** * fore标签 * * <c:forEach items="${}" var="c" * * items 类型:list * var 类型:string 线路: * 第二条: eval_boby_include * 第三条: eval_boby_again * */ //数据源遍历 private List<Object> items =new ArrayList<Object>(); //对象指针 private String var; /** * @return the items */ public List<Object> getItems() { return items; } /** * @param items * the items to set */ public void setItems(List<Object> items) { this.items = items; } /** * @return the var */ public String getVar() { return var; } public Text1() { super(); } /** * @param var * the var to set */ public void setVar(String var) { this.var = var; } @Override public int doStartTag() throws JspException { //第一条线路 if (items==null||items.size()==0) { return SKIP_BODY; } // 定义迭代器 Iterator<Object> it = items.iterator(); //获取数据源2,3数据 pageContext.setAttribute(var, it.next()); // 为了保留迭代器指针现有的位置 pageContext.setAttribute("it", it); return EVAL_BODY_INCLUDE; } @Override public int doAfterBody() throws JspException { Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it"); if (it.hasNext()) { //获取第一数据 pageContext.setAttribute(var, it.next()); // 为了保留迭代器指针现有的位置 pageContext.setAttribute("it", it); return EVAL_BODY_AGAIN; }else { return EVAL_PAGE; } } }
2.建立tid类
<tag> <name>for</name> <tag-class>com.lz.text.Text1</tag-class> <!--该标签有标签体--> <body-content>jsp</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>var</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag>
3.实现功能
二.数字标签
1.作用
当某些数据作用于多个页面时,或者频繁使用,就可以做成数据标签,减少代码
2.自定义数字标签
1.建立实现类
package com.lz.text; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class Text2 extends BodyTagSupport { /** * 数据标签 */ //存储数据名称 private String var; /** * @return the var */ public String getVar() { return var; } /** * @param var the var to set */ public void setVar(String var) { this.var = var; } public Text2(String var) { super(); this.var = var; } public Text2() { super(); } @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); //模拟数据 List<Stu> list = new ArrayList<Stu>(); list.add(new Stu(1,"客户")); list.add(new Stu(2,"喝水")); list.add(new Stu(3,"地方")); //将数据放在 var中 pageContext.setAttribute(var, list); return SKIP_BODY; } }
2.建立tid类
<tag> <name>dept</name> <tag-class>com.lz.text.Text2</tag-class> <!--该标签有标签体--> <body-content>jsp</body-content> <attribute> <name>var</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag>
3.实现
三. select标签
1.建立实现类
package com.lz.text; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; import com.sun.org.apache.bcel.internal.generic.RETURN; public class Text3 extends BodyTagSupport { /** * select标签 **/ private String selectVal; //下拉框 public Text3(String selectVal) { super(); this.selectVal = selectVal; } /** * @return the selectVal */ public String getSelectVal() { return selectVal; } /** * @param selectVal the selectVal to set */ public void setSelectVal(String selectVal) { this.selectVal = selectVal; } // 下拉框数据 private List<Object> items = new ArrayList<Object>(); public Text3() { super(); } public Text3(List<Object> items, String optionval, String optionText) { super(); this.items = items; this.optionval = optionval; this.optionText = optionText; } /** * @return the items */ public List<Object> getItems() { return items; } /** * @param items * the items to set */ public void setItems(List<Object> items) { this.items = items; } /** * @return the optionval */ public String getOptionval() { return optionval; } /** * @param optionval * the optionval to set */ public void setOptionval(String optionval) { this.optionval = optionval; } /** * @return the optionText */ public String getOptionText() { return optionText; } /** * @param optionText * the optionText to set */ public void setOptionText(String optionText) { this.optionText = optionText; } // 下拉框值 private String optionval; // 下拉框标签体内容 private String optionText; @Override public int doStartTag() throws JspException { // z没有标签提 ,页面需要下拉框值 JspWriter out = pageContext.getOut(); return super.doStartTag(); } public String toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, Exception { // StringBuffer 和 string 区别 //string处理字符串更加消耗服务器内存 StringBuffer sb=new StringBuffer("<select>"); for (Object object : items) { //取出对象具某个体属性值 String val=getObjAttrValue(object,optionval); String text=getObjAttrValue(object,optionval); sb.append("<option "+(val.equals(selectVal)?"selected":"")+" value='"+val+"'>"+text+"</option>"); } sb.append("</select>"); return sb.toString(); } /** * 取出对象具某个体属性值 * @param object * @param attr id/name * @return * @throws SecurityException * @throws NoSuchFieldException * @throws Exception * @throws IllegalArgumentException */ private String getObjAttrValue(Object object, String attr) throws NoSuchFieldException, SecurityException, IllegalArgumentException, Exception { Class clz = object.getClass(); Field f = clz.getDeclaredField(attr); f.setAccessible(true); return f.get(object).toString(); } }
2.建立tid
<tag> <name>select</name> <tag-class>com.lz.text.Text3</tag-class> <!--该标签有标签体--> <body-content>jsp</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>optionval</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>optionText</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>selectVal</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
3.实现