开发者社区> 问答> 正文

标签体外怎么获取标签变量?报错


上一期问题http://www.oschina.net/question/146876_227312

您好 根据你的提示还有网上资料参考 现在还有其他几个问题,我先放上代码

SqlQueryListTag ->registerTag("SqlQueryList",SqlQueryListTag.class);



import java.util.List;

import javax.servlet.http.HttpServletRequest;
import net.zhuawa.util.btltag.pojo.ParamSql;
import org.beetl.core.BodyContent;
import org.beetl.core.GeneralVarTagBinding;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;

public class SqlQueryListTag extends GeneralVarTagBinding {
	
	private String sql;
	private String attribute;
	private Integer pagesize;
	
	public void init(){
		String _sql = getAttributeValue("sql") != null ? getAttributeValue("sql").toString() :null;
		String _attribute = getAttributeValue("attribute") != null ? getAttributeValue("attribute").toString() :null;
		Integer _pagesize = getAttributeValue("pagesize") != null ? Integer.parseInt(getAttributeValue("pagesize").toString()) :0;
		setSql(_sql);
		setAttribute(_attribute);
		setPagesize(_pagesize);
	}
	
	@Override
	public void render() {
		init();
		BodyContent bodyContent = getBodyContent();
		ParamSql paramSql = MessageUtil.parseXml(bodyContent.getBody(),"param");
		String paramSqls = "";
		Object[] paramVaues = new Object[]{};
		if(null != paramSql){
			paramSqls = paramSql.getSql();
			paramVaues = paramSql.getObjects().length > 0 ? paramSql.getObjects() : paramVaues;
		}
		List<Record> queryList = Db.find(new StringBuilder(sql).toString().replace(":paramSql",paramSqls),paramVaues);
		
		HttpServletRequest request =  (HttpServletRequest)ctx.getGlobal("request");
		request.setAttribute("queryList", queryList);
		
//		this.binds(queryList);
//		this.doBodyRender();
//		int size = queryList.size();
//		if(size > 0){
//			for (int i = 0; i < size; i++) {
//				this.binds("index",i);
//				this.binds(queryList.get(i).getColumns(),i);
//				this.doBodyRender();
//			}
//		}
		
	}
	
	public String getSql() {
		return sql;
	}
	public void setSql(String sql) {
		this.sql = sql;
	}
	public String getAttribute() {
		return attribute;
	}
	public void setAttribute(String attribute) {
		this.attribute = attribute;
	}
	public Integer getPagesize() {
		return pagesize;
	}
	public void setPagesize(Integer pagesize) {
		this.pagesize = pagesize;
	}
}



html模板



<#SqlQueryList sql="select top 5 * from [Article] where info = '002' :paramSql  order by  time desc,order asc" pagesize="15";list>
            <ParamSql>
                <param sql = " and 1 = 1"  />
            </ParamSql>
               <%
            for(entity in list){
            %>
            <a>标题</a>:
            <%}%>
</#SqlQueryList>



报错>>表达式值为空(NULL):list,如果单独${ list}是可以打印出来的


还有一个问题这个标签获取标签体的body(

bodyContent.getBody()



如果要组织html代码的话(以上html代码处

<a>标题</a>:



)会被 bodyContent.getBody()一块读取, 我想在标签体外获取变量 并遍历 怎么设置变量,还有什么方法

<#SqlQueryList sql="select top 5 * from [Article] where info = '002' :paramSql  order by  time desc,order asc" pagesize="15" ;list>
            <ParamSql>
                <param sql = " and 1 = 1"  />
            </ParamSql>
</#SqlQueryList>
<%
   for(entity in list){
%>
  <a>标题</a>:
<%}%>





展开
收起
爱吃鱼的程序员 2020-06-14 17:27:19 688 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    如果 ParamSql放在标签最前面,则有一个更简单的方法,就是在 ParamSql实现里处理所有业务逻辑,大概过程如下:

    SqlQueryListTag的render方法:


    HTTPRequestrequest=ctx.getGlobal("request");
    request.setAttribute("SqlQueryListTag",this);
    super.render();


    此时beetl会首先执行ParamSql,逻辑可以放到在


    ParamSql.render:


    HTTPRequestrequest=ctx.getGlobal("request");
    SqlQueryListTagtag=request.getAttribute("SqlQueryListTag");
    Stringsql=tag.paras[1].get("sql");
    Stringcond=getBodyContent().toString();
    Listlist=dao.find(sql,cond);
    tag.binds(list);


    很遗憾,俩种情况都不支持,第二种赋值给其他变量,这是以后的版本计划。第一种看你的设计挺好的,但需要深度扩展Beetl执Tag类代码才行,改变beetl默认的执行路径:


    参考https://github.com/javamonkey/beetl2.0/blob/master/beetl-core/src/main/java/org/beetl/core/Tag.java。有一个最基础方法是执行标签体




    protectedvoiddoBodyRender()
    {
    bs.execute(ctx);


    }
    bs对应的是BlockStatment实例,他会执行所有的beetl语句
    ,而你需要做的是在SqlQueryListTag标签里,仅仅执行ParamSql标签,得出sql语句,访问dao得出list,然后调用binds(list).
    最后,执行除了ParamSql以外的所有语句,获得真正的输出(这是你的执行逻辑吧?)伪代码如下




    protectedvoiddoBodyRender()
    {
    TagStatmenttag=findTag(bs);//找到ParamSql标签
        tag.execute(ctx);//执行此标签,将最终查询结果放到ctx的request里
        Listlist=ctx.getGlobal("reuqest").getAttribut("queryList");
        this.binds(list);
        Statement[]others=findOthers(bs); 
        for(Statementst:others){
         st.execute(ctx)
        }


    }
    findTag,findOthers需要你自己实现,通过分析bs
    (https://github.com/javamonkey/beetl2.0/blob/master/beetl-core/src/main/java/org/beetl/core/statement/BlockStatement.java)
    你可以遍历他的属性nodes找到类型为TagStatment的,如果他的token.name="ParamSql",这就是你需要找到的ParamSql标签


    这些都需呀你有源代码情况下完成。有些难度,但是可以做到。 
    回复 @刘晓冰:标签外部定义一个变量,然后将list赋值给它第二种赋值给其他变量这个一定要
    2020-06-14 17:27:37
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载