<%
List<String> ls=new ArrayList<String>();
ls.add("可乐");
ls.add("雪碧");
ls.add("鸡翅");
String name="可乐";
pageContext.setAttribute("name", name);
request.setAttribute("ls", ls);
%>
n:out
out标签中只有一个value属性,使用在自定义out标签的类中,我们需要写一个value属性,然后来一个无参数的构造方法,封装,最后再来一个doStarTag方法
package com.lishengnan.jsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
*
* @author 可乐
*
* 可乐的爱妃
*/
public class OutTag extends BodyTagSupport{
private Object value;
public OutTag() {
super();
// TODO Auto-generated constructor stub
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
JspWriter out = pageContext.getOut();
try {
out.println(value==null?"":value.toString());
} catch (Exception e) {
throw new RuntimeException();
}
return super.doStartTag();
}
}
**
在使用标签前再次强调要写这行代码
<%@taglib prefix=“k” uri="/kele"%>
k代表的是你自己定义的名称,/kele代表自定义的路径**
最后在jsp界面调用out标签
<k:out value="${ls }"/>
n:select
在使用自定义select标签时,使用到了反射,使用反射需要导入的jar包
在这些标签中select标签是最复杂的,因为select标签中包含了option,还有一些属性
再来一个doStarTag方法,还要定义个toHTML用来拼接和赋值
private List<Object> items;
private String name;
private String valueKey;//保存value中的key
private String textKey;//保存text中的key
public SelectTag() {
super();
// TODO Auto-generated constructor stub
}
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValueKey() {
return valueKey;
}
public void setValueKey(String valueKey) {
this.valueKey = valueKey;
}
public String getTextKey() {
return textKey;
}
public void setTextKey(String textKey) {
this.textKey = textKey;
}
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
JspWriter out = pageContext.getOut();
try {
String html = toHtml();
System.out.println(html);
out.println(html);
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException();
}
return super.doStartTag();
}
private String toHtml() throws Exception{
StringBuffer sb=new StringBuffer();
sb.append("");
return sb.toString();
}
最后在jsp界面调用if标签
<k:select items="${deptList }" valueKey="deptId" textKey="deptName"/>
n:if
if标签中只有一个test属性,使用在自定义if标签的类中,我们需要写一个test属性,然后来一个无参数的构造方法,封装,最后再来一个doStarTag方法
最后在jsp界面调用if标签
<k:if test="${name eq '可乐' }">
我夫李白
</k:if>
呈现出来的结果
n:forEach
forEach标签中有三个items,var,varStatus(可写可不写)属性,使用在自定义forEach标签的类中,我们需要写这个三个属性,再来一个status方法里面有两个属性index,count。然后来一个无参数的构造方法,封装,最后再来两个doAfterBody,doStarTag方法
@Override
public int doAfterBody() throws JspException {
// TODO Auto-generated method stub
Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");
while(it.hasNext()) {
if(null!=varStatus&&!"".equals(varStatus)) {
status at = (status) pageContext.getAttribute(varStatus);
at.increment();
pageContext.setAttribute(varStatus, at);
}
Object next = it.next();
pageContext.setAttribute(var, next);
return EVAL_BODY_AGAIN;
}
return super.doAfterBody();
}
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
if(null!=varStatus&&!"".equals(varStatus)) {
pageContext.setAttribute(varStatus, new status());
}
if(items!=null&&0!=items.size()) {
Iterator<Object> it = items.iterator();
Object next = it.next();
pageContext.setAttribute(var, next);
pageContext.setAttribute("it", it);
return EVAL_BODY_INCLUDE;
}
return super.doStartTag();
}
最后在jsp界面调用forEach标签
<ul>
<k:forEach items="${ls }" var="n" varStatus="v">
<li>${n },${v.index },${v.count }</li>
</k:forEach>
</ul>
n:set
在写set标签前,先搞一个假的数据库entity和dao包,select也用的到
set和其他的方法没什么区别,也是doStarTag有点变化,因为set不能输出,所有后面用了一个out输出了结果
最后在jsp界面调用set标签
<k:set value="deptList"/><br/>
<k:out value="${deptList }"/>
jsp生命周期中的方法,在自定义标签中用到的是这两个
总结:其实这些自定义方法并没有很难,大多数都是一样,只要知道每一个标签一个实现怎么样的效果,那么就很容易把这个标签学会