标签控制页面
使用标签控制页面逻辑案例:
1、 防止盗链<c:referer site=”” page=””>
Jsp页面的内容:<c:referer site=”http://localhost”page=”index.jsp”>
Tld文件的描述:<tag>
<name>referer</name>
<tag-class>com.hbsi.web.tag.RefererTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>site</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>page</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
标签处理器:public class RefererTag extends SimpleTagSupport {
private String site;
private String page;
public void setSite(String site) {
this.site = site;
}
public void setPage(String page) {
this.page = page;
}
@Override
public void doTag() throws JspException, IOException {
// 获取request对象
JspContext jc = this.getJspContext();
PageContext pc = (PageContext) jc;
HttpServletRequest request = (HttpServletRequest)pc.getRequest();
HttpServletResponse response = (HttpServletResponse) pc.getResponse();
String referer = request.getHeader("referer");
if (referer == null || !referer.startsWith("http://localhost")) {
// 跳转到首页
//获取地址的完整路径
if (page.startsWith(request.getContextPath())) {
response.sendRedirect(page);
} else if (page.startsWith("/")) {//获取加/的路径
response.sendRedirect(request.getContextPath() + page);
} else {
//最不完整的路径
response.sendRedirect(request.getContextPath() + "/" + page);
}
// 不运行以下的代码
throw new SkipPageException();
}
}
}
2、条件选择<c:if test=””>
Jsp的页面:<%session.setAttribute("user","蛋蛋");%>
<c:if test="${user!=null}">
aaa
</c:if>
Tld文件的描述:<tag>
<name>if</name>
<tag-class>com.hbsi.web.tag.IfTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
标签处理器:public class IfTag extends SimpleTagSupport {
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException,IOException {
if(test){
JspFragmentjf=this.getJspBody();
jf.invoke(null);
}
}
}
3、迭代标签<c:foreach items=”” var=””>
Jsp的页面:< c:foreach items="${list}" var="str">
${str}
</c:foreach>
Tld文件的描述:<tag>
<name>foreach</name>
<tag-class>com.hbsi.web.tag.ForEachTag</tag-class>
<body-content>scriptless</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>
标签处理器:public class ForEachTag extends SimpleTagSupport {
private Object items;
private String var;
public void setItems(Object items) {
this.items = items;
}
public void setVar(String var) {
this.var = var;
}
@Override
public void doTag() throws JspException, IOException {
//得到集合对象
Collection collection=null;
if(items instanceof Map){
Map map=(Map)items;
//两列集合转换成单列;映射
collection=map.entrySet();
}else if(items instanceof Collection){
collection=(Collection)items;//集合
}else if(items.getClass().isArray()){
collection=new ArrayList();
int length=Array.getLength(items);
for(int i=0;i<length;i++){
collection.add(Array.get(items, i));
}
}
Iterator it=collection.iterator();
while(it.hasNext()){
Object obj=it.next();//一个元素
this.getJspContext().setAttribute(var,obj);
this.getJspBody().invoke(null);
}
}
}
jar包:标签处理器以及(META-INF)tld文件打成一个jar包