开发<c:if>标签开发<c:if><c:else>标签开发迭代标签源代码

本文介绍了如何使用Java开发自定义的JSP标签,包括条件判断标签&lt;c:if&gt;、选择结构标签&lt;c:choose&gt;、&lt;c:when&gt;、&lt;c:otherwise&gt;以及迭代标签&lt;c:foreach&gt;。通过具体实现示例,展示了如何根据不同条件处理页面内容。

• 开发<c:if>标签

package com.hbsi.web.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class IfTag extends SimpleTagSupport {

private boolean test;

public void setTest(boolean test) {

this.test = test;

}

@Override

public void doTag() throws JspException, IOException {

// TODO Auto-generated method stub

if(test){

//处理标签体

JspFragment jf=this.getJspBody();

jf.invoke(null);

}

}

}

• 开发<c:if><c:else>标签

package com.hbsi.web.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ChooseTag extends SimpleTagSupport {

private boolean flag=false;

public boolean isFlag() {

return flag;

}

public void setFlag(boolean flag) {

this.flag = flag;

}

@Override

public void doTag() throws JspException, IOException {

// TODO Auto-generated method stub

//对标签体处理

JspFragment jf=this.getJspBody();

jf.invoke(null);

}

}

package com.hbsi.web.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class OtherwiseTag extends SimpleTagSupport {

@Override

public void doTag() throws JspException, IOException {

// TODO Auto-generated method stub

ChooseTag parent=(ChooseTag) this.getParent();

if(!parent.isFlag()){

this.getJspBody().invoke(null);

parent.setFlag(true);

}

}

}

package com.hbsi.web.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class WhenTag extends SimpleTagSupport {

private boolean test;

public void setTest(boolean test) {

this.test = test;

}

@Override

public void doTag() throws JspException, IOException {

// TODO Auto-generated method stub

//获取父标签对象

ChooseTag parent=(ChooseTag)this.getParent();

if(test&&!parent.isFlag()){

//处理标签体

this.getJspBody().invoke(null);

//有分支执行过设为真

parent.setFlag(true);

}

}

}

• 开发迭代标签

• package com.hbsi.web.tag;

• import java.io.IOException;

• import java.lang.reflect.Array;

• import java.util.ArrayList;

• import java.util.Arrays;

• import java.util.Collection;

• import java.util.Iterator;

• import java.util.List;

• import java.util.Map;

• import javax.servlet.jsp.JspException;

• import javax.servlet.jsp.tagext.SimpleTagSupport;

• 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 {

• // TODO Auto-generated method stub

• //得到集合对象

• //List list=(List) items;

• //Iterator it=list.iterator();

• 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 instanceof Object[]){

• //

• // Object[] objs=(Object[]) items;

• // //倒换到一个一个集合中

• // collection=Arrays.asList(objs);

• //

• // }

• //应用反射机制

• 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);

• }

• }

• }

<程序> → <变量说明部分> <语句部分> <变量说明部分> → <变量说明部分> <变量说明语句> ; | <变量说明语句> ; <变量说明语句> → <变量说明> <标识符列表> <变量说明> → int | string | bool <标识符列表> → <标识符列表> , <标识符> | <标识符> <标识符> → $ <字母> <字母序列> $ <语句部分> → <语句部分> ; <语句> | <语句> <语句> → <赋值语句>|<条件语句>|<循环语句> <赋值语句> → <标识符> := <表达式> <表达式> → <disjunction> <disjunction> → < conjunction > | <disjunction> or < conjunction > < conjunction > → < inversion > | < conjunction > and < inversion > < inversion > → not < inversion > | < 关系表达式 > < 关系表达式 > → <算术表达式> <关系运算符> <算术表达式> | <算术表达式> <算术表达式> → <term> | <算术表达式> <加法运算符> <term> <term> → <factor>| <term> <乘法运算符> <factor> <factor> → <标识符> | true | false | <字符串> | <整数数列> | ( <表达式> ) <关系运算符> → < | > | <> | >= | <= | == <加法运算符> → + | - <乘法运算符> → * | / | % <字符串> → “<字母序列>” <字母序列> → <字母序列><数字>|<字母序列><字母>|ε <整数数列> → <整数数列><数字>|<数字> <条件语句> → if (<表达式>)<嵌套语句> else <嵌套语句> <循环语句> → while (<表达式>): <嵌套语句> <嵌套语句> → <语句>; |<复合语句> <复合语句> → { <语句部分> } <字母> → a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z <数字> → 0|1|2|3|4|5|6|7|8|9 这些所有的语法定义与语义定义都需要添加,我该如何操作
11-17
我现在需要在vs studio中用C++编写一个简易编译器,编译器中需要包括词法编译系统,语法编译系统,语义分析程序,编译器整体采用一遍扫描,不采用多遍扫描 词法分析采用有穷自动机 语法分析采用自上而下的递归下降分析 语义分析分别采用四元式(TAC)和抽象语法树(AST)两种中间代码, 告诉我如何操作,而且编译器能够满足以下的文法<程序> → <变量说明部分> <语句部分> <变量说明部分> → <变量说明部分> <变量说明语句> ; | <变量说明语句> ; <变量说明语句> → <变量说明> <标识符列表> <变量说明> → int | string | bool <标识符列表> → <标识符列表> , <标识符> | <标识符> <标识符> → < 字母 > < 字母序列 > <字母><字母序列> <语句部分> → <语句部分> ; <语句> | <语句> <语句> → <赋值语句>|<条件语句>|<循环语句> <赋值语句> → <标识符> := <表达式> <表达式> → → < conjunction > | or < conjunction > < conjunction > → < inversion > | < conjunction > and < inversion > < inversion > → not < inversion > | < 关系表达式 > < 关系表达式 > → <算术表达式> <关系运算符> <算术表达式> | <算术表达式> <算术表达式> → | <算术表达式> <加法运算符> → | <乘法运算符> → <标识符> | true | false | <字符串> | <整数数列> | ( <表达式> ) <关系运算符> → < | > | <> | >= | <= | == <加法运算符> → + | - <乘法运算符> → * | / | % <字符串> → “<字母序列>” <字母序列> → <字母序列><数字>|<字母序列><字母>|ε <整数数列> → <整数数列><数字>|<数字> <条件语句> → if (<表达式>)<嵌套语句> else <嵌套语句> <循环语句> → while (<表达式>): <嵌套语句> <嵌套语句> → <语句>; |<复合语句> <复合语句> → { <语句部分> } <字母> → a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z <数字> → 0|1|2|3|4|5|6|7|8|9
最新发布
11-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值