2.输出消息。system.out.println();来调试。
3.动态代理(Dynamic Proxy)。动态代理是一个特定的Java特性,它允许开发者引入proxy类,加进某一给定类之前,并通过某一给定接口截获所有调用。你可以在很短时间内用一个普通代理设置一个虚拟事件处理器,来查看事件发生顺序。当需要理解事件处理器时这是最简单和快捷的方法。
4.运行时剖析器(Run-time Profiler)。剖析器是通过特定的JVM hooks在系统中跟踪所有调用的强大工具。但是用它来跟踪执行过程是大才小用。
5.Aspects。面向方面编程。它是截获你的代码执行既快速又容易的方法。你可以围绕方法、构造器、属性访问等等有选择地设置hook,而不需要修改原始代码。在这些hook中,你可以打印调试消息。
1.2常用的。3.4.5网上找的。
实现起来比较麻烦,不推荐用。还是用用FineReport吧,绝对的报表软件NO.1birt动态SQL实现有三种方式:拼接SQL、绑定变量和让应用程序拼接,birt得到返回结果集方式。
1.拼接SQL方式
在数据集中写SQL,如下:
select id ,code,name,type
from type
选中数据集,点script方式,在beforeOpen事件中写如下SQL:
var type = reportContext.getParameterValue("type")
var name = reportContext.getParameterValue("name")
var query = this.queryText
if(type!=null){
query = query + " and type = "+type
}
if(name!=null&&name!=""){
query = query + " and name = '"+name+"'"
}
this.queryText = query
然后就可以了,当然,也可以不写第一步,直接所有的SQL都在beforeOpen中拼接。
但是,拼接SQL方式不仅复杂容易错,还会导致SQL注入风险。
2.绑定变量方式
在数据集的SQL中写如下SQL
select id ,code,name,type
from location
where (type = ? or ? is null )
and ( name = ? or ? is null )
然后配置数据集的参数,如下图:
最后一项是链接报表的参数。倒数第二项是默认值,填null
这种方式不会有SQL注入风险。
另外如果想要查看执行的SQL,可以在数据集的SCRIPT的beforeOpen事件写如下脚本:
importPackage( Packages.java.io )
out = new PrintWriter( new FileWriter("c:/debuginfo.txt", true ) )
out.println("queryText:-->"+ this.queryText)
out.close()
第三种是在应该程序处理查询,BIRT负责取出结果集展示,采用的是BIRT+SPRING+MYBATIS。
当然这里MYBATIS也可以是其它框架,思路一样。
BirtBeanFactory.java
public class BirtBeanFactory {
private static BeanFactory ctx
public synchronized static void setBeanFactory(BeanFactory beanFactory) {
ctx = beanFactory
}
public static Object getBean(String str) {
return ctx.getBean(str)
}
public static <T>T getBean(Class<T>clazz) {
return ctx.getBean(clazz)
}
}
GlobalInitializer.java
public class GlobalInitializer implements InitializingBean ,BeanFactoryAware{
private BeanFactory beanFactory
@Override
public void afterPropertiesSet() throws Exception {
BirtBeanFactory.setBeanFactory(beanFactory)
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory
}
}
BirtDataFactory.java
public class BirtDataFactory {
private TestService manager = (TestService) BirtBeanFactory.getBean(TestService.class)
public List<Location>findListByDto(LocationDto dto){
return manager.findListByDto(dto)
}
}
spring配置文件配置下:
<bean id="globalInitializer" class="com.test.birt.core.GlobalInitializer"/>
这样代码层就完成了,
在birt中创建脚本数据源
创建脚本数据集,在数据集的open事件中写这样的方法:
importPackage(Packages.com.test.birt.core)
importPackage(Packages.com.test.birt.report.dto)
factory = new BirtDataFactory()
dto = new TestDto()
dto.setCreateTimeStart(reportContext.getParameterValue("createTimeStart"))
dto.setCreateTimeEnd(reportContext.getParameterValue("createTimeEnd"))
if(reportContext.getParameterValue("dcId")!=null){
dto.setDcId(reportContext.getParameterValue("dcId").longValue())
}
collectList=factory.findListByDto(dto)
iterator = collectList.iterator()
在fecth阶段,写这样 的代码:
if(iterator.hasNext() == false ){
return false
} else{
var collectBean = iterator.next()
row["id"]=collectBean.getId()
row["name"] = collectBean.getName()
return true
}
这样就可以了。
在命令行输入:Java(javac) XXX的时候,java.exe(javac.exe)的工作就是找到合适的JRE来执行类文件。java.exe(javac.exe)依照如下逻辑来寻找JRE:
自己的目录下有没有JRE目录(这么说并不是非常精确,原因请详见JDK源代码,在此不作特别说明); 父目录下的JRE子目录; 查询Windows Registry (HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment);
所以,java.exe(javac.exe)的执行结果和“您计算机里面哪一个java.exe被执行,然后哪一套JRE被拿来执行java应用程序”有莫大的关系。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)