bboss 快速入门


bboss 快速入门 作者: yin_bp http://yin-bp.iteye.com bboss 快速入门 http://www.iteye.com - 做最棒的软件开发交流社区 第 1 / 188 页 本书由ITeye提供的电子书DIY功能自动生成于 2012-02-22 目 录 1. quick start 1.1 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 bbossgroups mvc demo构建部署方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3 bboss aop/ioc依赖注入功能介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 1.4 bboss mvc处理ajax get方法中文乱码方式纪实 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 1.5 bboss 序列化功能详解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.6 bboss 持久层框架直接返回基础数据类型和基础数据类型List集合介绍 . . . . . . . . . . . . . . . . . . . . . . .30 1.7 bboss mvc中ModelMap和ModelAndView的使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33 1.8 基于bbossgroups持久层框架实现数据库分页查询 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35 1.9 bboss 动态sql使用foreach循环示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43 1.10 bbossgroups 3.x中rpc使用介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 1.11 bbossgroups 开发系列文章之一 最佳实践 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50 1.12 bbossgroups 持久层模板sql变量参数设置的三种方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73 1.13 bbossgroups mvc大文件上传及or mapping存储大文件机制详解 . . . . . . . . . . . . . . . . . . . . . . . . .77 1.14 bbossgroups 3.x持久层行处理器使用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81 1.15 bbossgroups 组件容器的使用方法浅析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85 1.16 bbossgroups框架发布的jar包和依赖jar包概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90 1.17 bboss mvc基础配置介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 1.18 bbossgroups标签库使用大全(续) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98 1.19 bbossgroups标签使用大全 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102 http://yin-bp.iteye.com 第 2 / 188 页 1.20 bbossgroups持久层框架查询返回Map对象和Map列表对象api . . . . . . . . . . . . . . . . . . . . . . . . . .117 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118 1.22 bbossgroups持久层框架数据源配置文件实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125 1.23 bbossgroups持久层框架动态sql语句配置和使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129 1.24 浅谈 bboss mvc 页面访问控制实现机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133 1.25 浅谈 BbossMVC 数据绑定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157 1.27 bbossgroups 3.1中webservice引擎使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174 1.28 bboss taglib 列表/分页的排序功能介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178 1.29 获取数据库连接-bboss persistent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183 1.30 bbossgroups 项目sourceforge下载地址 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186 http://yin-bp.iteye.com 第 3 / 188 页 1.1 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 发表时间: 2011-05-02 关键字: bboss mvc, bbossgroups, eclipse, tomcat, jdk15 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 本文简单地介绍搭建基于bboss mvc框架的eclipse 工程以及编写第一个实例的步骤: 1.首先准备好eclipse或者myeclipse 2.从官网上下载bboss mvc框架的demo工程: http://www.bbossgroups.com/file/download.htm?fileName=demoproject.zip 3.将demoproject.zip解压到相应的目录,例如: d:/workspace/demoproject 4.打开eclipse/myeclipse 将demoproject项目导入即可 5.这样你就搭建好一个完整的bboss mvc的demoproject开发环境了 6.现在可以开发自己的第一个mvc 例子了 开发mvc例子的步骤: 1.新建控制器类web.BbossTest d:/workspace/demoproject/src/web/BbossTest.java BbossTest编写控制器方法testBboss: package web; import org.frameworkset.web.servlet.ModelAndView; public class BbossTest { public ModelAndView testBboss(){ http://yin-bp.iteye.com 1.1 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 第 4 / 188 页 return new ModelAndView("path:view"); } } 为了简单起见,我们在控制器方法中只是做了个简单的页面跳转:path:view,这是一个地址别名,具体的配置 见下一步。 2.控制器类写好后就可以写相应的配置文件,新建xml文件bboss-test.xml存放在以下目录: d:/workspace/demoproject/WebRoot/WEB-INF/conf/bboss-test.xml,内容为 这里需要说明的就是name = "/test/*.page",部分指定了控制器对应的url映射规则,*号对应控制器 web.BbossTest中的方法名,class="web.BbossTest" 指定了控制器类,singlable="true" 部分标识了该控制 器为单例模式,path:view="/index1.jsp"指定了别名path:view对应的实际jsp页面,控制器方法跳转时需要用 到 3.编写jsp页面index1.jsp,存放的地址为: d:/workspace/demoproject/WebRoot/index1.jsp 内容为: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%> <% http://yin-bp.iteye.com 1.1 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 第 5 / 188 页 String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> My JSP 'index.jsp' starting page 1111dfasdfasdfadsf 4.这样你的例子就做好了,编译以下工程,下面我们来在tomcat中部署我们的例子: 在tomcat 6的配置目录,例如: E:\environment\apache-tomcat-6.0.20\conf\Catalina\localhost下新建一个demoproject.xml文件,内容 为: http://yin-bp.iteye.com 1.1 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 第 6 / 188 页 5.启动tomcat,在浏览器重输入以下地址: http://localhost:8080/demoproject/test/testBboss.page 即可看到你的例子的效果哦。 同时你也可以访问demo中内置的实例: http://localhost:8080/demoproject/examples/index.page 到此,搭建bbossmvc eclipse开发工程过程和开发例子过程就介绍完了。 http://yin-bp.iteye.com 1.1 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 第 7 / 188 页 1.2 bbossgroups mvc demo构建部署方法 发表时间: 2011-05-02 关键字: bboss MVC, Tomcat, Derby, JDBC, bbossgroups bbossgroups mvc demo部署方法: 1.环境准备 jdk 1.5或以上 tomcat 6 2.从sourceforge下载最新的源码包 官网 bbossgroups-3.5 sourceforge bbossgroups-3.5 3.下载后解压,进入bboss-mvc工程目录,执行build.bat命令,构建demo应用war包 5.然后修改构建出来的包bboss-mvc.war\WEB-INF\classes\poolman.xml文件中的内容: jdbc:derby:D:/workspace/bbossgroups-3.5/bboss-mvc/database/cimdb 即可,bbossgroups 3.5中derby数据库存放目录为bbossgroups-3.5.zip解包后的根目录下。 如果poolman.xml中不是derby的配置,则拷贝以下xml段替换poolman.xml内容: local cim false org.apache.derby.jdbc.EmbeddedDriver jdbc:derby:D:/workspace/bbossgroups-3.5/bboss-mvc/database/cimdb http://yin-bp.iteye.com 1.2 bbossgroups mvc demo构建部署方法 第 8 / 188 页 READ_COMMITTED true false 2 2 10 false true 50 true false 120000 240000 5 true composite 60 false true 6.将bboss-mvc.war拷贝到tomcat的webapps,启动tomcat 7.tomcat启动完毕后,在浏览器重输入以下地址: http://localhost:8080/bboss-mvc/index.htm http://yin-bp.iteye.com 1.2 bbossgroups mvc demo构建部署方法 第 11 / 188 页 整个部署过程就完成了额 http://yin-bp.iteye.com 1.2 bbossgroups mvc demo构建部署方法 第 12 / 188 页 1.3 bboss aop/ioc依赖注入功能介绍 发表时间: 2012-02-12 关键字: bboss aop/ioc, 依赖注入, 循环依赖注入, 局部属性引用 bboss aop 3.5及后续版本中改进的ioc依赖注入功能介绍。 一、新的ioc功能特点 改进后的ioc依赖注入机制支持完整的循环依赖注入功能,并且支持任何层级的对象及对象属性引用,refid属性 值的格式实例如下: 在介绍refid属性的各种引用格式及含义之前,我们先看一个完整的实例: refid属性的所有格式及含义说明如下: refid格式 含义 1.attr:serviceid 根据服务标识引用容器服务组件 2.attr:serviceid[0] 根据服务标识及数组下标引用容器服务组件对应的下标为0对应的元素(容 器服务组件类型为list,set,array三种类型) 3.attr:serviceid[key] 根据服务标识及map key引用容器服务组件对应的索引为key对应的元素 (容器服务组件类型为map类型) http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 13 / 188 页 4.attr:serviceid{0} 根据服务标识及构造函数参数位置下标引用容器服务组件对应的下标为0对 应的构造函数参数(容器服务组件为构造函数注入) 5.attr:serviceid->innerattributename 根据服务标识及服务组件的属性名称引用容器服务组件属性值 6.attr:serviceid->innerattributename[0] 根据服务标识及服务属性名称以及属性数组下标引用容器服务组 件属性中对应的下标为0对应的元素(容器服务组件类型为list,set,array三种类型) 7.attr:serviceid->innerattributename[key] 根据服务标识及服务属性名称以及map key引用容器服务组件 属性对应的索引为key对应的元素(容器服务组件类型为map类型) 8.attr:serviceid->innerattributename{0} 根据服务标识及服务属性名称对应属性的造函数参数位置下标引 用容器服务组件对应的下标为0对应的构造函数参数(容器服务组件为构造函数注入) 其中属性的引用是不限制层级的。 下面举例来说明上述每种情况的使用方法。 二、引用使用详解 通过在xml配置文件中配置一个的复杂对象Test1组件来说明IOC的循环依赖功能以及局部属性引用功能。 涉及的三个对象Test1、Test2、Test3定义如下: Test1对象: package org.frameworkset.soa.xblink; import java.util.List; import java.util.Map; public class Test1 { Test2 test2; Test3 test3; Test1 test4; Test1 test5; Test2 test6; Test2 test7; Test2 test8; Test1 test9; Test1 test10; Test1 test11; Test2 test12; Map testmap; List testlist; Test1[] testarray; } http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 14 / 188 页 Test2对象: package org.frameworkset.soa.xblink; public class Test2 { Test1 test1; Test3 test3; } Test3对象: package org.frameworkset.soa.xblink; public class Test3 implements java.io.Serializable{ Test2 test2; } 看以看出几个对象之间的引用是错综复杂的,基于此我们再来看看test1组件的配置:包括了Test1所有属性的 配置,每个属性的配置都包含了详细的含义说明,这些属性的配置基本涵盖了bboss ioc依赖注入的所有功能特 性,本文中暂不介绍针对构造函数参数的引用功能: 案例一 http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 15 / 188 页 http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 16 / 188 页 下面看看如何加载上述配置并获取test1对象,然后看看xml-bean相互转换的过程: //加载配置文件,构建一个组件容器对象 BaseApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/soa/xblink/testcontainref.xml"); //获取组件test1 Test1 test1 = context.getTBeanObject("test1", Test1.class); //重新将组件序列化为xml串 String ss = ObjectSerializable.toXML(test1); //将xml串ss转换为对象test_ Test1 test1_ = (Test1)ObjectSerializable.toBean(ss,Test1.class); 再看看一个包含二维元素引用的示例配置: http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 17 / 188 页 http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 18 / 188 页 test1中的属性innerelement引用了list属性testlist的第二个元素对应的数组中的第一个数据: testlist属性的定义如下: 其中的第二个元素,又是对test1中的一个数组属性testarraybasic的引用: testarraybasic属性的定义如下: http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 19 / 188 页 http://yin-bp.iteye.com 1.3 bboss aop/ioc依赖注入功能介绍 第 20 / 188 页 1.4 bboss mvc处理ajax get方法中文乱码方式纪实 发表时间: 2012-02-10 关键字: bboss mvc, json, ajax bboss mvc处理ajax get方法中文乱码方式纪实: 尹标平(122054810) 22:46:16 关于胡雅辉同学所提ajax get方式提交中文参数乱码问题解决办法: $.ajax({ url:'${pageContext.request.contextPath}/utf8/generalAjaxGet.page', contentType : "application/x-www-form-urlencoded", type:'get', dataType:'json', data:{ id:id, name:encodeURIComponent(name), remark:encodeURIComponent(remark) }, success:function(json){ alert(json.data); } }); 在jsp页面的js函数中,对包含中文的name,remark参数采用encodeURIComponent函数编码,例如: remark:encodeURIComponent(remark) 服务器端SimpleEntity对象中的属性name和remark分别添加@RequestParam注解,并指定decodeCharset 属性为UTF-8: @RequestParam(decodeCharset="UTF-8") private String name; @RequestParam(decodeCharset="UTF-8") private String remark; 问题即可解决,目前只想到这个办法,至于其他方法暂时没有想到 尹标平(122054810) 23:00:35 同时服务器端控制器方法要改为,这样数据到客户端后就不会有乱码: http://yin-bp.iteye.com 1.4 bboss mvc处理ajax get方法中文乱码方式纪实 第 21 / 188 页 public @ResponseBody AjaxResponseBean generalAjaxGet(SimplEntity entity, HttpServletRequest request,HttpServletResponse response){ AjaxResponseBean ajaxResponseBean=new AjaxResponseBean(); ajaxResponseBean.setStatus("success"); try { ajaxResponseBean.setData(entity); } catch (Exception e) { ajaxResponseBean.setStatus("error"); ajaxResponseBean.setData(e.getMessage()); } return ajaxResponseBean; } 这样MVC框架的Json转换插件自动会把数据转换为json格式响应到客户端,客户端获取json结果数据的最终方 式为: $.ajax({ url:'${pageContext.request.contextPath}/utf8/generalAjaxGet.page', contentType : "application/x-www-form-urlencoded", type:'get', dataType:'json', data:{ id:id, name:encodeURIComponent(name), remark:encodeURIComponent(remark) }, success:function(json){ alert(json.data.name); alert(json.data.remark); } }); 尹标平(122054810) 23:03:09 同时要确保bboss-mvc的httpMessageConverters中有以下配置项: http://yin-bp.iteye.com 1.4 bboss mvc处理ajax get方法中文乱码方式纪实 第 22 / 188 页 尹标平 共享文件 1 个 23:04:00 utf8.zip 下载 | 查看全部 尹标平(122054810) 23:05:17 改造后的程序在共享文件中的uft8.zip,可以在共享区下载 尹标平(122054810) 23:06:31 或者到以下地址下载: http://www.bbossgroups.com/file/download.htm?fileName=utf8.zip http://yin-bp.iteye.com 1.4 bboss mvc处理ajax get方法中文乱码方式纪实 第 23 / 188 页 1.5 bboss 序列化功能详解 发表时间: 2012-01-27 关键字: bboss soa, bbossgroups, bboss aop bboss 序列化功能详解,bboss序列化组件是bbossgroups框架体系中的又一个非常给力的功能构件,可以非 常方便地实现对象到xml的相互转换功能,本文详细介绍bboss序列化功能的特点及使用方法。 1.Bboss 序列化功能组件及依赖的jar包 1.1 主要组件和注解 组件 org.frameworkset.soa.ObjectSerializable ObjectSerializable组件提供了序列化和反序列化的主要api: 序列化api //将对象obj序列化成xml串并返回该串 public final static String toXML(Object obj) //将对象obj序列化成xml串,并将该串写入到Writer对象out中 public final static void toXML(Object obj, Writer out) 反序列化api //将beanxml参数对应的xml串转换为beantype类型的对象并返回该对象,采用泛型方式 public static T toBean(String beanxml, Class beantype) //将instream参数对应的xml字符流转换为beantype类型的对象并返回该对象,采用泛型方式 public static T toBean(InputStream instream, Class beantype) 注解 org.frameworkset.soa.annotation.ExcludeField ExcludeField注解主要的作用就是用来过滤对象中不需要序列化的属性,目前只对对象属性起作用,后续可以 加到get方法。ExcludeField注解的作用类似于java保留字transient的作用,bboss序列化组件同样也支持 transient关键字,只要属性前面加了transient关键字,序列化时也会被忽略。ExcludeField用法如下: http://yin-bp.iteye.com 1.5 bboss 序列化功能详解 第 24 / 188 页 @ExcludeField private String excludeField 1.2 依赖的jar包,可点击链接下载 bboss-aop.jar cglib-2.2.jar frameworkset-util.jar log4j-1.2.14.jar bboss-soa.jar 2.Bboss 序列化功能特点 (1).支持高效的xml-bean相互转换(序列化和反序列化) (2).支持各种数据类型的序列化和反序列化,支持文件的序列化和反序列化 (3).支持对象间各种关系的序列化和反序列化(对象恢复后能够恢复对象间的引用关系以及循环递归引用关系, 例如树结构的对象关系,单向父子对象关系,双向父子对象关系) (4).序列化时可以过滤以下类型属性: transient static final @Exclude注解 3.Bboss 序列化功能使用 本小节以一个简单的实例来说明如何通过bboss来实现组件序列化功能. 3.1 首先看简单对象序列化和反序列化操作 //构建和初始化要序列化的简单对象实例 TransientFieldBean transientFieldBean = new TransientFieldBean("onlyField"); transientFieldBean.setExcludeField("exccc"); transientFieldBean.setStaticFiled("staticFiled"); transientFieldBean.setTransientField("transientField"); //对象序列化 String xml = ObjectSerializable.toXML(transientFieldBean); //反序列化 TransientFieldBean transientFieldBean_new = ObjectSerializable.toBean(xml, TransientFieldBean.class); http://yin-bp.iteye.com 1.5 bboss 序列化功能详解 第 25 / 188 页 3.2 再看一个复杂对象数据结构的序列化和反序列化操作 //构建和初始化要序列化的复杂对象实例,对象test1引用对象test2和test3,test2引 //用test1,对象test3引用对象test2,这样就构造了一个具有相互引用的关系网, //bboss序列化组件可以非常方便地对这种结构的对象进行序列化和反序列化,而且能够 //很好地保持这种复杂的引用关系 Test1 test1 = new Test1(); Test2 test2 = new Test2(); Test3 test3 = new Test3(); test2.setTest1(test1); test1.setTest2(test2); test1.setTest3(test3); test3.setTest2(test2); //序列化test1对象 String ss = ObjectSerializable.toXML(test1); //反序列化 Test1 test1_ = (Test1)ObjectSerializable.toBean(ss,Test1.class); 3.3 再看一个文件对象的序列化和反序列化操作 //构造一个带文件属性的对象joe File fileData = new File("D:\\workspace\\bbossgroups-3.2\\bboss-soa\\test\\org\\frameworkset\\soa\\testxstream.xml"); FilePerson joe = new FilePerson(); joe.setFileData(fileData); //序列化对象joe String xml = ObjectSerializable.toXML(joe); //反序列化 FilePerson person = ObjectSerializable.toBean( xml, FilePerson.class); 更详细的实例请参考测试用例。 http://yin-bp.iteye.com 1.5 bboss 序列化功能详解 第 26 / 188 页 4.Bboss 序列化功能应用 bboss序列化功能目前已经被广泛应用于基于http/netty/mina/webservice/jms 等通讯协议的rpc框架中,性 能表现良好。 参考文档: bbossgroups 对象xml序列化/反序列化性能测试 bboss 序列化机制重大改进-支持复杂对象及对象之间关系序列化和恢复功能 为了验证hessian和bboss序列化功能的差异性特意做了个对比测试。 分别用bboss和hessian序列化和反序列化带有47K数据的对象实例,测试结果如下: bboss:序列化生成数据大小48274byte,耗时:47毫秒 hessian:序列化生成数据大小47801byte,耗时:62毫秒 bboss 反序列化耗时:125毫秒 hessian 反序列化耗时:32毫秒 从测试结果来看,bboss序列化速度比hessian稍快,反序化比hessian慢4倍,序列化产生的数据大小比 hessian略大一些。 hessian的版本是4.0.7,bboss 的版本是3.5。 测试代码附下: @Test public void testHessianSerializable() throws Exception { Test1 test1 = new Test1(); Test2 test2 = new Test2(); Test3 test3 = new Test3(); test2.setTest1(test1); test1.setTest2(test2); test1.setTest3(test3); test3.setTest2(test2); try { http://yin-bp.iteye.com 1.5 bboss 序列化功能详解 第 27 / 188 页 String bigcontent = FileUtil.getFileContent(new File("D:\\workspace\\bbossgroups-3.5\\bboss-soa\\test\\org\\frameworkset\\soa\\testxstream.xml"), "GBK");//testxstream.xml是一个47K大小的xml文件 test1.setXmlvalue(bigcontent); long s = System.currentTimeMillis(); String xml = ObjectSerializable.toXML(test1);//bboss 序列化 long e = System.currentTimeMillis(); System.out.println("bboss:"+xml.getBytes().length + ",times:" + (e - s)); s = System.currentTimeMillis(); Test1 test1_ = (Test1)ObjectSerializable.toBean(xml,Test1.class);//bboss 反序列化 e = System.currentTimeMillis(); System.out.println("bboss de times:" + (e - s)); s = System.currentTimeMillis();//hessian序列化 ByteArrayOutputStream os = new ByteArrayOutputStream(); HessianOutput ho = new HessianOutput(os); ho.writeObject(test1); byte[] cs = os.toByteArray(); e = System.currentTimeMillis(); System.out.println("hessian:"+cs.length+ ",times:" + (e - s)); s = System.currentTimeMillis();//hessian反序列化 ByteArrayInputStream is = new ByteArrayInputStream(cs); HessianInput hi = new HessianInput(is); test1_ = (Test1) hi.readObject(); e = System.currentTimeMillis(); System.out.println("hessian de times:" + (e - s)); //测试用例结束 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } http://yin-bp.iteye.com 1.5 bboss 序列化功能详解 第 28 / 188 页 http://yin-bp.iteye.com 1.5 bboss 序列化功能详解 第 29 / 188 页 1.6 bboss 持久层框架直接返回基础数据类型和基础数据类型List集合介绍 发表时间: 2011-12-25 关键字: bboss, 持久层, 基础数据类型, 集合 本文介绍如何通过bboss 持久层框架相关查询api直接返回基础数据类型和基础数据类型List集合功能,基础数 据类型包括以下几种: {String.class, int.class ,Integer.class, long.class,Long.class, java.sql.Timestamp.class,java.sql.Date.class,java.util.Date.class, boolean.class ,Boolean.class, BigFile.class,//bboss的大文件对象 float.class ,Float.class, short.class ,Short.class, double.class,Double.class, char.class ,Character.class, byte.class ,Byte.class, BigDecimal.class}; 下面就是具体的使用方法,以SQLExecutor组件为例来说明(ConfigSQLExecutor类似,这里不做过多说 明): @Test public void dynamicqueryBean() throws SQLException { ListBean bean = new ListBean(); bean.setFieldName("阿斯顿飞"); // List result = SQLExecutor.queryListBean(ListBean.class, "select * from LISTBEAN", bean); System.out.println(result.size()); bean.setFieldName(""); result = (List) SQLExecutor.queryListBean(ListBean.class,"select * from LISTBEAN", bean); System.out.println(result.size()); http://yin-bp.iteye.com 1.6 bboss 持久层框架直接返回基础数据类型和基础数据类型List集合介绍 第 30 / 188 页 bean.setFieldName(null); result = (List) SQLExecutor.queryListBean(ListBean.class,"select * from LISTBEAN", bean); System.out.println(result.size()); List result_string = SQLExecutor.queryListBean(String.class,"select * from LISTBEAN", bean); System.out.println(result_string.size()); List result_int = SQLExecutor.queryListBean(Integer.class,"select * from LISTBEAN", bean); System.out.println(result_int.size()); } @Test public void dynamicquery() throws SQLException { List result = SQLExecutor.queryList(ListBean.class,"select id from LISTBEAN"); System.out.println(result.size()); List result_string = SQLExecutor.queryList(String.class,"select id from LISTBEAN"); System.out.println(result_string.size()); List result_int = SQLExecutor.queryList(Integer.class,"select id from LISTBEAN"); System.out.println(result_int.size()); http://yin-bp.iteye.com 1.6 bboss 持久层框架直接返回基础数据类型和基础数据类型List集合介绍 第 31 / 188 页 } @Test public void dynamicqueryObject() throws SQLException { ListBean result = SQLExecutor.queryObject(ListBean.class,"select id from LISTBEAN"); System.out.println(result.getId()); String result_string = SQLExecutor.queryObject(String.class,"select id from LISTBEAN"); System.out.println(result_string); int result_int = SQLExecutor.queryObject(int.class,"select id from LISTBEAN"); System.out.println(result_int); } bboss的开发环境参考文档: 搭建自己的bbossmvc eclipse开发工程,编写第一个实例 http://yin-bp.iteye.com 1.6 bboss 持久层框架直接返回基础数据类型和基础数据类型List集合介绍 第 32 / 188 页 1.7 bboss mvc中ModelMap和ModelAndView的使用方法 发表时间: 2011-12-15 关键字: bboss, mvc, modelmap, modelandview bboss mvc中ModelMap和ModelAndView两个对象类似于spring mvc中的ModelMap和ModelAndView对 象,本文着重介绍bboss mvc中ModelMap和ModelAndView两个对象的作用和使用方法。这两个对象在 bboss mvc架构中所处的位置如下: 首先介绍ModelMap和ModelAndView的作用 ModelMap ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到 ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递 处理的数据。通过以下方法向页面传递参数: addAttribute(String key,Object value); 在页面上可以通过el变量方式$key或者bboss的一系列数据展示标签获取并展示modelmap中的数据。 modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址,那么我们可以通过控制器方法的返回值来 设置跳转url地址别名或者物理跳转地址。 ModelAndView ModelAndView对象有两个作用: 作用一 设置转向地址,如下所示(这也是ModelAndView和ModelMap的主要区别) ModelAndView view = new ModelAndView("path:ok"); 作用二 用于传递控制方法处理结果数据到结果页面,也就是说我们把需要在结果页面上需要的数据放到 ModelAndView对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中 传递处理的数据。通过以下方法向页面传递参数: addObject(String key,Object value); 在页面上可以通过el变量方式$key或者bboss的一系列数据展示标签获取并展示ModelAndView中的数据。 作用介绍完了后,接下来介绍使用方法 ModelMap ModelMap的实例是由bboss mvc框架自动创建并作为控制器方法参数传入,用户无需自己创建。 http://yin-bp.iteye.com 1.7 bboss mvc中ModelMap和ModelAndView的使用方法 第 33 / 188 页 public String xxxxmethod(String someparam,ModelMap model) { //省略方法处理逻辑若干 //将数据放置到ModelMap对象model中,第二个参数可以是任何java类型 model.addAttribute("key",someparam); ...... //返回跳转地址 return "path:handleok"; } ModelAndView ModelAndView的实例是由用户手动创建的,这也是和ModelMap的一个区别。 public ModelAndView xxxxmethod(String someparam) { //省略方法处理逻辑若干 //构建ModelAndView实例,并设置跳转地址 ModelAndView view = new ModelAndView("path:handleok"); //将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型 view.addObject("key",someparam); ...... //返回ModelAndView对象view return view; } 到此bboss mvc中ModelMap和ModelAndView两个对象的作用和使用方法介绍完毕。 http://yin-bp.iteye.com 1.7 bboss mvc中ModelMap和ModelAndView的使用方法 第 34 / 188 页 1.8 基于bbossgroups持久层框架实现数据库分页查询 发表时间: 2011-11-25 关键字: bbossgroups, 分页查询, o/r mapping bbossgroups中提供的分页查询方法,非常简单,也非常的高效,本文介绍一个基于行处理器的PreparedDBUtil 的案例。 PreparedDBUtil dbUtil = new PreparedDBUtil(); try { dbUtil.preparedSelect("select * from testnewface where object_id < ?",0,10);//分页查询方法 dbUtil.setInt(1, 100); //下面使用到了行处理器,如果TestNewface对象中的属性名称和查询表字段的名称一致 //(忽略大小写),则不需要行处理器,直接执行查询即可: //List list = dbUtil.executePreparedForList(TestNewface.class); List list = dbUtil.executePreparedForList(TestNewface.class,new RowHandler() { public void handleRow(TestNewface t, Record record) { try { t.setCREATED(record.getDate("created")); t.setDATA_OBJECT_ID(record.getInt("DATA_OBJECT_ID")); //........设置其他的属性 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("row handler:"+t); } }); int totalsize = dbUtil.getTotalSize();//获得总记录数 for(int i = 0; i < list.size()/*list.size()当页记录数*/; i ++)//遍历当页记录 { TestNewface testNewface = (TestNewface)list.get(i); ... ... http://yin-bp.iteye.com 1.8 基于bbossgroups持久层框架实现数据库分页查询 第 35 / 188 页 } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } java值对象: package com.frameworkset.common; import java.util.Date; /** * *

Title: TestNewface.java

* *

Description:

* *

Copyright: Copyright (c) 2007

* @Date Nov 4, 2008 2:51:17 PM * @author biaoping.yin * @version 1.0 */ public class TestNewface { String OWNER ; String OBJECT_NAME ; String SUBOBJECT_NAME ; int OBJECT_ID ; int DATA_OBJECT_ID ; String OBJECT_TYPE ; Date CREATED ; Date LAST_DDL_TIME ; String TIMESTAMP ; String STATUS ; http://yin-bp.iteye.com 1.8 基于bbossgroups持久层框架实现数据库分页查询 第 36 / 188 页 String TEMPORARY ; String GENERATED ; String SECONDARY ; public String getOWNER() { return OWNER; } public void setOWNER(String owner) { OWNER = owner; } public String getOBJECT_NAME() { return OBJECT_NAME; } public void setOBJECT_NAME(String object_name) { OBJECT_NAME = object_name; } public String getSUBOBJECT_NAME() { return SUBOBJECT_NAME; } public void setSUBOBJECT_NAME(String subobject_name) { SUBOBJECT_NAME = subobject_name; } public int getOBJECT_ID() { return OBJECT_ID; } public void setOBJECT_ID(int object_id) { OBJECT_ID = object_id; } public int getDATA_OBJECT_ID() { return DATA_OBJECT_ID; } public void setDATA_OBJECT_ID(int data_object_id) { DATA_OBJECT_ID = data_object_id; } public String getOBJECT_TYPE() { return OBJECT_TYPE; } public void setOBJECT_TYPE(String object_type) { http://yin-bp.iteye.com 1.8 基于bbossgroups持久层框架实现数据库分页查询 第 37 / 188 页 OBJECT_TYPE = object_type; } public Date getCREATED() { return CREATED; } public void setCREATED(Date created) { CREATED = created; } public Date getLAST_DDL_TIME() { return LAST_DDL_TIME; } public void setLAST_DDL_TIME(Date last_ddl_time) { LAST_DDL_TIME = last_ddl_time; } public String getTIMESTAMP() { return TIMESTAMP; } public void setTIMESTAMP(String timestamp) { TIMESTAMP = timestamp; } public String getSTATUS() { return STATUS; } public void setSTATUS(String status) { STATUS = status; } public String getTEMPORARY() { return TEMPORARY; } public void setTEMPORARY(String temporary) { TEMPORARY = temporary; } public String getGENERATED() { return GENERATED; } public void setGENERATED(String generated) { GENERATED = generated; http://yin-bp.iteye.com 1.8 基于bbossgroups持久层框架实现数据库分页查询 第 38 / 188 页 } public String getSECONDARY() { return SECONDARY; } public void setSECONDARY(String secondary) { SECONDARY = secondary; } } 在bbossgroups持久层框架中,主要是通过数据库适配器来实现不同数据库产品的分页查询算法,框架缺省为 每种数据库提供分页算法实现(基本上使用每种数据库的最优算法),用户可以扩展这些适配器来实现自己的 分页算法,以oracle为列,编写自己的适配器覆盖默认的public String getDBPagineSql(String sql, long offset, int maxsize)方法: package com.frameworkset.orm.adaptors; import com.frameworkset.orm.adapter.DBOracle; public class MyOracle extends DBOracle { public String getDBPagineSql(String sql, long offset, int maxsize) { StringBuffer ret = new StringBuffer("select ss1.* from (select tt1.*,rownum rowno_ from (").append(sql).append( ") tt1 where rownum <= ").append((offset + maxsize)).append(") ss1 where ss1.rowno_ >= ").append( (offset + 1)); return ret.toString(); } } 写好后将com.frameworkset.orm.adaptors.MyOracle配置到poolman.xml文件中既可: com.frameworkset.orm.adaptors.MyOracle http://yin-bp.iteye.com 1.8 基于bbossgroups持久层框架实现数据库分页查询 第 39 / 188 页 bspf false bspf_datasource_jndiname false false oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@//172.16.17.219:1521/orcl baseline baseline READ_COMMITTED true false 2 2 10 false true 50 http://yin-bp.iteye.com 1.8 基于bbossgroups持久层框架实现数据库分页查询 第 40 / 188 页 true true 120000 240000 5 true --> 60 select 1 from dual http://yin-bp.iteye.com 1.8 基于bbossgroups持久层框架实现数据库分页查询 第 42 / 188 页 1.9 bboss 动态sql使用foreach循环示例 发表时间: 2011-11-16 关键字: bboss persistent, foreach, 动态sql 本文介绍bboss 动态sql使用foreach循环示例。切入正题。 在sql配置文件中配置的sql语句有时需要用到foreach循环控制语句以及循环计数器velocityCount,以便遍历外 部传入的list数据。在这里我们简单地介绍这个功能。 首先看看sql配置文件中配置的sql语句: 在sql语句中包含了foreach循环控制语句和循环控制变量velocityCount: #foreach($ldxxbh in $ldxxbhs) #if($velocityCount == 1) '$ldxxbh' #else ,'$ldxxbh' #end #end http://yin-bp.iteye.com 1.9 bboss 动态sql使用foreach循环示例 第 43 / 188 页 其中的变量$ldxxbh 保存了每次迭代获取到的list元素的值,变量$ldxxbhs表示一个list集合,可以通过三种方 式设置:bean的get方法,map对象,sqlparams对象;详情请参考文章《bbossgroups 持久层模板sql变量参 数设置的三种方式》,本例采用map方式设定这个list类型变量$ldxxbhs。 下面我们看看java通过ConfigSQLExcutor对象executor来执行这个带foreach循环控制逻辑的sql语句代码: public void updateLkYjZt(List ldxxbhs) { try { Map datas = new HashMap(); datas.put("ldxxbhs",ldxxbhs); executor.updateBean("updateLkYjZt", datas); } catch (SQLException e) { e.printStackTrace(); } } 其中executor.updateBean("updateLkYjZt", datas)中的参数"updateLkYjZt"对应sql配置中name属性的值, Map对象datas中设置了key为“ldxxbhs”,值为list类型的变量ldxxbhs,foreach循环控制语句中通过key “ldxxbhs”来引用这个list对象,然后完成循环控制语句的执行。 http://yin-bp.iteye.com 1.9 bboss 动态sql使用foreach循环示例 第 44 / 188 页 1.10 bbossgroups 3.x中rpc使用介绍 发表时间: 2011-10-29 关键字: rpc, bbossgroups bbossgroups 3.4及后续版本在原有的rpc功能基础上做了非常大的改进,bboss rpc客户端可以类似于 webservice和rmi的客户端方式对bboss aop框架、mvc框架中配置的任何组件发起远程调用。为了支撑这个功 能,3.4版中新增了组件: org.frameworkset.spi.ClientProxyContext 该组件提供了以下能力而在本地无需服务组件的实现类和配置文件,只需接口以及接口依赖的相关的类即可: 1.对mvc容器中配置的组件的远程调用 2.对其他类型容器中配置的组件的远程调用 三个主要的接口如下: 1.获取MVC容器中的服务组件调用代理 /** * 获取MVC容器中的服务组件调用代理 * @param 泛型类型 * @param name 服务组件访问地址 * @param type 组件接口类型,使用泛型来实现接口的自动类型转换 * @return 服务组件调用代理 */ public static T getWebMVCClientBean(String name,Class type) 2.获取ApplicationContext类型容器中的服务组件调用代理 /** * 获取ApplicationContext类型容器中的服务组件调用代理 * @param 泛型类型 * @param context 容器标识,一般是容器初始化的配置文件路径 * @param name 服务组件访问地址 * @param type 组件接口类型,使用泛型来实现接口的自动类型转换 * @return 服务组件调用代理 */ public static T getApplicationClientBean(String context,String name,Class type) 3.获取DefaultApplicationContext类型容器中的服务组件调用代理 http://yin-bp.iteye.com 1.10 bbossgroups 3.x中rpc使用介绍 第 45 / 188 页 /** * 获取DefaultApplicationContext类型容器中的服务组件调用代理 * @param 泛型类型 * @param context 容器标识,一般是容器初始化的配置文件路径 * @param name 服务组件访问地址 * @param type 组件接口类型,使用泛型来实现接口的自动类型转换 * @return 服务组件调用代理 */ public static T getSimpleClientBean(String context,String name,Class type) 每种接口的使用实例如下,全部基于http协议实现: 1.获取mvc容器中组件的远程服务调用接口,mvc容器由服务端mvc框架自动初始化 ClientInf mvcinf = ClientProxyContext.getWebMVCClientBean( "(http::localhost:8080/bboss-mvc/http.rpc)" + "/client.proxy.demo?user=admin&password=123456", ClientInf.class); mvcinf.helloworld("aaaa,多多"); 2.获取DefaultApplicationContext类型容器中的服务组件调用代理 //服务器端容器org/frameworkset/spi/ws/webserivce-modules.xml必须是以下方式创建 // DefaultApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/ws/webserivce-modules.xml"); ClientInf simpleinf = ClientProxyContext.getSimpleClientBean("org/frameworkset/spi/ws/webserivce-modules.xml",//容器标识 "(http::localhost:8080/bboss-mvc/http.rpc)/client.proxy.simpledemo?user=admin&password=123456",//服务组件地址 ClientInf.class);//服务接口 simpleinf.helloworld("aaaa,多多"); 3.获取服务器端默认容器中组件的远程服务调用接口 http://yin-bp.iteye.com 1.10 bbossgroups 3.x中rpc使用介绍 第 46 / 188 页 ClientInf defaultinf = ClientProxyContext.getApplicationClientBean( "(http::localhost:8080/bboss-mvc/http.rpc)" + "/client.proxy.simpledemo?user=admin&password=123456", ClientInf.class); defaultinf.helloworld("aaaa,多多"); 4.http协议补充说明 服务端必须在web.xml文件中配置以下servlet RPCHttpServLet RPCHttpServLet org.frameworkset.spi.remote.http.RPCHttpServLet RPCHttpServLet *.rpc 5.http协议串说明 http::localhost:8080/bboss-mvc/http.rpc 协议部分 ip部分 port部分 应用上下文 匹配rpcservlet串 我们用()将上面的url串括起来,然后再添加服务端组件标识和认证参数user和password: /client.proxy.simpledemo?user=admin&password=123456 client.proxy.simpledemo为服务端组件,?user=admin&password=123456中的user参数就是认证账户, password参数就是认证口令,如果服务开启了认证机制,就需要在客户端设置这两个参数,反之无需配置。 我们可以在服务组件方法中通过org.frameworkset.spi.security.SecurityContext获取客户端传递过来的账户信 息,静态方法: SecurityContext securityContext = SecurityContext.getSecurityContext(); String user = securityContext.getUser(); String password = securityContext.getPassword(); http://yin-bp.iteye.com 1.10 bbossgroups 3.x中rpc使用介绍 第 47 / 188 页 6.通过配置文件来配置客户端调用组件的实例 可以通组件工厂模式来在aop配置文件中配置一个客户端代理组件,我们这里是以http协议为列,从mvc容器中 获取服务client.proxy.demo的客户端调用实例。 先看配置文件: org/frameworkset/spi/remote/clientproxy/consumer.xml consumer.xml文件的内容如下: consumer.xm中配置了名称为clientservice的组件,该组件实例通过代理类 org.frameworkset.spi.ClientProxyContext的静态方法getWebMVCClientBean来创建,通过构造器 construction指定了getWebMVCClientBean方法需要的两个参数: 参数一 服务地址信息 (http::localhost:8080/bboss-mvc/http.rpc)/client.proxy.demo?user=admin&password=123456 参数二 服务接口类信息 org.frameworkset.spi.remote.clientproxy.ClientInf 这样我们就可以加载consumer.xml文件创建一个DefaultApplicationContext类型的容器,然后获取到组件的 客户端调用实例,代码如下: //定义容器对象 DefaultApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/remote/clientproxy/consumer.xml"); //获取客户端组件实例 ClientInf client = context.getTBeanObject("clientservice", ClientInf.class); //发起远程方法调用 client.helloworld("aaa"); http://yin-bp.iteye.com 1.10 bbossgroups 3.x中rpc使用介绍 第 48 / 188 页 通过这种方式,我们就可以把之前通过代码调用ClientProxyContext创建客户端代理转换为通过aop容器管理 创建客户端调用代理模式,这两种方式是等价的。 7.总结 本文介绍了通过ClientProxyContext来获取bboss中三种不同类型容器(mvc容器、独立容器、默认容器)中配 置的组件客户端调用代理的方法,并以http协议为列介绍了使用方法;介绍了客户端如何传递认证信息的方 法;介绍了协议串的配置方法和含义;同时也对比了通过代码直接创建代理和通过aop配置文件创建代理的两种 方式,实际情况可以任意选择。 http://yin-bp.iteye.com 1.10 bbossgroups 3.x中rpc使用介绍 第 49 / 188 页 1.11 bbossgroups 开发系列文章之一 最佳实践 发表时间: 2011-10-01 关键字: bboss dao, bboss mvc, bboss aop, json bbossgroups 开发系列文章之-最佳实践 一、概述 所谓最佳实践,就是将采用bbossgroups框架体系开发业务系统的一个最佳的实现方式介绍给大家,本最佳实 践包含以下内容: 本文基本功能点如下: 1.bboss mvc框架基础配置 2.bboss mvc控制器配置文件 3.数据库访问组件及sql语句配置文件 4.dao组件管理及注入数据库访问组件 5.业务组件管理及注入dao组件 6.业务开发前台和后台衔接的粘合剂-mvc控制器,注入业务组件 7.附带介绍一下jsp页面的内容 8.bboss mvc请求分派器及url映射配置 9.bboss mvc参数编码过滤器配置 下面详细介绍各个部分。 1.bboss mvc框架基础配置 bboss mvc框架基础配置,主要介绍bboss-mvc.xml文件的配置内容,bboss-mvc.xml是bboss mvc框架的系 统配置文件,一般开发人员无需关心。详细介绍请参考博客文章: 《bboss mvc基础配置介绍》http://yin-bp.iteye.com/blog/1139608 2.bboss mvc控制器配置文件 本节介绍mvc框架的一个典型的控制器配置文件的内容: http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 50 / 188 页 从文件内容可以看出控制器配置文件中包含四大部分内容: 1.控制器配置(url映射规则,跳转路径配置,依赖的业务组件配置) 2.业务组件配置(组件及组件依赖的dao组件的配置) 3.dao组件的配置(dao组件及持久层操作对象配置) 4、持久层组件配置(持久层组件及组件引用的sql文件路径配置) 这四部分内容基本上郎阔了当今企业信息系统开发的各个方面,表示层,控制层,业务层,持久层。从这里也 可以看出bbossgroups为企业j2ee项目架构提供了完整的解决方案,它通过aop/ioc、mvc将各个层面很好地编 织起来,下面的章节会逐个介绍每部分,我们从持久层开始介绍。 3.数据库访问组件及sql语句配置文件 http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 51 / 188 页 数据库访问组件及注入dao组件,下面的配置声明了一个 com.frameworkset.common.poolman.ConfigSQLExecutor组件名字叫uddi.requester.Configexecutor: dao组件通过名称uddi.requester.Configexecutor来注入和引用该组件。这个持久组件配置了一个sql文件: com/chinacreator/esb/uddi/requester/dao/impl/sqlfile.xml 非常明显我们将sql语句配置在了一个xml文件中,我们来看看这个文件的内容,其实配置文件中我们用key和 value的方式管理sql语句,我们在dao中通过key来引用每个sql语句。在开发环境可以将这个sql文件配置为热 加载,即修改后不用重启应用服务器就生效,sqlfile.xml文件内容如下: http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 53 / 188 页 另外文件中的sql语句包含了模板sql(带#[service_requester_id]形态变量的sql语句)、动态sql(带逻辑判断 的sql,#if()#end),预编译sql(带?号占位符的sql),最终持久层全部采用预编译方式执行这些sql语句。 需要说明的是,bbossgroups 3.x 中sql文件的刷新机制配置在bboss-aop.jar的aop.properties文件中,为<0 时,将屏蔽刷新功能: sqlfile.refresh_interval=5000 4.dao组件管理及注入数据库访问组件 dao组件管理及注入数据库访问组件 本节内容介绍dao组件的配置和代码,以及其如何通过注入方式引用上节 中配置的持久层组件 uddi.requester.Configexecutor 首先看配置: 配置非常简单,指定了dao组件的名字uddi.requester.requesterDao(我们将通过这个名称将dao组件注入到 业务组件中),实现类 com.chinacreator.esb.uddi.requester.dao.impl.RequesterDaoImpl 以及指定了属性executor的值attr:uddi.requester.Configexecutor,这是一个引用,引用 uddi.requester.Configexecutor对应的数据库组件。 然后我们看看dao组件的实现类,从中我们可以看出dao中的方法是怎样通过ConfigSQLExecutor来操作访问数 据库的: package com.chinacreator.esb.uddi.requester.dao.impl; import java.util.UUID; import com.chinacreator.esb.datareuse.util.Constants; http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 54 / 188 页 import com.chinacreator.esb.uddi.requester.dao.RequesterDao; import com.chinacreator.esb.uddi.requester.entity.Requester; import com.frameworkset.common.poolman.ConfigSQLExecutor; import com.frameworkset.util.ListInfo; public class RequesterDaoImpl implements RequesterDao { private static String dbName = Constants.DATAREUSE_DBNAME; private ConfigSQLExecutor executor; public ConfigSQLExecutor getExecutor() { return executor; } public void setExecutor(ConfigSQLExecutor executor) { this.executor = executor; } public ListInfo getRequesterDaoListInfo(String sortKey, boolean desc, long offset, int pagesize, Requester queryCondObj) throws Exception { // TODO Auto-generated method stub return executor.queryListInfoBeanWithDBName(Requester.class, dbName, "getRequesterDaoListInfo", offset, pagesize, queryCondObj); } public void delete(String id) throws Exception { // TODO Auto-generated method stub String delId = (String)id; executor.deleteByKeysWithDBName(dbName, "delete", delId); } public Requester findObjectById(String id) throws Exception { // TODO Auto-generated method stub String findId = (String)id; http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 55 / 188 页 Requester requester = executor.queryObjectWithDBName(Requester.class, dbName, "findObjectById", findId); return requester; } public void insert(Requester obj) throws Exception { // TODO Auto-generated method stub if(obj.getService_requester_id()== null||obj.getService_requester_id().equals("")){ obj.setService_requester_id(UUID.randomUUID().toString());} executor.insertBean(dbName, "insert", obj); } public void update(Requester obj) throws Exception { // TODO Auto-generated method stub executor.updateBean(dbName, "update", obj); } public void updateFlag(Requester obj) throws Exception { // TODO Auto-generated method stub executor.updateBean(dbName, "updateFlag", obj); } } 其中我们可以看到dao在利用executor执行数据库增删改查操作时,每个操作的参数分为3部分,一部分时 dbName,指定操作针对poolman.xml文件中配置的数据源datasource的名称dbname的值,第二部分就是我 们在sql文件中配置的sql语句对应的名称,第三部分就是相应操作需要的业务参数。其实还有可选的一部分就是 分页参数,例如 return executor.queryListInfoBeanWithDBName(Requester.class, dbName, "getRequesterDaoListInfo", offset, pagesize, queryCondObj); 中的offset,pagesize两个分别代表了分页查询的记录起始位置和每页最多返回的记录数。 补充一下dbname的在数据源配置文件poolman.xml文件(该文件一般部署于classes目录下)中是怎么配置 的: http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 56 / 188 页 bspf false jdbc/mysql-ds oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@172.16.25.219:1521/orcl esb esb ......... datareuse jdbc/mysql-ds true 更加详细的配置请参考文章《bbossgroups持久层框架数据源配置文件实例》 5.业务组件管理及注入dao组件 业务组件管理及注入dao组件,本节讲解业务组件配置部分的内容: http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 57 / 188 页 这个配置非常简洁(bbossgroups aop框架配置简洁的优良特质得以充分体现),也非常直观,配置可以大致 分为以下部分: 1.控制url映射规则/uddi/requester/*.page,这个规则可以让前端请求精确匹配到具体的控制器,*代表将控制 器实现类中的所有业务方法开放接收前台提交请求。 2.控制方法跳转地址配置 path:main="/uddi/requester/main.jsp" path:add-requester="/uddi/requester/addRequester.jsp" path:edit-requester="/uddi/requester/editRequester.jsp" path:query-requester="/uddi/requester/RequesterListInfo.jsp" 我们把控制器节点上的path:前缀的属性当成是跳转页面地址配置,而把f:开头的属性作为控制组件的属性注入 参数来处理 3.控制器类配置 class="com.chinacreator.esb.uddi.requester.web.RequesterController" 4.需要注入到控制器的业务组件和其他属性配置: f:fuzzySearch="true" f:requesterService="attr:uddi.requester.requesterService" f:businessLineService="attr:businessLineService" 好,我们来具体看看控制器类得代码吧(辛苦了,呵呵),控制器类得实现也很简单: http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 60 / 188 页 package com.chinacreator.esb.uddi.requester.web; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.sql.Timestamp; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.map.ObjectMapper; import org.frameworkset.util.annotations.PagerParam; import org.frameworkset.util.annotations.RequestParam; import org.frameworkset.web.servlet.ModelAndView; import org.frameworkset.web.servlet.ModelMap; import com.chinacreator.esb.AjaxResponseBean; import com.chinacreator.esb.DropListEntity; import com.chinacreator.esb.datareuse.businessline.service.BusinessLineService; import com.chinacreator.esb.datareuse.util.Constants; import com.chinacreator.esb.tools.StringTool; import com.chinacreator.esb.uddi.requester.entity.Requester; import com.chinacreator.esb.uddi.requester.service.RequesterService; import com.chinacreator.security.AccessControl; import com.frameworkset.util.ListInfo; public class RequesterController { private RequesterService requesterService; private BusinessLineService businessLineService; public BusinessLineService getBusinessLineService() { return businessLineService; } http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 61 / 188 页 public void setBusinessLineService(BusinessLineService businessLineService) { this.businessLineService = businessLineService; } public RequesterService getRequesterService() { return requesterService; } public void setRequesterService(RequesterService requesterService) { this.requesterService = requesterService; } private boolean fuzzySearch; public boolean isFuzzySearch() { return fuzzySearch; } public void setFuzzySearch(boolean fuzzySearch) { this.fuzzySearch = fuzzySearch; } /* * 进入主页面 */ public ModelAndView main(){ ModelAndView view = new ModelAndView("path:main"); return view; } /** * 将字符串转成utf-8编码 * @param str http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 62 / 188 页 * @return * @throws UnsupportedEncodingException */ private String encode(String str) throws UnsupportedEncodingException { return java.net.URLEncoder.encode(str, "utf-8"); } /** * 转成json对象,直接用response的print方法 * @param response * @param ajaxResponseBean * @throws IOException */ private void write(HttpServletResponse response, AjaxResponseBean ajaxResponseBean) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); String responseText = objectMapper.writeValueAsString(ajaxResponseBean); response.getWriter().print(responseText); } /** * 取得当前用户的ID * @param request * @param response * @return */ private String getUserId(HttpServletRequest request, HttpServletResponse response) { AccessControl accessControl = AccessControl.getInstance(); accessControl.checkAccess(request, response); return accessControl.getUserID(); } /* * 查询请求方数据 */ http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 63 / 188 页 public ModelAndView queryRequester(Requester requester, @PagerParam(name = PagerParam.SORT)String sortKey, @PagerParam(name = PagerParam.DESC)boolean desc, @PagerParam(name = PagerParam.OFFSET)long offset, @PagerParam(name = PagerParam.PAGE_SIZE)int pagesize, ModelMap model){ String srAccount = requester.getService_requester_account(); String srName = requester.getService_requester_name(); if (isFuzzySearch()){ requester.setService_requester_account(StringTool.buildFuzzySearchString(srAccount, false)); requester.setService_requester_name(StringTool.buildFuzzySearchString(srName, false)); } ListInfo listinfo = null; try { listinfo = requesterService.getRequseterListInfo(sortKey, desc, offset, pagesize, requester); listinfo.setMaxPageItems(pagesize); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } ModelAndView view = new ModelAndView("path:query-requester", "listinfo", listinfo); return view; } /* * 进入新增请求方页面 */ public ModelAndView addRequester(Requester requster, ModelMap model) throws Exception { addBusinessLineDropList(model); ModelAndView view = new ModelAndView("path:add-requester"); return view; http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 64 / 188 页 } public void createRequester(Requester requester, @RequestParam(name = "service_requester_id") String service_requester_id, ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception { AjaxResponseBean ajaxResponseBean = new AjaxResponseBean(); String userId = this.getUserId(request, response); try { Date date = new Date(); Timestamp timestamp = new Timestamp(date.getTime()); requester.setCreator(userId); requester.setCreate_time(timestamp); requester.setModifier(userId); requester.setModify_time(timestamp); //账号创建后默认为启用 requester.setUsed_flag(Constants.UsedBoolean.TRUE.getValue()); requesterService.insertRequester(requester); ajaxResponseBean.setStatus("success"); ajaxResponseBean.setData(requester.getService_requester_id()); } catch (Exception e) { e.printStackTrace(); ajaxResponseBean.setStatus("error"); if (e.getMessage() != null && e.getMessage().indexOf("unique") > 0) { ajaxResponseBean.setData(encode("账号已存在!")); } else { throw e; } } write(response, ajaxResponseBean); } http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 65 / 188 页 /* * 进入修改请求方页面 */ public ModelAndView editRequester(@RequestParam(name = "service_requester_id")String service_requester_id, ModelMap model) throws Exception{ addBusinessLineDropList(model); Requester obj = requesterService.findRequesterById(service_requester_id); ModelAndView view = new ModelAndView("path:edit-requester", "obj", obj); view.addObject("close", model.get("close")); return view; } private void addBusinessLineDropList(ModelMap model) throws Exception{ List businessLines = businessLineService.getBusinessLineDropList(); model.addAttribute("businessLines", businessLines); } public void updateRequester(Requester requester, @RequestParam(name = "service_requester_id") String service_requester_id, ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception { String userId = this.getUserId(request, response); AjaxResponseBean ajaxResponseBean = new AjaxResponseBean(); try { Date date = new Date(); Timestamp timestamp = new Timestamp(date.getTime()); requester.setModifier(userId); requester.setModify_time(timestamp); requesterService.updateRequester(requester); ajaxResponseBean.setStatus("success"); http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 66 / 188 页 } catch (Exception e) { e.printStackTrace(); throw e; } write(response, ajaxResponseBean); } public void updateRequesterFlag(Requester requester, HttpServletRequest request, HttpServletResponse response) throws Exception { String userId = this.getUserId(request, response); AjaxResponseBean ajaxResponseBean = new AjaxResponseBean(); try { Date date = new Date(); Timestamp timestamp = new Timestamp(date.getTime()); requester.setModifier(userId); requester.setModify_time(timestamp); requesterService.updateRequesterFlag(requester); ajaxResponseBean.setStatus("success"); } catch (Exception e) { e.printStackTrace(); throw e; } write(response, ajaxResponseBean); } /* * 启用请求方 */ public void startRequester(Requester requester, HttpServletRequest request, HttpServletResponse response) throws Exception { requester.setUsed_flag(Constants.UsedBoolean.TRUE.getValue()); updateRequesterFlag(requester, request, response); http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 67 / 188 页 } /* * 停用请求方 */ public void stopRequester(Requester requester, HttpServletRequest request, HttpServletResponse response) throws Exception { requester.setUsed_flag(Constants.UsedBoolean.FALSE.getValue()); updateRequesterFlag(requester, request, response); } public void deleteRequester( @RequestParam(name = "service_requester_id") String service_requester_id, HttpServletResponse response) throws Exception { AjaxResponseBean ajaxResponseBean = new AjaxResponseBean(); try { requesterService.deleteRequester(service_requester_id); ajaxResponseBean.setStatus("success"); } catch (Exception e) { e.printStackTrace(); ajaxResponseBean.setStatus("error"); if (e.getMessage() != null && e.getMessage().indexOf("constraint") > 0) { ajaxResponseBean.setData(encode("存在关联数据,不能删除!")); } else { throw e; } } write(response, ajaxResponseBean); } } http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 68 / 188 页 7.附带介绍一下jsp页面的内容 附带介绍一下jsp页面的内容 ,通过这个页面内容我们可以看出视图层是如何提交请求到控制器的,以及控制器 处理完请求后怎么把处理结果反馈给视图层的。 jsp页面代码片段,其它部分全部省略掉,js提交请求到控制 器,然后通过回调将响应添加到div的代码片段: $(document).ready(function(){ queryRequester(); } function queryRequester(){ $('#queryForm').form('submit', { "url": "queryRequester.page", onSubmit:function(){ //显示遮罩 blockUI(); }, success:function(responseText){ //去掉遮罩 unblockUI(); $("#RequesterListInfoContainer").html(responseText); } }); } jsp代码片段:
账号: http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 69 / 188 页 密码:
http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 70 / 188 页 呵呵,相信熟悉jquery的朋友对上述代码并不陌生。 8.bboss mvc请求分派器及url映射配置 本节介绍bboss mvc请求分派器、url映射规则以及mvc配置文件在web.xml文件中的配置方法: mvc org.frameworkset.web.servlet.DispatchServlet contextConfigLocation /WEB-INF/conf/uddi/bboss-*.xml,/WEB-INF/conf/datareuse/bboss-*.xml,/WEB-INF/conf/commons/bboss-*.xml,/WEB-INF/conf/bboss-*.xml 0 mvc *.page 9.bboss mvc参数编码过滤器配置 本节是本文的最后一节,介绍bboss mvc参数编码过滤器在web.xml文件中的配置: CharsetEncoding com.frameworkset.common.filter.CharsetEncodingFilter RequestEncoding GBK ResponseEncoding GBK http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 71 / 188 页 mode 0 CharsetEncoding *.jsp CharsetEncoding *.do CharsetEncoding *.frame CharsetEncoding *.page http://yin-bp.iteye.com 1.11 bbossgroups 开发系列文章之一 最佳实践 第 72 / 188 页 1.12 bbossgroups 持久层模板sql变量参数设置的三种方式 发表时间: 2011-09-16 关键字: bbossgroups, sql, persistent 本文介绍bbossgroups 持久层模板sql变量参数设置的三种方式,切入正题。 概述 Map:所有的变量参数名和值以key/value的方式放入,如果值为null则以null方式替换变量 Bean:所有的变量参数和值以都与bean中对应的属性字段名和值相对应,如果值为null则以相应属性类型的sql 类型的 null方式替换变量 SQLParams:所有的变量参数和值以都与SQLParams中对应的属性字段名和值相对应,参数的类型根据 SQLParams.addSQLParam("id", value, SQLParams.INT)方法的第三个参数来指定,如果值为null则以相应类 型的sql类型的 null方式替换变量。 如果是insert,delete,update还可以使用List,List,List来完成批量处理操作 (后台全部采用预编译批处理来完成批量数据处理,性能好),下面分别介绍上述三种方式的使用方法。 1.Map和List方式 Map方式: Map datas = new HashMap(); datas.put("id", 139); datas.put("fieldName", "updateWithMapParams139"); executor.updateBean("updatesqltemplate", datas); //更新记录 List方式: Map datas = new HashMap(); datas.put("id", 139); datas.put("fieldName", "updateWithMapParams139"); List params_ = new ArrayList(); params_.add(datas); datas = new HashMap(); datas.put("id", 140); datas.put("fieldName", "updateWithMapParams140"); params_.add(datas); datas = new HashMap(); http://yin-bp.iteye.com 1.12 bbossgroups 持久层模板sql变量参数设置的三种方式 第 73 / 188 页 datas.put("id", 141); datas.put("fieldName", "updateWithMapParams141"); params_.add(datas); executor.updateBeans("updatesqltemplate", params_); //批量更新处理多个记录 2.Bean和List方式 Bean方式: ListBean bean = new ListBean(); bean.setId(139); List result = executor.queryListBean(ListBean.class, "dynamicsqltemplateid", bean); bean.setId(-1); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplateid", bean); bean.setId(0); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplateid", bean); List方式: ListBean bean = new ListBean(); bean.setId(139); List params_ = new ArrayList(); params.add(bean ); executor.updateBeans("updatesqltemplate", params_);//批量更新处理多个记录 3.SQLParams和List方式 SQLParams方式: SQLParams params = new SQLParams(); params.addSQLParam("id", 139, SQLParams.INT); List result = executor.queryListBean(ListBean.class, "dynamicsqltemplateid", params); http://yin-bp.iteye.com 1.12 bbossgroups 持久层模板sql变量参数设置的三种方式 第 74 / 188 页 List方式: SQLParams params = new SQLParams(); params.addSQLParam("id", 139, SQLParams.INT); params.addSQLParam("fieldName", "duoduo139", SQLParams.STRING); List params_ = new ArrayList(2); params_.add(params); params = new SQLParams(); params.addSQLParam("id", 140, SQLParams.INT); params.addSQLParam("fieldName", "duoduo140", SQLParams.STRING); params_.add(params); params = new SQLParams(); params.addSQLParam("id", 141, SQLParams.INT); params.addSQLParam("fieldName", "duoduo141", SQLParams.STRING); params_.add(params); executor.updateBeans("updatesqltemplate", params_);//批量更新处理多个记录 补充说明-executor变量定义和相对应的sql配置文件 executor变量定义: ConfigSQLExecutor executor = = new ConfigSQLExecutor("com/frameworkset/sqlexecutor/sqlfile.xml"); sql配置文件: 三种方式就介绍到此,欢迎感兴趣的朋友深入探讨bbossgroups持久层框架的方方面面。 相关文档: bbossgroups持久层框架动态sql语句配置和使用 http://yin-bp.iteye.com 1.12 bbossgroups 持久层模板sql变量参数设置的三种方式 第 76 / 188 页 1.13 bbossgroups mvc大文件上传及or mapping存储大文件机制详解 发表时间: 2011-09-23 关键字: bbossgroups, bbossmvc, persistent, easyui 继续上两篇文章: bboss mvc文件上传下载实战演练-http://yin-bp.iteye.com/blog/1130035 bboss mvc文件上传下载实战进阶-http://yin-bp.iteye.com/blog/1131637 本文着重介绍bboss mvc大文件上传和利用持久层的or mapping机制存储大文件功能介绍,切入正题 功能点说明: 1.jsp form附件上传表单 2.jquery easyui 表单提交 3.mvc控制附件处理方法 4.绑定附件值对象 5.利用or mapping技术持久化附件信息和附件内容 大致流程如下: 通过将表单提交的附件信息传递给控制方法,mvc将表单数据以及附件信息封装到DeskTopBackGround对象 中,利用持久层组件将该附件信息存储到数据库中。 下面逐一说明: 首先介绍各个层面都要用到的附件值对象 public class DeskTopBackGround { private String cn_name; private Timestamp creatdate; private String filename; @Column(type="blobfile") private MultipartFile picture; 。。。//省略get/set方法 } DeskTopBackGround 中的属性MultipartFile picture包含了附件信息和附件内容,需要注意的是,必须通过 @Column(type="blobfile")注解说明附件类型,即是一个blob二进制附件还是一个clob文本附件,分别对应 http://yin-bp.iteye.com 1.13 bbossgroups mvc大文件上传及or mapping存储大文件机制详解 第 77 / 188 页 为:@Column(type="blobfile")和@Column(type="clobfile"),这样ormapping机制就能清楚地进行相应的 处理。 jsp 附件上传表单
名称:
附件:
jquery-easyui form表单提交操作: $("#listForm").form('submit', { "url": "saveBackGround.page",//控制器请求url onSubmit:function(){ //显示遮罩 blockUI(); }, success:function(responseText){ http://yin-bp.iteye.com 1.13 bbossgroups mvc大文件上传及or mapping存储大文件机制详解 第 78 / 188 页 //去掉遮罩 unblockUI(); if(responseText == "success"){ $.messager.alert("提示对话框" , "附件上传成功!"); queryList(); } else $.messager.alert("提示对话框" , "附件上传失败:"+responseText); } }); mvc控制附件处理方法 public @ResponseBody(charset="gbk") String uploadBackGround( DeskTopBackGround bean) { try { bean.setFilename(bean.getPicture().getOriginalFilename());//设置附件名称到filename属性 bean.setCreatdate(new Timestamp(new Date().getTime()));//设置创建时间 String sql = "insert into td_sm_desktopstylecustom(filename,creatdate,cn_name,picture) values(#[filename],#[creatdate],#[cn_name],#[picture])"; SQLExecutor.insertBean(sql, bean); return "success"; } catch (Exception e) { return "fail:"+e.getMessage(); } } 控制方法包含一个DeskTopBackGround bean参数,mvc框架根据表单的信息生成DeskTopBackGround 对 象实例,uploadBackGround方法对该实例进行相应的处理后,通过持久层的or mapping接口存储到数据库表 中: http://yin-bp.iteye.com 1.13 bbossgroups mvc大文件上传及or mapping存储大文件机制详解 第 79 / 188 页 SQLExecutor.insertBean(sql, bean); 然后将处理结果信息相应到客户端,客户端进行相应的提示: $.messager.alert("提示对话框" , "附件上传成功!"); 后记 到此本文的正文内容就介绍完了,至于mvc配置文件和持久层数据源配置请参考博客中相关文章: bboss mvc基础配置介绍-http://yin-bp.iteye.com/blog/1139608 bbossgroups 开发系列文章之-最佳实践-http://bbossgroups.group.iteye.com/group/wiki/3092-mvc- bboss-config bboss persistent框架数据库连接池配置介-http://yin-bp.iteye.com/blog/352599 http://yin-bp.iteye.com 1.13 bbossgroups mvc大文件上传及or mapping存储大文件机制详解 第 80 / 188 页 1.14 bbossgroups 3.x持久层行处理器使用示例 发表时间: 2011-09-20 关键字: bbossgroups, 持久层, 行处理器 bbossgroups 3.x持久层行处理器使用示例 1.概述 行处理主要用来提供灵活高效的查询结果处理方法,下面着重介绍一下三种主要行处理器:空行处理器、返回值 行处理器以及字段行处理器。 1.1 空行处理器-灵活度最高的行处理器,结果集全部自行封装,框架干预少 com.frameworkset.common.poolman.handle.NullRowHandler 空行处理器适用于 1.2.返回值行处理器-框架负责返回数据集,记录字段转换为值对象自行处理 com.frameworkset.common.poolman.handle.RowHandler 1.3.字段行处理器-对单个字段进行行级处理,并将处理值发挥给调用程序,字段行处理器主要用来处理blob和 clob大字段类型的单字段查询功能,消除不同的数据库对大字段处理的差异性 com.frameworkset.common.poolman.handle.FieldRowHandler 2.使用方法 2.1 空行处理器 map方式 public Map getUserDeskMapMenus(DeskTopMenuBean bean) throws Exception { String sql = "SELECT menupath,subsystem,userid FROM TD_SM_DESKMENU WHERE userid=#[userid] and subsystem=#[subsystem]"; final Map datas = new HashMap(); SQLExecutor.queryBeanWithDBNameByNullRowHandler(new NullRowHandler(){ @Override public void handleRow(Record origine) throws Exception { datas.put(origine.getString("menupath"), origine.getString("subsystem")); }}, dbname,sql , bean); http://yin-bp.iteye.com 1.14 bbossgroups 3.x持久层行处理器使用示例 第 81 / 188 页 return datas; } list方式 final List lbs = new ArrayList(); SQLExecutor.queryWithDBNameByNullRowHandler(new NullRowHandler(){ @Override public void handleRow(Record record) throws Exception { ListBean lb = new ListBean(); lb.setId(record.getInt("id")); lb.setFieldName(record.getString("fieldName")); lbs.add(lb); }}, "mysql", "select * from LISTBEAN where id>?", 80); 2.2 返回值行处理器 String sql = "select * from LISTBEAN where ID>?"; List beans = (List) SQLExecutor.queryListByRowHandler(new RowHandler(){ @Override public void handleRow(ListBean lb, Record record) throws Exception { System.out.println("queryListByRowHandler test Result**:"+record.getString("fieldName")); lb.setId(record.getInt("id")); lb.setFieldName(record.getString("fieldName")); }}, ListBean.class, sql, 80); 2.3 字段行处理器 http://yin-bp.iteye.com 1.14 bbossgroups 3.x持久层行处理器使用示例 第 82 / 188 页 字段行处理器实现从blob/clob中获取单个字段文件对象的处理,其他类似类型数据也可以使用 FieldRowHandler,使用示例如下: public File getDownloadClobFile(String fileid) throws Exception { try { return SQLExecutor.queryTField( File.class, new FieldRowHandler() { @Override public File handleField( Record record) throws Exception { // 定义文件对象 File f = new File("d:/",record.getString("filename")); // 如果文件已经存在则直接返回f if (f.exists()) return f; // 将blob中的文件内容存储到文件中 record.getFile("filecontent",f); return f; } }, "select filename,filecontent from CLOBFILE where fileid=?", fileid); } catch (Exception e) { throw e; } } http://yin-bp.iteye.com 1.14 bbossgroups 3.x持久层行处理器使用示例 第 83 / 188 页 几种常用的使用方法就介绍完了,同时我们还可以结合行处理器完成分页查询,这里就不多说,更进一步的内 容请关注博客动态。 http://yin-bp.iteye.com 1.14 bbossgroups 3.x持久层行处理器使用示例 第 84 / 188 页 1.15 bbossgroups 组件容器的使用方法浅析 发表时间: 2011-08-20 关键字: ioc, aop, mvc 本文重点介绍bbossgroups 中的4大组件容器的特点及使用方法 4大组件容器 [1] ApplicationContext org.frameworkset.spi.ApplicationContext 包括基本的aop/ioc功能,业务组件、dao组件管理,远程服务,全局属性管理,拦截器,包含声明式事务管理 [2] WebApplicationContextorg.frameworkset.web.servlet.context.WebApplicationContext 管理所有mvc框架中的控制器,包括基本的aop/ioc功能,业务组件、dao组件管理,不提供远程服务(和远程 服务协议包无关联) [3] DefaultApplicationContextorg.frameworkset.spi.DefaultApplicationContext 包括基本的aop/ioc功能,业务组件、dao组件管理,不提供远程服务(和远程服务协议包无关联) [4] SOAApplicationContext/SOAFileApplicationContext org.frameworkset.spi.SOAApplicationContext org.frameworkset.spi.SOAFileApplicationContext 两个轻量级的ioc容器,包含aop/ioc功能、全局属性管理,业务组件、dao组件管理,不包含远程服务、拦截 器、不包含声明式事务管理,是DefaultApplicationContext的子类,二者主要用来实现对象xml序列化功能, 前者从xml串中反序列化组件,后者从xml文件中反序列化组件 [/list] 4大组件容器的初始化和操作示例 [1] ApplicationContext初始化和使用示例 org.frameworkset.spi.ApplicationContext 初始化: ApplicationContext context = ApplicationContext.getApplicationContext("org/frameworkset/spi/beans/testapplicationcontext.xml"); 使用示例: 本地服务组件实例获取方法 http://yin-bp.iteye.com 1.15 bbossgroups 组件容器的使用方法浅析 第 85 / 188 页 RestfulServiceConvertor convertor = context.getTBeanObject("rpc.restful.convertor",RestfulServiceConvertor.class); 远程服务组件实例获取方法(以rmi协议为例,其他协议类似,更多信息参考博客其他文章): RestfulServiceConvertor convertor = (RestfulServiceConvertor)context.getBeanObject("(rmi::172.16.17.216:1099)/rpc.restful.convertor"); [2] WebApplicationContext org.frameworkset.web.servlet.context.WebApplicationContext WebApplicationContext的初始化是在bboss mvc框架启动过程中自动初始化的,你、只需要在web.xml文件 中做如下配置即可: mvcdispather org.frameworkset.web.servlet.DispatchServlet contextConfigLocation /WEB-INF/bboss-*.xml, /WEB-INF/conf/bboss-*.xml 0 mvcdispather *.page WebApplicationContext容器将会加载contextConfigLocation属性中配置的所有配置文件,形成一个的mvc 框架组件容器。 我们可以在程序这样获取WebApplicationContext容器的实例: http://yin-bp.iteye.com 1.15 bbossgroups 组件容器的使用方法浅析 第 86 / 188 页 WebApplicationContext context = org.frameworkset.web.servlet.support.WebApplicationContextUtils.getWebApplicationContext();//获取实例 //通过以下方式获取mvc容器中的组件实例方法 DeskTopMenuShorcutManager m = context.getTBeanObject("deskTopMenuShorcutManager", DeskTopMenuShorcutManager.class); [3] DefaultApplicationContext org.frameworkset.spi.DefaultApplicationContext DefaultApplicationContext的实例定义和获取组件实例方法为: BaseApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/beans/testapplicationcontext.xml"); RestfulServiceConvertor convertor = context.getTBeanObject("rpc.restful.convertor",RestfulServiceConvertor.class); [4] SOAApplicationContext/SOAFileApplicationContext org.frameworkset.spi.SOAApplicationContext org.frameworkset.spi.SOAFileApplicationContext SOAApplicationContext的实例化和获取组件实例示例代码: String content = "" + ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ "String"+ "String"+ "String[]"+ ""+ "" + ""+ ""+ "1=1"+ "order by ${A}"+ ""+ " "+ "A"+ "B"+ ""+ ""+ ""+ "" + "" + ""+ ""+ ""; //从xml字符串实例化SOAApplicationContext对象 SOAApplicationContext context = new SOAApplicationContext(content); //获取xml串中包含的组件对象实例 SOAMethodCall object = context.getTBeanObject("soamethodcall",SOAMethodCall.class); SOAFileApplicationContext的实例化和获取组件实例示例代码: http://yin-bp.iteye.com 1.15 bbossgroups 组件容器的使用方法浅析 第 88 / 188 页 SOAFileApplicationContext context = new SOAFileApplicationContext("org/frameworkset/soa/datasource-sql.xml"); //获取xml串中包含的组件对象实例 SOAMethodCall object = context.getTBeanObject("soamethodcall",SOAMethodCall.class); http://yin-bp.iteye.com 1.15 bbossgroups 组件容器的使用方法浅析 第 89 / 188 页 1.16 bbossgroups框架发布的jar包和依赖jar包概览 发表时间: 2011-08-09 bbossgroups框架发布的jar包和依赖jar包概览 本文介绍bbossgroups框架发布生成的jar清单及依赖的第三方jar包和相关资源。 1.aop框架生成的jar包及最小依赖的第三方jar 依赖的第三方jar包 cglib-2.2.jar frameworkset-util.jar log4j-1.2.14.jar 2.MVC框架生成jar包及依赖的第三方jar包 bboss-mvc.jar 依赖的第三方jar包 frameworkset-pool.jar velocity-1.6.4.jar log4j-1.2.14.jar jstl-1.2.jar jakarta-oro-2.0.8.jar jackson-all-1.6.2.jar frameworkset-util.jar frameworkset-pool.jar frameworkset.jar ecs-1.4.2.jar cms.jar cglib-nodep-2.2.jar bboss-aop.jar asm-3.1.jar 3.持久层框架jar包及依赖的第三方jar包 http://yin-bp.iteye.com 1.16 bbossgroups框架发布的jar包和依赖jar包概览 第 90 / 188 页 frameworkset-pool.jar 依赖的第三方jar包 4.标签库框架jar包及依赖的第三方jar包 frameworkset.jar ditchnet-tabs-taglib.jar 5.工具框架jar包 frameworkset-util.jar 6.对象序列化jar包 bboss-soa.jar 7.标签库需要用到的js文件 /include/pager.js /include/jquery-1.4.2.min.js /include/jquery-easyui.js 修复了jquery ajax提交时中文乱码问题 jsp采用gbk编码时,url后带中文参数时会出现乱码问题 Post方法中指定了中文参数时,如果不编码在ie浏览器重会出现乱码问题 经过修改/include/jquery-1.4.2.min.js文件修复了上述问题 8.标签定义文件-tld 9.标签库对应的模板vm文件 http://yin-bp.iteye.com 1.16 bbossgroups框架发布的jar包和依赖jar包概览 第 91 / 188 页 http://yin-bp.iteye.com 1.16 bbossgroups框架发布的jar包和依赖jar包概览 第 92 / 188 页 1.17 bboss mvc基础配置介绍 发表时间: 2011-08-03 关键字: bboss, mvc bboss mvc基础配置介绍,本文重点介绍bboss-mvc.xml文件中的一些有意义的配置以及其什么时候被加载。 1.bboss-mvc.xml加载 首先介绍bboss-mvc.xml文件什么时候会被加载,先谈一下web.xml中bboss mvc的请求处理servlet的配置: mvcdispather org.frameworkset.web.servlet.DispatchServlet contextConfigLocation 0 mvcdispather *.page 其中的/WEB-INF/conf/bboss-*.xml很关键,他会扫描/WEB-INF/conf下所有以bboss-开头的mvc xml配置文 件并加载之;这里可以配置多个目录,用逗号分隔,只要bboss-mvc.xml放在其中的一个目录下就会在应用启 动的时候被加载。 2.bboss-mvc.xml中经常会用到的配置 2.1 文件上传插件配置 http://yin-bp.iteye.com 1.17 bboss mvc基础配置介绍 第 93 / 188 页 常用的配置属性有: encoding,一般被配置为utf-8,用来对附件上传表单中的请求参数进行单独的编码转换,避免中文乱码问题。 maxUploadSize:允许上传的最大文件大小,单位为byte,为-1时不限制大小。 maxInMemorySize:允许在内存中存放的最大文件块大小,以byte为单位,默认为10K uploadTempDir:指定上传文件存放的临时目录,默认为应用临时目录 2.2 文件下载、json响应、字符串响应插件配置 如果不指定"org.frameworkset.http.converter.json.MappingJacksonHttpMessageConverter,那么控制方 法中以下写法将不能正常工作: public @ResponseBody(datatype="json") GouWuChe datagrid_data() 也就是说不能正确地将对象GouWuChe 转换为json对象返回给请求客户端。 如果不指定"org.frameworkset.http.converter.FileMessageConvertor,那么控制器方法的以下写法将不能正 常工作: public @ResponseBody File downloadFileFromFile(@RequestParam(name = "fileid") String fileid) throws Exception 也就是说不能正常地下载返回的File对应的文件。 如果不指定"org.frameworkset.http.converter.StringHttpMessageConverter,那么控制器方法的以下写法 将不能正常工作: http://yin-bp.iteye.com 1.17 bboss mvc基础配置介绍 第 94 / 188 页 public @ResponseBody(charset = "GBK") String sayHelloEnum(@RequestParam(name = "sex") SexType type) 也就是说不能正常地将返回值String响应给客户端。 2.3 全局拦截器配置(最常见的就是页面保护机制配置) http://yin-bp.iteye.com 1.17 bboss mvc基础配置介绍 第 95 / 188 页 这里展示的就是实际项目中页面保护拦截器的配置,bboss mvc中提供页面保护的基础抽象实现: org.frameworkset.web.interceptor.AuthenticateInterceptor 具体的页面保护拦截器只需要实现抽象方法: protected boolean check(HttpServletRequest request, HttpServletResponse response, HandlerMeta handlerMeta) 即可,方法的前两个参数一看就明白,关键是HandlerMeta 参数,这个是当前控制器的元数据对象,包含了控 制器的所有配置信息,一般不会用到。方法的逻辑就是具体的页面保护监测逻辑,如果用户已经登录则继续完 成请求(返回true),否则(返回false)跳转到redirecturl指定的页面地址(通常是登录页面),通过 directtype属性来指定是forward方式还是redirect方式;通过exposeModelAttributes属性来指定是否要将当 前请求的页面地址和相关参数传递到登录页上面去,以便登录成功后返回当前请求页面。patternsInclude属性 列表用来指定需要做页面保护的所有页面地址,不配置表示对所有控制器请求做页面保护监测。 patternsExclude列表属性用来指定哪些页面请求不需要做页面保护。 2.4 url重写规则配置 这个是用来配置所有控制器方法跳转地址是否需要进行url重写以及怎么重写的规则进行配置,以下就是最常用 的配置: http://yin-bp.iteye.com 1.17 bboss mvc基础配置介绍 第 96 / 188 页 以上配置其实并没有设置重写规则,因为url重写前置prefix被配置为"",重写后缀suffix也被配置为"",这样控制跳 转地址配置或者直接返回的地址串就是实际的物理url地址,mvc框架不做任何处理。 除非有特殊要求的项目才会开启url重写规则,也就是配置url重写前缀prefix和重写后缀suffix: url重写前置prefix被配置为"/jsp/",重写后缀suffix也被配置为".jsp",这样控制跳转地址配置或者直接返回的地址 串就是:"/jsp/"+returl+".jsp"。有人可能会担心url重写规则是否会影响性能,其实不会的,因为url只会被计算 一次,后面就从缓冲区中取已经重写好的地址了。 以上就是bboss-mvc.xml中比较重要的一些应用可能会用到并修改的配置,其他的配置内容基本不用开发人员 修改,保持默认配置即可。 http://yin-bp.iteye.com 1.17 bboss mvc基础配置介绍 第 97 / 188 页 1.18 bbossgroups标签库使用大全(续) 发表时间: 2011-08-01 关键字: web, 标签库, bbossgroups bbossgroups标签库使用大全(续),接上篇《bbossgroups标签库使用大全》http://yin-bp.iteye.com/ blog/1136924,本片重点介绍逻辑标签的使用。同样在使用的时候需要在jsp页头中倒入标签定义文件tld: <%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%> <%@ taglib uri="/WEB-INF/treetag.tld" prefix="tree" %> <%@ taglib uri="/WEB-INF/commontag.tld" prefix="common"%> bbossgroups中主要包含以下逻辑标签 equal,notequal,null,notnull, equalandlower, equalandupper, upper, lower, in, notin,match,contain,notmatch,notcontain,empty,notempty 1.equal、notequal标签的使用 在list,map,beaninfo标签中使用,对对象中的属性进行相等和不相等逻辑判断: 判断属性sex的值是否等于1,是则输出男,否则忽略标签体中的内容 判断属性sex的值是否不等于1,不等于则输出女,否则忽略标签体中的内容 直接将el表达式的值和value属性的值进行比较: 判断request参数sex的值是否等于1,是则输出男,否则忽略标签体中的内容 判断request参数的值是否不等于1,不等于则输出女,否则忽略标签体中的内容 直接判断同一两个属性是否相等: 判断行号是否是最后一行 判断行号是否是给定的行号 http://yin-bp.iteye.com 1.18 bbossgroups标签库使用大全(续) 第 98 / 188 页 判断行号是否是偶数行 equal和notequal标签可以嵌套在其他的逻辑标签中使用。 2.null,notnull标签的使用 在list,map,beaninfo标签中使用,对对象中的属性进行null和非null逻辑判断: 判断属性sex的值是否为null,是则输出男,否则忽略标签体中的内容 判断属性sex的值是否不为null,不为null则输出女,否则忽略标签体中的内容 直接将el表达式的值进行判断: 判断request参数sex的值是否为null,是则输出男,否则忽略标签体中的内容 判断request参数的值是否不等于null,不等于null则输出女,否则忽略标签体中的内容 null和notnull标签可以嵌套在其他的逻辑标签中使用。 3.empty,notempty 标签的使用 empty的含义为:字符串为null或者"",容器对象为null或者size为0.notempty则相反。 在list,map,beaninfo标签中使用,对对象中的属性进行empty和非empty逻辑判断: 判断属性sex的值是否为empty,是则输出男,否则忽略标签体中的内容 判断属性sex的值是否不为empty,不为empty则输出女,否则忽略标签体中的内容 直接将el表达式的值进行判断: 判断request参数sex的值是否为empty,是则输出男,否则忽略标签体中的内容 判断request参数的值是否不等于null,不等于null则输出女,否则忽略标签体中的内容 empty和notempty标签可以嵌套在其他的逻辑标签中使用。 http://yin-bp.iteye.com 1.18 bbossgroups标签库使用大全(续) 第 99 / 188 页 4.in, notin标签的使用 in标签判定指定的值是否包含在几个值中间,notin的意义相反。 在list,map,beaninfo标签中使用,判定对象中的属性是否包含在几个值中间,notin的意义相反: 判断属性id的值是否为1,2,3,4,5中的一个数字,是则输出ddddd,否则忽略标签体中的内容 ddddd 判断属性id的值是否不包含在1,2,3,4,5,不则输出ddddd,否则忽略标签体中的内容 ddddd 直接将el表达式的值进行判断: 判断request参数sex的值是否1,2,3,4,5中的一个数字,是则输出ddddd,否则忽略标签体中的内容 判断request参数的值是否不包含在1,2,3,4,5,不则输出ddddd,否则忽略标签体中的内容 in和notin标签可以嵌套在其他的逻辑标签中使用。 5.contain, notcontain,match ,notmatch 标签的使用 contain, notcontain标签分别用来判断给定属性的值包含/不包含正则表达式对应的字符串 match ,notmatch 标签分别用来判断给定属性的值匹配/不匹配给定的正则表达式模式。 下面是具体的用法: ddddd ddddd ddddd ddddd 同样支持el表达式: ddddd ddddd ddddd ddddd 6.一组大于/小于/大于等于/小于等于逻辑标签 equalandlower, equalandupper, http://yin-bp.iteye.com 1.18 bbossgroups标签库使用大全(续) 第 100 / 188 页 upper, lower 这组标签的使用方法基本上和其他逻辑标签使用方法一致,这里不做过多的介绍了。 http://yin-bp.iteye.com 1.18 bbossgroups标签库使用大全(续) 第 101 / 188 页 1.19 bbossgroups标签使用大全 发表时间: 2011-07-31 关键字: java mvc 标签库 bbossgroups bbossgroups标签库使用大全 本文介绍bbossgroups中所有的标签及其使用方法。 1.bbossgroups中的标签 1.1.数据展示标签主要是bboss taglib中的一系列标签,很好地和mvc框架、jquery、jquery easyui结合使 用: pager, listdata,notify,list, beaninfo,cell, rowid,rowcount,querystring , convert,contextmenu,map,mapkey,param,index,config 树标签:tree,treedata,radio,checkbox 1.2.逻辑标签(可以和页面数据展示标签结合使用,也可以单独使用)equal,notequal,null,notnull, equalandlower, equalandupper, upper, lower, in, notin,match,contain,notmatch,notcontain,empty,notempty 1.3.国际化和主题标签message theme 1.4.mvc数据绑定错误信息展示标签errors error globalerrors 1.5.request/session标签request session 1.6.数据库操作标签,有效防止sql注入问题 dbutil-执行数据库增、删、改操作(预编译和普通) sqlparams-用于支持在pager标签,beaninfo标签,list标签上执行预编译操作的绑定变量集合,同时可以指定 sql绑定变量的定义语法分界符。 batchutil-执行预编译批处理、普通批处理操作 statement-指定batchutil要执行的批处理语句,可以是预编译sql语句,也可以是普通sql语句 batch-指定statement指定的预编译sql语句的一组绑定变量 sqlparam-用来指定预编译操作的sql绑定变量参数的值、数据类型、数据格式,只能内置在dbutil, sqlparams,statement,batch三个标签中。 数据库标签的介绍,请参考文章: http://yin-bp.iteye.com/blog/648161 http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 102 / 188 页 2.下面全面介绍每类标签的简单用法。 2.1.标签定义文件的导入 <%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%> <%@ taglib uri="/WEB-INF/treetag.tld" prefix="tree" %> <%@ taglib uri="/WEB-INF/commontag.tld" prefix="common"%> 2.2.config 标签 config 用来导入标签库用到的js文件,enablecontextmenu用来控制是否输出右键菜单相关的js函数,false不 输出,反之输出,使用方法如下: 2.3.list标签 用来输出list,set,map[],list,list等中的数据,使用方法如下,可以和pager标签结合 使用,也可以直接从request,session,pagecontext中获取数据,或者直接从数据库获取数据,或者和list嵌套 使用。 从request,session,pagecontext中获取数据: 和pager标签结合使用: http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 103 / 188 页 TABLE_ID_INCREMENT TABLE_ID_VALUE TABLE_ID_GENERATOR TABLE_ID_TYPE TABLE_ID_PREFIX 没有数据 http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 104 / 188 页 ">
条记录 每页显示15条
直接从数据库获取数据: http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 105 / 188 页 "> 和list嵌套使用: list标签还可嵌套在beaninfo、map标签中使用。list标签还可以输出数组的元素值: http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 106 / 188 页 2.4.cell标签 cell标签典型用法如下: //默认输出值为""串 //默认输出值为"mm"串 //超过最大长度10将被截断 //超过最大长度10将被截断,截断的串将被replace 指定的值替换掉 cell标签可以嵌套在beaninfo、list、map标签中使用也可以单独使用,单独使用的方法如下: //直接输出el表达式${param.name}代表的值。 2.5.beaninfo标签 beaninfo标签用来展示po详细信息的标签,具体用法有从request,session,pageContext中获取要展示的对 象,或者从db中获取要展示的数据,或者嵌套在list,map,beaninfo标签中展示属性对应的对象。 从request获取要展示的对象: 从db中获取要展示的数据: http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 107 / 188 页 "> 嵌套在list中使用: 2.6.map、mapkey标签 map标签用来迭代展示map中的所有对象详细信息,mapkey标签在map标签中使用,用来输出map中的key 值,map标签展示的数据可以从request,session,pagecontext中获取,也可以嵌套在list,beaninfo, http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 108 / 188 页 map标签中使用。 从request获取要展示的对象: 嵌套在list中使用: map标签还可以展示Map等基础数据类型value的迭代:

map字符串信息迭代功能

http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 109 / 188 页 mapkey: value:
2.7.pager、listdata、querystring、rowcount、param、index、title、notify标签 pager标签主要用来和index、listdata、list等标签或者mvc框架控制器方法结合实现分页功能,分页数据可以 从数据加载器中获取,也可以从db中直接或取,还可以从mvc控制器方法中获取。另外还可以和ajax结合在一 个页面中加载多个分页模块。 从数据加载器中获取数据: http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 110 / 188 页 没有数据 ">
条记录 http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 111 / 188 页 每页显示15条
其中listdata标签指定了分页标签的数据加载器,并将加载器存放在request的attribute属性TableInfoListData 中,pager标签通过data属性引用该加载器,并且指定了每页最多显示15条记录;param 标签用来记录页面请 求参数以便上下翻页时不丢失请求或者查询参数;notify标签用来输出没有数据的提示信息;list标签用来迭代 输出当页数据;rowcount标签输出总记录数;index标签输出以下内容: 上下分页导航按钮 共几页,每页多少条记录,调整到第几页,设置每页记录数等等 querystring标签用来输出页面所有参数串,用来方便进行处理和操作后任然跳回到当前页面。 从数据库中直接获取数据,这个和上面的用法的唯一区别就是: 不需要listdata标签,只需要将pager标签如下使用即可: 和ajax结合在一个页面中加载多个分页模块的使用方法: 主页面内容:
http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 112 / 188 页
两个从页面内容基本上差不多:
http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 113 / 188 页
没有数据
需要说明的就是pager标签上新加的两个属性 containerid="pagecontainer" //代表main页面的div容器id,这个分页list的内容将在该div中展示 selector="pagecontent" //表示分页页面内容的选择器 data="users"对应的ListInfo对象直接从mvc控制器方法设置到request的attribute属性中。例如: public String pagerqueryuser1(@PagerParam(name=PagerParam.SORT ) String sortKey, @PagerParam(name=PagerParam.DESC,defaultvalue="true") boolean desc, @PagerParam(name=PagerParam.OFFSET) long offset, @PagerParam(name=PagerParam.PAGE_SIZE,defaultvalue="2") int pagesize, @RequestParam(name = "userName") String username , ModelMap model) throws UserManagerException { ListInfo userTemp = userService.getUsersNullRowHandler(username,offset, pagesize); model.addAttribute("users", userTemp); return "jquerypagine/page1"; } 2.8.index标签 index标签作为导航标签具有以下实用的属性: export-控制导航键是否出现得属性:000000000(9位) 分别对应于"第几页"、“共几页”、“首页”、“下 一页”、“上一页”、“尾页”、“跳转到”,“每页显示几条记录”,"共多少条记录" http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 114 / 188 页 对应得位置上的值为0时标示显示该按钮,为1时不显示。 useimage-导航按钮是否使用图片,默认值为false 只有useimage=true时,imagedir和imageextend才起作用 如果useimage=true时,没有指定imagedir和imageextend属性,那么采用默认属性 使用方法 useimage-如果useimage=true时,没有指定imagedir和imageextend属性,那么采用默认属性 使用方法 imagedir-导航按钮图片存放目录,存放的图片名称为: first.gif-首 页 next.gif-下一页 pre.gif-上一页 last.gif-尾 页 默认值为:/include/images imageextend-导航图片的扩展属性串,默认值为:" border=0 " classname-中间页面样式名称,类似于google的页码1页,2页的样式 tagnumber-设置展示的中间页面数,默认为-1,即不展示中间页 centerextend-中间页扩展属性,用来设置每个页面元素的额外css属性和其他扩展属性 sizescope-可选择页面显示记录数,默认为 "5","10","20","30","40","50","60","70","80","90","100" 用户可以自定义这个范围,以逗号分隔即可 如果在pager标签和list标签上指定的maxPageItems属性对应的页面记录条数不在sizescope范围中,那么 将把maxPageItems作为第一个选项加入到sizescope中 2.9.rowid、rowcount、pagesize标签 rowid标签用来输出list和map循环中的行号,具体使用方法如下: //默认从0开始 //从1开始 offset为用来表示每页是否都从0开始重新计数 rowcount标签用来输出总记录数,用法如下: pagesize用来输出当前页面记录,用法如下: 2.10 convert标签 convert标签主要用来实现属性值的转码,也就是说经属性值和名称的映射关系放到map中,然后通过convert http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 115 / 188 页 标签结合colName和code属性结合来实现代码转换: <% Map aaaaa = new HashMap(); aaaaa.put("1","男"); aaaaa.put("2","女"); request.setAttribute("codes",aaaaa); %> 2.11.标签内置变量 list、map、beaninfo标签都有一些内置java变量,可以直接在标签中使用: list、map标签:dataSet对象,可以使用java代码访问该对象获取数据 beaninfo标签:beanifo对象,可以使用java代码访问该对象获取数据 未完待续。 http://yin-bp.iteye.com 1.19 bbossgroups标签使用大全 第 116 / 188 页 1.20 bbossgroups持久层框架查询返回Map对象和Map列表对象api 发表时间: 2011-07-02 关键字: 企业应用 bbossgroups持久层框架查询返回Map对象和Map列表对象api: @Test public void queryListMap() throws SQLException { String sql = "select * from LISTBEAN "; List dbBeans = SQLExecutor.queryListWithDBName(HashMap.class, "mysql", sql); System.out.println(dbBeans); } @Test public void queryMap() throws SQLException { String sql = "select * from LISTBEAN "; Map dbBeans = SQLExecutor.queryObject(HashMap.class, sql); System.out.println(dbBeans); } map对象中存放的key为查询列的大写名称,value为字段的的值。 http://yin-bp.iteye.com 1.20 bbossgroups持久层框架查询返回Map对象和Map列表对象api 第 117 / 188 页 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 发表时间: 2011-07-02 关键字: 企业应用 本文简单介绍bbossgroups持久层框架ConfigSQLExecutor组件api实例,以下就是相关接口的使用实例: /* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.frameworkset.sqlexecutor; import java.math.BigDecimal; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.frameworkset.common.poolman.ConfigSQLExecutor; import com.frameworkset.common.poolman.SQLParams; public class ConfigSQLExecutorTest { private ConfigSQLExecutor executor ; http://yin-bp.iteye.com 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 第 118 / 188 页 @Before public void init() { executor = new ConfigSQLExecutor("com/frameworkset/sqlexecutor/sqlfile.xml"); try { String sql = executor.getSql("sqltemplate"); sql = executor.getSql("bspf","sqltemplate"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void queryMap() throws SQLException { Map dbBeans = executor.queryObject(HashMap.class, "sqltest"); System.out.println(dbBeans); } @Test public void queryField() throws SQLException { ListBean bean = new ListBean(); bean.setFieldName("阿斯顿飞"); // String result = executor.queryFieldBean("sqltemplate", bean); System.out.println(result); result = executor.queryFieldBean("sqltemplate", bean); System.out.println(result); } @Test http://yin-bp.iteye.com 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 第 119 / 188 页 public void dynamicquery() throws SQLException { ListBean bean = new ListBean(); bean.setFieldName("阿斯顿飞"); // List result = executor.queryListBean(ListBean.class, "dynamicsqltemplate", bean); System.out.println(result.size()); bean.setFieldName(""); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplate", bean); System.out.println(result.size()); bean.setFieldName(null); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplate", bean); System.out.println(result.size()); } @Test public void dynamicqueryWithSQLParams() throws SQLException { SQLParams params = new SQLParams(); params.addSQLParam("fieldName", "阿斯顿飞", SQLParams.STRING); // List result = executor.queryListBean(ListBean.class, "dynamicsqltemplate", params); System.out.println(result.size()); params = new SQLParams(); params.addSQLParam("fieldName", "", SQLParams.STRING); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplate", params); System.out.println(result.size()); params = new SQLParams(); params.addSQLParam("fieldName", null, SQLParams.STRING); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplate", params); System.out.println(result.size()); } http://yin-bp.iteye.com 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 第 120 / 188 页 @Test public void dynamicqueryidWithbean() throws SQLException { ListBean bean = new ListBean(); bean.setId(139); // List result = executor.queryListBean(ListBean.class, "dynamicsqltemplateid", bean); System.out.println(result.size()); bean.setId(-1); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplateid", bean); System.out.println(result.size()); bean.setId(0); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplateid", bean); System.out.println(result.size()); } @Test public void dynamicqueryidWithSQLParams() throws SQLException { SQLParams params = new SQLParams(); params.addSQLParam("id", 139, SQLParams.INT); // List result = executor.queryListBean(ListBean.class, "dynamicsqltemplateid", params); System.out.println(result.size()); params = new SQLParams(); params.addSQLParam("id", -1, SQLParams.INT); result = (List) executor.queryListBean(ListBean.class,"dynamicsqltemplateid", params); System.out.println(result.size()); params = new SQLParams(); params.addSQLParam("id", 0, SQLParams.INT); result = (List) executor.queryListBeanWithDBName(ListBean.class,"mysql","dynamicsqltemplateid", params); // result = (List) SQLExecutor.queryListBeanWithDBName(ListBean.class,"dbname","sql", params); http://yin-bp.iteye.com 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 第 121 / 188 页 System.out.println(result.size()); } @Test public void updateWithSQLParams() throws SQLException { SQLParams params = new SQLParams(); params.addSQLParam("id", 139, SQLParams.INT); params.addSQLParam("fieldName", "duoduo139", SQLParams.STRING); List params_ = new ArrayList(2); params_.add(params); // params = new SQLParams(); params.addSQLParam("id", 140, SQLParams.INT); params.addSQLParam("fieldName", "duoduo140", SQLParams.STRING); params_.add(params); params = new SQLParams(); params.addSQLParam("id", 141, SQLParams.INT); params.addSQLParam("fieldName", "duoduo141", SQLParams.STRING); params_.add(params); executor.updateBeans("updatesqltemplate", params_); // result = (List) SQLExecutor.queryListBeanWithDBName(ListBean.class,"dbname","sql", params); // System.out.println(result.size()); } @Test public void queryFieldWithSQLParams() throws SQLException { http://yin-bp.iteye.com 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 第 122 / 188 页 int count = executor.queryTField(int.class, "queryFieldWithSQLParams"); System.out.println("count:" + count); long count_long = executor.queryTField(long.class, "queryFieldWithSQLParams"); System.out.println("count_long:" + count_long); short count_short = executor.queryTField(short.class, "queryFieldWithSQLParams"); System.out.println("count_short:" + count_short); double count_double = executor.queryTField(double.class, "queryFieldWithSQLParams"); System.out.println("count_double:" + count_double); float count_float = executor.queryTField(float.class, "queryFieldWithSQLParams"); System.out.println("count_float:" + count_float); BigDecimal count_BigDecimal = executor.queryTField(BigDecimal.class, "queryFieldWithSQLParams"); System.out.println("count_BigDecimal:" + count_BigDecimal.intValue()); BigDecimal[] count_BigDecimals = executor.queryTField(BigDecimal[].class, "queryFieldWithSQLParams"); System.out.println("count_BigDecimals[0]:" + count_BigDecimals[0].intValue()); // result = (List) SQLExecutor.queryListBeanWithDBName(ListBean.class,"dbname","sql", params); // System.out.println(result.size()); } @Test public void updateWithMapParams() throws SQLException { Map datas = new HashMap(); datas.put("id", 139); datas.put("fieldName", "updateWithMapParams139"); List params_ = new ArrayList(); params_.add(datas); datas = new HashMap(); http://yin-bp.iteye.com 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 第 123 / 188 页 datas.put("id", 140); datas.put("fieldName", "updateWithMapParams140"); params_.add(datas); datas = new HashMap(); datas.put("id", 141); datas.put("fieldName", "updateWithMapParams141"); params_.add(datas); executor.updateBeans("updatesqltemplate", params_); // result = (List) SQLExecutor.queryListBeanWithDBName(ListBean.class,"dbname","sql", params); // System.out.println(result.size()); } } 呵呵,反正方法名称里面带Bean的就是针对条件在bean对象/List、SQLParams/List 和Map/List对象中的这种情况,并且sql语句是模板sql 不带Bean的就是预编译sql语句,变量以?号代替,参数就可以在后面追加 如果要指定dbname的话就在相应的方法后面添加WithDBName 分页方法时需要指定起始地址和每页记录数 还有指定行处理器和空行处理器、Field行处理器的一组接口,呵呵 没办法为了满足各种要求必须提供这么多接口,我估计bboss的persistent应该是业界接口最全的一套 persistent framework了,呵呵 http://yin-bp.iteye.com 1.21 bbossgroups持久层框架ConfigSQLExecutor组件api实例 第 124 / 188 页 1.22 bbossgroups持久层框架数据源配置文件实例 发表时间: 2011-07-02 关键字: 企业应用 bbossgroups持久层框架数据源配置文件实例,本配置包含了物理数据源stsmc的配置实例: stsmc false jdbc/mysql-ds com.mysql.jdbc.Driver jdbc:mysql://172.16.33.46:3306/etl root 123456 READ_COMMITTED true false 2 2 10 false false 50 true false 1200000 2400000 5 true 60 select 1 false false http://yin-bp.iteye.com 1.22 bbossgroups持久层框架数据源配置文件实例 第 127 / 188 页 bboss持久层框架外部数据源配置方法请参考文章《关于bboss-persistent持久层框架通过jndi引用外部数据源 (datasource)》 http://yin-bp.iteye.com 1.22 bbossgroups持久层框架数据源配置文件实例 第 128 / 188 页 1.23 bbossgroups持久层框架动态sql语句配置和使用 发表时间: 2011-07-02 关键字: 企业应用 动态sql配置文件内容: 动态sql语句中包含两种类型的变量: #[service_requester_name] 这种变量将被转换成预编译绑定参数变量 $service_requester_code 这种变量直接被替换成相应的变量值 http://yin-bp.iteye.com 1.23 bbossgroups持久层框架动态sql语句配置和使用 第 129 / 188 页 除了sql参数变量外,我们在sql中使用以下逻辑结构 #if/#elseif/#end 来动态生成sql语句,以下是一个简单的结构实例: #if( $foo < 10 ) #elseif( $foo == 10 ) #elseif( $bar == 6 ) #else #end 根据传入的变量的值做相应的处理,从而在运行时动态生成sql语句,逻辑表达中使用变量的语法为$开头加变 量名称:$service_requester_name。 判断变量是否为null的语法为: #if($service_requester_name) 逻辑表达式使用的Velocity模板引擎语法,非常灵活,我们可以在动态sql模板中使用几乎所有Velocity模板引 擎的功能,具体使用方法可以参考Velocity模板引擎官网资料。 加载sql配置文件并定义ConfigSQLExecutor 组件: public static final String DBNAME = "stsmc"; private static ConfigSQLExecutor executor = new ConfigSQLExecutor("com/chinacreator/tjbb/dao/impl/stxftj.xml"); 只要确保com/chinacreator/tjbb/dao/impl/stxftj.xml文件存放在classpath环境中即可,一般是在classes目 录下。 dao组件中执行动态sql并返回执行结果: http://yin-bp.iteye.com 1.23 bbossgroups持久层框架动态sql语句配置和使用 第 130 / 188 页 package com.chinacreator.esb.uddi.requester.dao.impl; import com.chinacreator.esb.uddi.requester.dao.RequesterDao; import com.chinacreator.esb.uddi.requester.entity.Requester; import com.frameworkset.common.poolman.ConfigSQLExecutor; import com.frameworkset.util.ListInfo; public class RequesterDaoImpl implements RequesterDao { public static final String dbName= "stsmc"; private static ConfigSQLExecutor executor = new ConfigSQLExecutor("com/chinacreator/tjbb/dao/impl/stxftj.xml"); public ListInfo getRequesterDaoListInfo(String sortKey, boolean desc, long offset, int pagesize, Requester queryCondObj) throws Exception { // 还是分页查询哦 queryCondObj.setService_requester_name("%" + queryCondObj.getService_requester_name() + "%");//设定模糊查询条件值 queryCondObj.setService_requester_account("%" + queryCondObj.getService_requester_account() + "%");//设定模糊查询条件值 return executor.queryListInfoBeanWithDBName(Requester.class, dbName, "getRequesterDaoListInfo", offset, pagesize, queryCondObj); } } 这里的dbName是在poolman.xml文件中配置的一个数据源。上文方法演示了如何通过ConfigSQLExecutor 组 件读取动态sql实现分页查询的功能。至于数据源的配置请参考博文: http://yin-bp.iteye.com/blog/1112892 需要额外说明的是怎么对like查询的值进行处理,如何添加%号,需要在dao方法中添加%号,否则不能正常查 询出结果,我们配置的动态sql语句中有两个查询条件是 SERVICE_REQUESTER_NAME like #[service_requester_name] 和 SERVICE_REQUESTER_ACCOUNT like #[service_requester_account] http://yin-bp.iteye.com 1.23 bbossgroups持久层框架动态sql语句配置和使用 第 131 / 188 页 我们在dao方法中如此设置%号: queryCondObj.setService_requester_name("%" + queryCondObj.getService_requester_name() + "%");//设定模糊查询条件值 queryCondObj.setService_requester_account("%" + queryCondObj.getService_requester_account() + "%");//设定模糊查询条件值 相关文档: bbossgroups 持久层模板sql变量参数设置的三种方式 http://yin-bp.iteye.com 1.23 bbossgroups持久层框架动态sql语句配置和使用 第 132 / 188 页 1.24 浅谈 bboss mvc 页面访问控制实现机制 发表时间: 2011-06-08 关键字: MVC, Servlet, Web, JSP, XML 浅谈 bboss mvc 页面访问控制实现机制,本文介绍如何通过bboss mvc框架中的拦截器来实现页面访问控制功 能,内容不多,很简单,但是很实用,呵呵。切入正题。 1.bboss mvc拦截器介绍 1.1 bboss mvc的拦截器接口为: org.frameworkset.web.servlet.HandlerInterceptor 1.2 bboss mvc提供了页面访问控制的基础抽象类,这个类实现了HandlerInterceptor接口: org.frameworkset.web.interceptor.AuthenticateInterceptor AuthenticateInterceptor提供了抽象方法: protected abstract boolean check(HttpServletRequest request, HttpServletResponse response, HandlerMeta handlerMeta); 参数说明:前两个参数是url请求提供了jsp请求对象request和请求响应对象response,第三个参数是mvc请求 控制器的元数据信息handlerMeta,通过这个对象用户可以获取到控制的相关定义信息。 返回值说明:返回boolean值,如果是true表示允许访问,为false表示不允许访问。如果验证通过时,还可以 将用户会话信息以特定的key值对方式存储到request的attribute中,以便控制器方法中方便地获取用户会话信 息;如果验证不通过那么则跳转到用户指定的页面,同时会将用户当前请求的页面信息(页面路径,页面参 数)转交给失败跳转页(一般是登陆页面),当登陆通过后,任然允许用户获取这些信息转向到需要访问的页 面。 1.3 通过继承AuthenticateInterceptor类并实现其中的抽象check方法用户可以非常方便地实现自己的访问控制 拦截器 1.4 用户实现了自己的访问控制拦截器后,还需要在bboss-mvc.xml中配置访问控制拦截和器拦截页面规则(可 http://yin-bp.iteye.com 1.24 浅谈 bboss mvc 页面访问控制实现机制 第 133 / 188 页 以非常方便地配置需要拦截的url请求和不需要拦截的url请求,如果不指定这些规则,就拦截所有的url请求方 法,这里的url请求指的是mvc控制url请求)。 下面举例说明 2.实现自己的访问控制拦截器 2.1 访问控制拦截器定义 /** * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.frameworkset.web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.frameworkset.web.servlet.handler.HandlerMeta; /** *

* MyFirstInterceptor.java *

*

* Description: *

http://yin-bp.iteye.com 1.24 浅谈 bboss mvc 页面访问控制实现机制 第 134 / 188 页 *

* bboss workgroup *

*

* Copyright (c) 2009 *

* * @Date 2011-5-31 * @author biaoping.yin * @version 1.0 */ public class MyFirstInterceptor extends AuthenticateInterceptor{ @Override protected boolean check(HttpServletRequest request, HttpServletResponse response, HandlerMeta handlerMeta) { String name = request.getParameter("name"); if(name != null && name.equals("test")) return false; return true; } } 这个访问控制拦截器逻辑非常简单,直接通过name参数值来判断页面是否可以访问,如果name有值并且值为 test那么就阻止用户继续访问,否则允许用户访问。 2.2 访问控制拦截器及拦截规则配置 bboss-mvc.xml文件中找到如下内容(如果没有就加进去,这里可以配置多个全局拦截器): http://yin-bp.iteye.com 1.24 浅谈 bboss mvc 页面访问控制实现机制 第 135 / 188 页 ............... 找到后将访问控制拦截器配置进去: 这里需要说明一下: patternsInclude-用来指定需要拦截的url请求规则列表,可以是通配符,也可以是具体的地址 patternsExclude-用来指定不需要拦截的url请求规则列表,可以是通配符,也可以是具体的地址 http://yin-bp.iteye.com 1.24 浅谈 bboss mvc 页面访问控制实现机制 第 136 / 188 页 redirecturl-用来指定验证失败时需要跳转的页面,例如/login.jsp,前面带/表示这个地址是相对于应用上下文的 地址,当前请求的页面信息(页面路径,页面参数)转交给失败跳转页(一般是登陆页面),当登陆通过后, 任然允许用户通过获取这些信息转向到需要访问的页面(跳不跳由用户自己决定)。 如果patternsInclude和patternsExclude都没有指定,那么默认拦截所有的控制方法请求。patternsExclude指 定的规则优先级要高些,只要匹配上这个规则那么页面通通放行。 ok,就这么简单,呵呵,本文参考bbossgroups 3.2版本功能编写,适用3.2及后续版本。 http://yin-bp.iteye.com 1.24 浅谈 bboss mvc 页面访问控制实现机制 第 137 / 188 页 1.25 浅谈 BbossMVC 数据绑定 发表时间: 2011-06-05 关键字: MVC, Apache, SQL, Eclipse, Tomcat 浅谈 BbossMVC 数据绑定,本文介绍BbossMVC框架的数据绑定功能。包括数字绑定,字符串绑定,日期类型 绑定,日期数组类型绑定,bean对象绑定,List绑定,Map绑定,枚举类型绑定,枚举类型数组绑定。 相关的框架包请及时更新最新版本 本文涉及的技术包括:mvc,aop/ioc,taglib,jsp 目 录 [ - ] 1.数据绑定实战策略-实例eclipse工程下载和部署以及浏览 2.数据绑定实例-jsp页面 3.数据绑定实例-控制器实现 4.数据绑定控制器配置文件-bboss-helloworld.xml 1.数据绑定实战策略-实例eclipse工程下载和部署以及浏览 1.1.下载本文相关附件-mvc-databind.zip http://dl.iteye.com/topics/download/6b4fc8b6-79dd-325f-b32a-4b69354b35a5 1.2.解压mvc-databind.zip ,将其中的工程导入eclipse即可查看文中相关的源代码 1.3.部署,准备好tomcat 6和jdk 15或以上的版本 1.4.在tomcat 6的conf\Catalina\localhost下增加mvc.xml文件,内容为: 用户可以根据自己的实际情况设置docBase属性的值 1.5.启动tomcat,输入以下地址即可访问mvc的数据绑定实例了: http://localhost:8080/mvc/examples/index.page 2.数据绑定实例-jsp页面 http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 138 / 188 页 <%-- * Copyright 2008-2011 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" session="false"%> <%@ taglib uri="/WEB-INF/commontag.tld" prefix="common"%> <%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%> bboss-mvc - hello world,data bind! http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 139 / 188 页

Hello World number bind Examples.

请输入您的幸运数字:
来自服务器的问候:
/td>

Hello World String bind Examples.

http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 140 / 188 页
请输入您的名字:
来自服务器的问候: 没有名字,不问候。
/td>

Hello World Time bind Examples.

http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 141 / 188 页
请输入您的幸运日期:
普通日期:
sql日期:
timestamp精确具体时间:
来自服务器的日期问候:
/td>

Hello World Time Array bind Examples.

http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 142 / 188 页
请输入您的幸运日期:
普通日期:
sql日期:
timestamp精确具体时间:
来自服务器的日期问候: http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 143 / 188 页
/td>

Hello World Bean bind Examples.

请输入您的名字:
来自服务器的问候: 没有名字,不问候。
/td> http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 144 / 188 页

Hello World List bind Examples.

请输入您的名字:
来自服务器的问候:
/td>

Hello World Map bind Examples.

http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 145 / 188 页
请输入您的名字:
来自服务器的问候:

Hello World Array bind Examples.

http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 146 / 188 页
请输入您的名字两次(一定要两次哦):
来自服务器的问候:

Hello World Enum bind Examples.

NAME:
http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 147 / 188 页 结果
3.数据绑定实例-控制器实现 3.1.控制器实现类 /** * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.frameworkset.mvc; import java.io.IOException; import java.util.List; import java.util.Map; http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 148 / 188 页 import javax.servlet.http.HttpServletResponse; import org.frameworkset.util.annotations.MapKey; import org.frameworkset.util.annotations.RequestParam; import org.frameworkset.web.servlet.ModelMap; /** *

* HelloWord.java *

*

* Description: *

*

* bboss workgroup *

*

* Copyright (c) 2009 *

* * @Date 2011-6-4 * @author biaoping.yin * @version 1.0 */ public class HelloWord { public String sayHelloNumber(@RequestParam(name = "name") int ynum, ModelMap model) { if (ynum != 0) { model.addAttribute("serverHelloNumber", "幸运数字为[" + ynum + "]!"); } else http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 149 / 188 页 model.addAttribute("serverHelloNumber", "幸运数字为[" + ynum + "]!,好像有点不对哦。"); return "path:sayHello"; } public String sayHelloString(@RequestParam(name = "name") String yourname, ModelMap model) { if (yourname != null && !"".equals(yourname)) model.addAttribute("serverHello", "服务器向您[" + yourname + "]问好!"); else model.addAttribute("serverHello", "请输入您的名字!"); return "path:sayHello"; } public String sayHelloTime( @RequestParam(name = "d12", dateformat = "yyyy-MM-dd") java.util.Date d12, @RequestParam(name = "stringdate", dateformat = "yyyy-MM-dd") java.sql.Date stringdate, @RequestParam(name = "stringdatetimestamp", dateformat = "yyyy-MM-dd HH/mm/ss") java.sql.Timestamp stringdatetimestamp, @RequestParam(name = "stringdatetimestamp") String stringdatetimestamp_, ModelMap model) { model.put("utilDate", d12); model.put("sqlDate", stringdate); model.put("sqlTimestamp", stringdatetimestamp); return "path:sayHello"; } public String sayHelloTimes( @RequestParam(name = "d12s", dateformat = "yyyy-MM-dd") java.util.Date[] d12, @RequestParam(name = "stringdates", dateformat = "yyyy-MM-dd") java.sql.Date[] stringdate, @RequestParam(name = "stringdatetimestamps", dateformat = "yyyy-MM-dd HH/mm/ss") java.sql.Timestamp[] stringdatetimestamp, @RequestParam(name = "stringdatetimestamps") String[] stringdatetimestamp_, http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 150 / 188 页 ModelMap model) { model.put("utilDates", d12[0]); model.put("sqlDates", stringdate[0]); model.put("sqlTimestamps", stringdatetimestamp[0]); return "path:sayHello"; } public String sayHelloBean(ExampleBean yourname, ModelMap model) { if (yourname.getName() != null && !"".equals(yourname.getName())) model.addAttribute("serverHelloBean", yourname); else ; return "path:sayHello"; } public String sayHelloBeanList(List yourname, ModelMap model) { model.addAttribute("serverHelloListBean", yourname); return "path:sayHello"; } public String sayHelloBeanMap(@RequestParam(name = "name") String yourname, @MapKey("name") Map mapBeans, ModelMap model) { model.addAttribute("serverHelloMapBean", mapBeans.get(yourname)); return "path:sayHello"; } http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 151 / 188 页 public String sayHelloArray(@RequestParam(name = "name") String[] yournames,ModelMap model) { model.addAttribute("serverHelloArray",yournames); return "path:sayHello"; } /** * 测试单个字符串向枚举类型值转换 * @param type * @param response * @throws IOException */ public void sayHelloEnum(@RequestParam(name="sex") SexType type,HttpServletResponse response) throws IOException { if(type != null) { if(type == SexType.F) { response.setContentType("text/html; charset=GBK"); response.getWriter().print("女"); } else if(type == SexType.M) { response.setContentType("text/html; charset=GBK"); response.getWriter().print("男"); } else if(type == SexType.UN) { response.setContentType("text/html; charset=GBK"); response.getWriter().print("未知"); } } } /** http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 152 / 188 页 * 测试单个字符串向枚举类型值转换 * @param type * @param response * @throws IOException */ public void sayHelloEnums(@RequestParam(name="sex") SexType[] types,HttpServletResponse response) throws IOException { response.setContentType("text/html; charset=GBK"); if(types != null) { if(types[0] == SexType.F) { response.getWriter().print("女"); } else if(types[0] == SexType.M) { response.getWriter().print("男"); } else if(types[0] == SexType.UN) { response.getWriter().print("未知"); } } } public String index() { return "path:sayHello"; } } http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 153 / 188 页 3.2.依赖的值对象-ExampleBean /** * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.frameworkset.mvc; /** *

ExampleBean.java

*

Description:

*

bboss workgroup

*

Copyright (c) 2009

* * @Date 2011-6-4 * @author biaoping.yin * @version 1.0 */ public class ExampleBean { private String name = null; http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 154 / 188 页 public String getName() { return name; } public void setName(String name) { this.name = name; } } 3.3.依赖的枚举类型对象-SexType /* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 155 / 188 页 * limitations under the License. */ package org.frameworkset.mvc; /** *

Title: SexType.java

*

Description:

*

bboss workgroup

*

Copyright (c) 2008

* @Date 2011-4-5 * @author biaoping.yin * @version 1.0 */ public enum SexType { F,M,UN } 4.数据绑定控制器配置文件-bboss-helloworld.xml 附带说明一下,本文是参考bbossgroups 3.2版本功能编写 http://yin-bp.iteye.com 1.25 浅谈 BbossMVC 数据绑定 第 156 / 188 页 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 发表时间: 2011-05-07 关键字: bboss, 持久层 bbossgroups 3.1 SQLExecutor组件api使用实例 /* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.frameworkset.spi.mvc; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.frameworkset.common.poolman.Record; import com.frameworkset.common.poolman.SQLExecutor; import com.frameworkset.common.poolman.handle.NullRowHandler; import com.frameworkset.common.poolman.handle.RowHandler; import com.frameworkset.util.ListInfo; public class SimpleApiTest { @Test public void insertOpera()throws SQLException http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 157 / 188 页 { ListBean lb = new ListBean(); lb.setFieldLable("tttt"); lb.setFieldName("testttt"); lb.setFieldType("int"); lb.setIsprimaryKey(false); lb.setRequired(true); lb.setSortorder("ppp"); lb.setFieldLength(20); lb.setIsvalidated(6); //用List存放Bean,在某特定的连接池中进行crud操作 List beans = new ArrayList(); beans.add(lb); String sql = "insert into LISTBEAN(ID,FIELDNAME,FIELDLABLE,FIELDTYPE,SORTORDER,ISPRIMARYKEY,REQUIRED,FIELDLENGTH,ISVALIDATED) " + "values(#[id],#[fieldName],#[fieldLable],#[fieldType],#[sortorder]," + "#[isprimaryKey],#[required],#[fieldLength],#[isvalidated])"; SQLExecutor.insertBeans("mysql",sql,beans); SQLExecutor.insertBean("mysql", sql, lb); SQLExecutor.insertBeans("mysql", sql, beans); SQLExecutor.insertBean(sql, lb); sql ="insert into LISTBEAN(ID,FIELDNAME,FIELDLABLE,FIELDTYPE) " + "values(?,?,?,?)"; // SQLExecutor.insert(sql,122,lb.getFieldName(),lb.getFieldLable(),lb.getFieldType()); http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 158 / 188 页 // SQLExecutor.insertWithDBName("mysql", sql,101,"insertOpreation","ttyee","int"); } @Test public void updateOpera() throws SQLException { //在某特定的连接池中直接crud对象 ListBean bean = new ListBean(); bean.setId(88); bean.setFieldLable("tttt"); bean.setFieldName("test"); bean.setFieldType("int"); bean.setIsprimaryKey(false); bean.setRequired(true); bean.setSortorder("ppp"); bean.setFieldLength(20); bean.setIsvalidated(6); List beans = new ArrayList(); String sql =""; beans.add(bean); sql ="update LISTBEAN set FIELDNAME='yyyy' where ID=#[id]"; SQLExecutor.updateBeans("mysql", sql, beans); sql ="update LISTBEAN set FIELDNAME=#[fieldName] where ID=#[id]"; SQLExecutor.updateBean(sql,bean); sql ="update LISTBEAN set FIELDNAME=#[fieldName] where ID=#[id]"; SQLExecutor.updateBean("mysql",sql,bean); sql ="update LISTBEAN set FIELDNAME=#[fieldName] where ID=#[id]"; SQLExecutor.updateBeans(sql,beans); http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 159 / 188 页 sql = "update LISTBEAN set FIELDNAME=? where ID=?"; SQLExecutor.update(sql, "mytest",100); sql = "update LISTBEAN set FIELDNAME=? where ID=?"; SQLExecutor.updateWithDBName("mysql", sql, "zhansans",101); } @Test public void deleteOpera() throws SQLException { //在特定的连接池中对数组对象进行crud ListBean lb = new ListBean(); lb.setId(85); lb.setFieldLable("tttt"); lb.setFieldName("testttt"); lb.setFieldType("int"); lb.setIsprimaryKey(false); lb.setRequired(true); lb.setSortorder("ppp"); lb.setFieldLength(20); lb.setIsvalidated(6); ListBean lb2 = new ListBean(); lb2.setId(15); lb2.setFieldName("this is lb2"); List beans = new ArrayList(); beans.add(lb); beans.add(lb2); String sql = ""; sql = "delete from LISTBEAN where ID=?"; SQLExecutor.delete(sql,68); sql = "delete from LISTBEAN where ID=?"; SQLExecutor.deleteByKeys(sql,67); http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 160 / 188 页 sql ="delete from LISTBEAN where ID=#[id]"; SQLExecutor.deleteBean(sql,lb); sql = "delete from LISTBEAN where ID=#[id]"; SQLExecutor.deleteBeans(sql, beans); sql ="delete from LISTBEAN where ID=#[id]"; SQLExecutor.deleteBean("mysql",sql,lb); sql ="delete from LISTBEAN where ID=#[id]"; SQLExecutor.deleteBeans("mysql",sql,beans); sql = "delete from LISTBEAN where ID=?"; SQLExecutor.deleteWithDBName("mysql", sql, 3); sql = "delete from LISTBEAN where FIELDNAME=?"; SQLExecutor.deleteByKeysWithDBName("mysql", sql,"pppp"); } @Test public void queryOprea() throws SQLException{ List beans = null; String sql ="select * from LISTBEAN where ID=?"; sql = "select * from LISTBEAN where id=?"; List lbs = (List) SQLExecutor.queryList(ListBean.class, sql,22); sql = "select * from LISTBEAN where fieldName=?"; beans = (List) SQLExecutor.queryListWithDBName(ListBean.class,"mysql",sql,"testttt"); for(int i=0;i dbBeans = (List) SQLExecutor.queryListWithDBName(ListBean.class, "mysql", sql, "testttt"); for(int i=0;i) SQLExecutor.queryList(ListBean.class, sql, "testttt",100); sql = "select FIELDNAME from LISTBEAN where ID=?"; String lbs1 = SQLExecutor.queryField(sql,2); System.out.println(lbs1); sql="select FIELDNAME from LISTBEAN where ID=?"; String result = SQLExecutor.queryFieldWithDBName("mysql", sql, 100); System.out.println(result); sql = "select * from LISTBEAN where ID=?"; ListBean lb = (ListBean)SQLExecutor.queryObjectWithDBName(ListBean.class,"mysql",sql,20); sql="select * from LISTBEAN where ID?"; ListInfo lif = SQLExecutor.queryListInfo(ListBean.class, sql, 0, 10, 20,10); beans = lif.getDatas(); for(int i=0;i) SQLExecutor.queryListBean(ListBean.class, sql, bean); for(int i=0;i) SQLExecutor.queryListBeanWithDBName(ListBean.class, "mysql", sql, bean); for(int i=0;i beans = null; ListBean bean = new ListBean(); ListInfo lif = new ListInfo(); final List lbs = new ArrayList(); bean.setFieldName("testttt"); bean.setFieldLable("lisi"); sql ="select * from LISTBEAN where ID=?"; SQLExecutor.queryByNullRowHandler(new NullRowHandler(){ @Override public void handleRow(Record record) throws Exception { ListBean lb = new ListBean(); lb.setId(record.getInt("id")); lb.setFieldName(record.getString("fieldName")); lbs.add(lb); }}, sql, 22); System.out.println(lbs.size()+"9999999"); sql = "select * from LISTBEAN where ID>?"; beans = (List) SQLExecutor.queryListByRowHandler(new RowHandler(){ http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 164 / 188 页 @Override public void handleRow(Object rowValue, Record record) throws Exception { System.out.println("queryListByRowHandler test Result**:"+record.getString("fieldName")); ListBean lb = new ListBean(); lb.setId(record.getInt("id")); lb.setFieldName(record.getString("fieldName")); lbs.add(lb); }}, ListBean.class, sql, 80); for(int i=0;i(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class, sql, 0, 10, 20); System.out.println(lif.getTotalSize()+"----"); sql = "select * from LISTBEAN where FIELDNAME=#[fieldName]"; lbs.clear(); beans = (List) SQLExecutor.queryListBeanByRowHandler(new RowHandler(){ @Override public void handleRow(ListBean rowValue, Record record) http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 165 / 188 页 throws Exception { rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class, sql, bean); for(int i=0;i) SQLExecutor.queryListBeanWithDBNameByRowHandler(new RowHandler(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { // TODO Auto-generated method stub rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class, "mysql", sql, bean); for(int i=0;i(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { // TODO Auto-generated method stub rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }},ListBean.class, sql, 5, 5, bean); beans = lif.getDatas(); for(int i=0;i(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { // TODO Auto-generated method stub rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }},ListBean.class, "mysql",sql, 0, 5, bean); for(int i=0;i(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { // TODO Auto-generated method stub rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class, sql, bean); System.out.println(lb1.getFieldName()); sql = "select * from LISTBEAN where ID) SQLExecutor.queryListWithDBNameByRowHandler(new RowHandler(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class, "mysql", sql, 20); for(int i=0;i(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class, sql, 20); System.out.println(lb3.getFieldName()+"lbbbbb"); ListBean lb4 = SQLExecutor.queryObjectWithDBNameByRowHandler(new RowHandler(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class,"mysql", sql, 20); System.out.println(lb4.getFieldName()+"lb4444"); http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 168 / 188 页 sql = "select * from LISTBEAN where ID=#[id]"; ListBean lb2 = SQLExecutor.queryObjectBeanWithDBNameByRowHandler(new RowHandler(){ @Override public void handleRow(ListBean rowValue, Record record) throws Exception { // TODO Auto-generated method stub rowValue.setId(record.getInt("id")); rowValue.setFieldName(record.getString("fieldName")); }}, ListBean.class, "mysql", sql, bean); System.out.println(lb2.getId()+"++++"); } @Test public void nullRowHandlerQuery() throws SQLException{ String sql = ""; List beans = null; ListBean b = new ListBean(); b.setFieldName("testttt"); b.setFieldLable("lisi"); sql = "select * from LISTBEAN where id>?"; beans = null; final List lbs = new ArrayList(); ListInfo lif = SQLExecutor.queryListInfoByNullRowHandler(new NullRowHandler(){ @Override public void handleRow(Record record) throws Exception { // TODO Auto-generated method stub ListBean lb = new ListBean(); lb.setId(record.getInt("id")); lb.setFieldName(record.getString("fieldName")); lbs.add(lb); System.out.println("queryListInfoByNullRowHandler test result:"+record.getInt("id")); http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 169 / 188 页 }}, sql, 0, 5, 10); beans = (List)lif.getDatas(); // for(int i=0;i、SQLParams/List 和Map/List对象中的这种情况,并且sql语句是模板sql 不带Bean的就是预编译sql语句,变量以?号代替,参数就可以在后面追加 如果要指定dbname的话就在相应的方法后面添加WithDBName http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 172 / 188 页 分页方法时需要指定起始地址和每页记录数 还有指定行处理器和空行处理器、Field行处理器的一组接口,呵呵 没办法为了满足各种要求必须提供这么多接口,我估计bboss的persistent应该是业界接口最全的一套 persistent framework了,呵呵 http://yin-bp.iteye.com 1.26 bbossgroups 3.1SQLExecutor组件api使用实例 第 173 / 188 页 1.27 bbossgroups 3.1中webservice引擎使用方法 发表时间: 2011-05-07 关键字: WebService, MVC, ITeye, Eclipse, Spring bbossgroups 3.1中webservice引擎使用方法可以参考bbossgroups培训教程的25-28页,下载地址: http://dl.iteye.com/topics/download/5e8d0f07-53c2-34f1-a0d8-ee43369774ea 也可以参考CXF WEBSERVICE测试用例: http://dl.iteye.com/topics/download/910322f9-0cb7-312b-935a-732504c43f63 框架包请及时更新最新版本 bbossgroups项目资源下载: bbossgroups源码工程(http://sourceforge.net/projects/bboss/files/bbossgroups-3.1/ bbossgroups-3.1-src.zip/download) mvc框架的demo war包(http://sourceforge.net/projects/bboss/files/bbossgroups-3.1/mvcdemo- war.zip/download) 简单mvc eclipse开发工程,开箱即用(http://sourceforge.net/projects/bboss/files/bbossgroups-3.1/ mvcdemo-eclipse.zip/download) 14.9.2 通过aop组件配置cxf组件工厂调用方式 利用aop框架中的工厂组件管理模式,可以非常方便的获取cxf webservice服务的客服端调用接口,从而方便地 实现webservice服务调用。 14.9.2.1 客服端配置文件 说明: WSServiceClient-代表webservice服务客服端接口组件名称,客服端调用程序通过该名称获取服务调用接口实 例,该实例通过工厂模式(组件创建工厂 WSServiceClientFactory的create方法创建)获取。 http://yin-bp.iteye.com 1.27 bbossgroups 3.1中webservice引擎使用方法 第 174 / 188 页 WSServiceClientFactory-组件创建工厂(非静态),webservice客服端通过该工厂的create实例方法来创建服 务调用接口实例。在该工厂的定义中可以看出,为了创建webservice服务调用接口,需要指定两个属性 serviceClass和address,通过serviceClass属性指定了webservice服务对应的接口,address指定了 webservice服务地址。 14.9.2.2 调用方法 public class WSClient { ApplicationContext context ; @Before public void init() { context = ApplicationContext.getApplicationContext("org/frameworkset/web/ws/wsclient.xml"); } @Test public void test() { org.frameworkset.web.ws.WSService wsservice = (WSService)context.getBeanObject("WSServiceClient"); System.out.println(wsservice.sayHello("多多")); } } 14.10 3.1版本对webservice服务发布管理做了部分调整 3.1版本对webservice服务发布管理做了部分调整,使得开发人员可以非常方便地发布自己的webservice服 务,这里只做调整部分的说明,至于服务的定义、部署、调用可以参考《bbossgroups培训ppt》中25页-28 页,这里就不做过多的说明。 14.10.1 服务发布调整 改进webservice服务装载功能,可以从mvc控制器配置文件和所有的applicationcontext对应的配置文件中配 置和装载webservice服务: 在Mvc框架控制器文件中配置的ws服务会在webservice引擎启动时自动装载。 普通的applicationcontext容器对应的配置文件中配置的ws服务不能自动加载,我们需要将这些配置文件单独 装配到 org/frameworkset/spi/ws/webserivce-modules.xml文件中,以便webservice引擎启动时通过扫描org/ frameworkset/spi/ws/webserivce-modules.xml中装配的组件配置文件来装载其中配置的webservice服务。 http://yin-bp.iteye.com 1.27 bbossgroups 3.1中webservice引擎使用方法 第 175 / 188 页 org/frameworkset/spi/ws/webserivce-modules.xml文件时3.1版本中新加的用来装配独立 applicationcontext中配置的ws服务的部署描述文件。 3.1版本任然兼容旧版的webservice服务发布方法,即配置在 /bbossaop/resources/org/frameworkset/spi/manager-rpc-webservices.xml中的 cxf.webservices.config属性中配置的服务任然会被加载和发布。 14.10.2 org/frameworkset/spi/ws/webserivce-modules.xml装载服务实例 14.10.3 服务定义调整 Bbossgroups中通过在property元素上指定ws:servicePort 属性来标识webservice服务。3.1之前的服务定义 是通过在property元素上设置servicePort属性来标识一个webservice服务的,例如: http://yin-bp.iteye.com 1.27 bbossgroups 3.1中webservice引擎使用方法 第 176 / 188 页 3.1版本中标识webservice服务的属性变更为ws: servicePort,服务发布引擎通过识别带ws:前缀的属性来识别 webservice服务,并发布该服务,例如: 附件下载: • ws.zip (5 KB) • dl.iteye.com/topics/download/910322f9-0cb7-312b-935a-732504c43f63 http://yin-bp.iteye.com 1.27 bbossgroups 3.1中webservice引擎使用方法 第 177 / 188 页 1.28 bboss taglib 列表/分页的排序功能介绍 发表时间: 2009-06-21 关键字: SQL, CMS, PHP, .net bboss taglib 列表/分页的排序功能介绍 bboss taglib下载地址: https://sourceforge.net/project/showfiles.php?group_id=238653&package_id=290092 列表分页标签中可以针对特定的列进行升序和降序排序,排序的数据集可以是当前页面的记录,也可以是所有的记录集,二者不能同时使 用。 排序功能与list标签、标签head、标签title相关,具体描述如下: List标签的autosort属性: 如果通过title标签设置排序字段,通过该autosort属性来控制是否自动对当前页数据排序,还是在数据加载器中手工 构造sql语句对全部数据排序: true-自动对当前页面数据排序,缺省值,这时用户不应该再根据title字段去构造 sql的排序条件,否则排序功能将会不正常。 false-屏蔽对当前页面数排序功能,在数据加载器中手工构造sql语句对全部数据排序,如果数据加载器中 没有将title指定的排序字段作为sql的排序字段,那么title对应的排序字段将不起作用。 Head标签其功能是用来输出表头行,标签体中可以包含title标签,head标签类似htmlt的tr标签,具有tr的一系列的属性。 Title标签可以用来指定排序的字段及标题信息。 下面是两个简单的实例: 实例1 直接使用list标签直接进行分页,指定了sql语句并且对当前页面数据进行排序 通过设置autosort属性为true,使标签自动对当页数据排序 按照表名排序 http://yin-bp.iteye.com 1.28 bboss taglib 列表/分页的排序功能介绍 第 178 / 188 页 按照表id名排序 不按照表id值排序 ">
实例2 在数据加载器中根据排序字段构造排序sql语句 test.TestDataInfo对应数据加载器的实现类,更据方法传递的sortkey和desc两个参数构建排序sql,就会实现 全部数据集的排序功能 autosort="false"用来屏蔽自动对当前页面的排序功能 "> test.TestDataInfo的实现代码如下: package test; import java.sql.SQLException; import com.frameworkset.common.poolman.DBUtil; import com.frameworkset.common.tag.pager.DataInfoImpl; import com.frameworkset.util.ListInfo; public class TestDataInfo extends DataInfoImpl { protected ListInfo getDataList(String sortKey, boolean desc) { ListInfo info = new ListInfo(); DBUtil dbUtil = new DBUtil(); try { if(sortKey != null && !sortKey.equals("")) { dbUtil.executeSelect("select * from " + "tableinfo order by " + sortKey + (desc?" desc" : " asc")); } else { dbUtil.executeSelect("select * from " + "tableinfo "); } http://yin-bp.iteye.com 1.28 bboss taglib 列表/分页的排序功能介绍 第 180 / 188 页 info.setArrayDatas(dbUtil.getAllResults()); } catch (SQLException e) { e.printStackTrace(); } return info; } protected ListInfo getDataList(String sortKey, boolean desc, long offSet, int pageItemsize) { ListInfo info = new ListInfo(); DBUtil dbUtil = new DBUtil(); try { if(sortKey != null && !sortKey.equals("")) { dbUtil.executeSelect("select * from tableinfo " + "order by " + sortKey + (desc?" desc" : " asc"), offSet,pageItemsize); } else { dbUtil.executeSelect("select * from tableinfo", offSet,pageItemsize); } info.setArrayDatas(dbUtil.getAllResults()); info.setTotalSize(dbUtil.getTotalSize()); } catch (SQLException e) { e.printStackTrace(); } return info; } http://yin-bp.iteye.com 1.28 bboss taglib 列表/分页的排序功能介绍 第 181 / 188 页 } http://yin-bp.iteye.com 1.28 bboss taglib 列表/分页的排序功能介绍 第 182 / 188 页 1.29 获取数据库连接-bboss persistent 发表时间: 2009-03-21 关键字: SQL, 配置管理, PHP, JDBC, XML bboss persistent下载地址 https://sourceforge.net/project/ showfiles.php?group_id=238653&package_id=302766&release_id=647144 获取数据库连接-bboss persistent bboss persistent获取数据链接的两种方式 1.从缺省数据库连接池中获取数据库连接: java.sql.Connection connection = DBUtil.getConection(); poolman中缺省的数据库连接池就是在poolman.xml文件中配置的第一个连接池 2.从指定的数据库连接池中获取数据库连接 java.sql.Connection connection = DBUtil.getConection(dbname); dbname为poolman.xml中节点中间指定的数据库连接池的名称,例如: bspf 3.获取数据库连接的事务性 通过上述两种方式获取到的connection根据不同的环境具有不同特点,主要有两种环境,一种是事务环境,另 一种是无事务环境,分别描述如下: 事务环境是指在数据库操作执行的上下文中使用TransactionManager组件开启了一个事务的环境。 如果在事务环境下获取connection,那么connection的事务将与上下文中的事务结合在一起,也就是说 connection的事务随着上下文环境事务的提交而提交,也随着上下文事务的回滚而回滚,而且connection的回 滚也会导致整个上下文事务的回滚。同时connection的setAutocommit方法和close方法将不会影响上下文事 务,就是说不会起作用。 在事务环境下获取数据库链接后,不需显示关闭connection,也不需要显示commit,但是需要显示rollback, 事务的提交和链接的关闭由外部事务自动关闭和提交。 http://yin-bp.iteye.com 1.29 获取数据库连接-bboss persistent 第 183 / 188 页 在没有事务的环境下获取connection时,connection具有原始的jdbc connection的所有特性和方法,这里就 不多说了。 4 .直接使用数据库连接需要注意的地方 数据库连接池有效地管理着一组高度重用的数据库连接,如果通过持久层框架提供的组件 (DBUtil,PreparedDBUtil,CallableDBUtil)操作数据库时,数据库连接的使用和管理由这些组件自动管理,无 需应用程序去处理;但是如果程序员如果直接从数据库连接池中获取连接使用的话,那就一定要确保连接使用 完毕后关闭该链接,释放操作过程中使用的所有资源,操作的一般标准模式为: Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = DBUtil.getConection(); //use the con varable。 stmt = con.create Statement; rs = stmt.execute some sql ; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(rs != null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } http://yin-bp.iteye.com 1.29 获取数据库连接-bboss persistent 第 184 / 188 页 } if(stmt != null) { try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con != null) { try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } http://yin-bp.iteye.com 1.29 获取数据库连接-bboss persistent 第 185 / 188 页 1.30 bbossgroups 项目sourceforge下载地址 发表时间: 2011-06-12 关键字: bbossgroups, mvc, dao, aop, ioc bbossgroups特色: 1.aop/ioc 2.rpc(http/netty/mina/jms/webservice/rmi/jgroups/restful) 安全高效 3.multi db transaction 4.distribute event framework 5.jsp taglib 分页、树、列表、抽屉式、逻辑标签 6.mvc/restful 7.persistent framework 8.xml-bean serializable 9.jms 开发套件 10.cxf webservice 服务发布和客户端代理 11.cluster with jgroups 12.quartz任务引擎管理 13.完备的框架监控机制 bbossgroups 项目sourceforge下载地址 https://sourceforge.net/projects/bboss/files/ bbossgroups 源码github托管地址: https://github.com/bbossgroups/bbossgroups-3.5 发布的最新版本:bbossgroups 3.5 全面介绍bbossgroups的文档: bbossgroups介绍.ppt bbossgroups培训.ppt 官方网站: http://www.bbossgroups.com bbossgroups交流群: 21220580 166471282 166471103 http://yin-bp.iteye.com 1.30 bbossgroups 项目sourceforge下载地址 第 186 / 188 页 154752521 3625720 http://yin-bp.iteye.com 1.30 bbossgroups 项目sourceforge下载地址 第 187 / 188 页 bboss 快速入门-http://www.bbossgroups.com bboss 快速入门 作者: yin_bp http://yin-bp.iteye.com 本书由ITeye提供电子书DIY功能制作并发行。 更多精彩博客电子书,请访问:http://www.iteye.com/blogs/pdf http://www.iteye.com - 做最棒的软件开发交流社区 第 188 / 188 页
还剩187页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

yin_bp

贡献于2012-05-14

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
http://yin-bp.iteye.com 1.28 bboss taglib 列表/分页的排序功能介绍 第 179 / 188 页
rowcount: