newxy(新坐标)技术文档 java web快速开发工具 作者:胡立新

来源:百度文库 编辑:神马文学网 时间:2024/04/27 14:40:21
newxy(新坐标)技术文档(由newxy工具类创建)下载:http://www.newxy.net/zh_cn/download/index.jsp
java web快速开发工具
struts+newxy,struts+hibernate的替代方案
作者:胡立新 2006年7月29日. docs1. 前言2. 版本2.1. newxy1.02.1.1. newxy1.0技术文档_060606 版2.1.2. newxy1.0技术文档_060618 版
2.2. newxy1.012.2.1. newxy1.01技术文档_060622 版
2.3. newxy1.022.3.1. newxy1.02技术文档_060702 版
2.4. newxy1.032.4.1. newxy1.03技术文档_060715 版
2.5. newxy1.042.5.1. newxy1.04技术文档_060729 版
3. 快速上手3.1. 环境设置,newxy.properties文件3.2. 数据库准备3.3. 初识 newxy(新坐标) 在main(){......}中访问数据库3.4. 再识 newxy(新坐标) 配置struts实现对表的插入、更新、删除3.5. 免struts配置、“零”代码,实现分类查询、导航、插入、更新、删除、客户端保留状态
4. 体系统结构5. newxy.properites, 数据库连接、字符编码、DAO类的配置文件5.1. 简介5.2. 默认数据源或数据库连接5.3. 通过编程方式获取数据库连接5.4. 数据库字符编码5.5. 本地字符编码5.6. 默认DAO类
6. 持久化类6.1. DynaDto 通用持久化类6.1.1. 保留属性名6.1.2. set、setValue方法
7. IFacade接口、DBM抽象类、BaseDAO类、IFacadeFactory工厂7.1. IFacade接口简介7.2. DBM抽象类简介
8. 主关键值生成器8.1. 接口IAuto8.2. 类Auto8.3. 主关键字值生成器的运用
9. FormBean类、DynaFormBean类与Struts的ActionForm类9.1. 继承关系9.2. FormBean类及DynaFormBean类重要方法9.3. DynaFormBean类的特点
10. DispatchAction类,对Struts DispatchAction类的继承10.1. 默认方法10.2. ActionForword
11. newxy查询语言(Query Language), NQL11.1. 简介11.2. 应用举例
12. 数据缓存(Cache)12.1. 简介12.2. 类net.newxy.dbm.DBM几个能实现查询缓存的方法12.3. newxy(新坐标)查询语言(NQL)对缓存的实现12.4. 通过网页或jsp页面实现缓存查询
13. newxy(新坐标)标签13.1. 简介13.2. nbean标签13.2.1. 标签13.2.2. 标签13.2.3. 标签13.2.4. 标签13.2.5. 标签13.2.6. 标签
13.3. nhtml标签13.3.1. 标签13.3.2. 标签13.3.3. 标签13.3.4. 标签13.3.5. 标签13.3.6. 标签13.3.7. 标签13.3.8. 标签13.3.9. 标签13.3.10. 标签13.3.11. 标签
13.4. nlogic标签13.4.1. 标签13.4.2. 标签13.4.3. 标签13.4.4. 标签13.4.5. 标签13.4.6. 标签13.4.7. 标签
14. 事务和并行(Transactions And Concurrency)15. 重要实践15.1. 文件上传至文件夹15.2. 文件上传至数据库15.3. 文件上传至文件夹与上传至数据库的比较
. docs
1. 前言
前 言
经过五个方面的比较,newxy+struts WEB开发与deiphi桌面开发相比,速度更快,能力更强。
newxy(新坐标)是hibernate的替代者,struts+newxy是struts+hibernate的替代方案,是web快速开发工具。
struts的不足:
一、转到展示层时,需要配置forward,目录、文件变更,需要重新修改forward,要求重新部署整个项目,而服务器往往要重新启动。
二、如果页面表单变化了,就需要修改formbean对应的方法和属性,而每次修改之后,还需重新编译重新部署,或者重新启动服务器。
hibernate的不足,下面是一位网友的看法,具有代表性:
一、对象与数据库的映射,关键在于对象关系的映射,但是没做到很理想,配置过多,控制复杂, 另外还会出错。其实本质在于对象不够自由。
二、事务处理。这点上更容易出问题,相对于各种各样的事务管理器,要兼容是一个大问题, 总归在各种应用服务器上有很多问题。其本质在于创建了一个自我数据存取小环境,必然面临各种兼容问题。
三、HQL语言。建立对象查询语言,类SQL,但是不同于任何一种SQL,调试环境复杂。本质在于创建了一种语言,增加学习成本。
这位网友还提出了减化和退化方案。
struts+newxy之所以在开发效率上比struts+hibernate能提高十倍、甚至几十倍,是因为克服了struts与hiberate的不足。
利用newxy DAO类,标签, struts+newxy可以在以下几个方面不用写java代码,不用配置struts。
1,数据库的增、删、改;2,对查询所得数据缓存,指定缓存时长;3,数据库字符编码与本地字符编码转换;4,文件上传,上传大小控制;5,文件下载,下载记数;6,图片显示;7,数据分页显示;8,客户端标记记录集哪条记录被选择;因为可以不写java代码,不用建立ActionForm类、Action类,因而不用配置struts,不用重新编译类文件、不用重新打包、不用重启服务器。 可以克服struts的不足。
在克服hibernate的不足方面,newxy采用“退化”和“进化”并用的方案。
newxy在进行数据的查询、增、删、改时都会调用一注册方法,根据业务涉及到的数据库相关数据源名和表名进行注册,注册的目的是要获得表字段对应的java类名,主关键字段名,主关键字段长度等数据,保存在一个单子实例中,以供DAO类调用。 如果已注册不再注册。
可以对多表查询语句注册,如:“select a.field1,b.field2 from table1 as a,table2 as b where ...";
可以对跨数据源的查询注册。如:"select a.field1,b.field2 from table1 as a,DB3.dbo.table2 as b where ...";
如果是数据增、删、改,则是对单一表注册;
由于struts+newxy用即时注册的方法,可以不象hibernate那样用静态文件影射数据库到值对象类。开发者不用配置任何文件。可以使用任意查询语句,克服“对象不够自由”问题。
hibernate通过配置文件设置表之间的关系,有一定意义,newxy在这方面算是“退化”的,但struts+newxy在处理数据库表之间关系方面是很容易的。
在事务处理方面,newxy提供了一事务类net.newxy.dbm.Transaction。它可以将多个数据库的操作放在一个事务中。由于DAO类对数据操作前的注册方法得到的表及其字段各种特性都是与数据库直接相关的,而不是事先用静态文件影射,因而极少发生错误;开发者可以通过Transaction的方法为不同的数据库设置不同的隔离等级;可以设置操时回滚时间,在设置的时间内事务没有完成,会有一线程进行干预,将事务回滚。
hibernate的HQL语言是和数据库与对象影射规则相适应的,它没有特别功能,主要是利用值对象类来查询数据。 newxy也提供了一种查询语言NQL。开发者不需用特殊的语法来构建查询语句。非常容易理解,不会增加学习成本。
struts一旦与newxy结合到一起运用是如此简单,下列是struts+newxy代替struts+hibernate的例子。
struts配置中,formBean的type是“net.newxy.struts_faces.DynaFormBean”,开发者不需另外设计ActionForm类。利用通用持久类net.newxy.dbm.DynaDto,开发者也不用象hibernate那样为每个表建一个持久类。
如果struts的配置是: ,用户从页面表单submit数据后,在Action类的方法中,开发者可以用net.newxy.struts_faces.DynaFormBean代替struts ActionForm,用net.newxy.dbm.DynaDto代替hibernate 持久类。
public ActionForward myMethod(ActionMapping actionMapping, ActionForm actionForm,                              HttpServletRequest httpServletRequest,            HttpServletResponse httpServletResponse) throws Exception{            ......            DynaFormBean form=(DynaFormBean)actionForm;            DynaDto dto=(DynaDto)form.getDto();            dto.set_table("table1");//如果用户页面没有传来数据库表名。            try{                IFacade ifacade=IFacadeFactory.getFacade();                 //更新或插入,如果result==null,为update,否则为insert。                result = ifacade.update(dto);//或:FormBeanUtils.update(ifacade, form);                 //删除记录                ifacade.remove(dto);//或:FormBeanUtils.remove(ifacade, form);                 //数据查询,如果上传了符合newxy多项查询规则的数据将进行数据查询。                //查询记录集放在newForm 的_coll属性中。                DynaFormBean newForm=new DynaFormBean();                FormBeanUtils.createForm(newForm, httpServletRequest);                ......                //开发者如果想知道生成的sql语句,可以这样:                //string sql=form.get_sql();                //由于开发者在对数据进行操作时完全不需知道sql语句,所以                //没有提供方法让开发者直接得到sql语句来控制数据操作。                //未来版本可能提供这样的方法。            }catch(Exception e){                ......            }            ......        }如果使用newxy的标签可以不建立Action类,不设置struts的formBean及action,可以不写代码。
newxy也提供了一些实用类。本文档就是用newxy自身工具类轻松建立的。
newxy的范例会不断增加。
2. 版本
2.1. newxy1.0
2.1.1. newxy1.0技术文档_060606 版
此文档是newxy1.0技术文档最初版,尚未完全阐明newxy(新坐标)的功能;此文档还会不断补充。
2.1.2. newxy1.0技术文档_060618 版
此版技术文档改写了上一版技术文档的前言。
2.2. newxy1.01
2.2.1. newxy1.01技术文档_060622 版
newxy1.01版与newxy1.0版相比变化如下:
新增部分
newxy1.01版增加了 标签,此标签用于访问计数. 修改部分
newxy1.0版在实现数据缓存时,标签的 cacheTime单位是毫秒,而通过表单递交参数查询数据实现数据缓存时 _cacheTime单位是秒.
newxy1.01版使二者一致,单位都是秒.
本次技术文档也作相应变动
新增部分
newxy1.01版标签讲解. 修改部分
以前技术文档有笔误的地方作了纠正,前言部分略作修改.
2.3. newxy1.02
2.3.1. newxy1.02技术文档_060702 版
newxy1.02版与newxy1.01相比,有新增部分,保持向下兼容。
新增部分一
newxy1.02版增加了标签 和标签,这两个标签共同使用,用于转发。 新增部分二
标签增加了将上传文件保存到指定路径的功能。 新增部分三
标签为配合标签实现上传文件保存到指定路径,标签的method值可以是"upload",点击后将上传文件保存到指定路径上。 新增部分四
标签增加了几个属性,指定保存文件名、文件类型等的字段名。 新增部分五
标签定义文件newxy-logic.tld中增加了标签标签 和标签的定义,newxy-html.tld中为标签增加了几个属性。
本次技术文档作相应增加
新增部分一
newxy1.02版标签 和标签讲解.
新增部分二
标签新增几个属性的讲解。 新增部分三
15. 重要实践
15.1. 文件上传至文件夹15.2. 文件上传至数据库15.3. 文件上传至文件夹与上传至数据库的比较
2.4. newxy1.03
2.4.1. newxy1.03技术文档_060715 版
newxy1.03版与newxy1.02相比,增加了标签,保持向下兼容。
struts的标签不能正确表现普通文本原来面貌.
增加了标签类net.newxy.tags.bean.WriteTag 标签定义文件 newxy-bean.tld 新增了标签的定义 技术文档增加了对标签的讲解
2.5. newxy1.04
2.5.1. newxy1.04技术文档_060729 版
newxy1.04版与newxy1.03相比,有新增部分,也有修改部分,保持向下兼容。
新增部分一
newxy1.04版为标签增加了几个属性,功能也更多。 新增部分二
增加了一个类net.newxy.bean.BasicDynaBean。这个类继承自org.apache.commons.beanutils.BasicDynaBean,过载了方法public void set(String name, Object value), 并在查询数据时用这个类的实例作为查询结果集中的元素。这是因为在mysql数据库中发现,在处理"select count(*) as visitCount ..."查询结果时, org.apache.commons.beanutils.BasicDynaBean的set(String name, Object value)不能将数据保存的bean中。这类问题得到彻底解决。 新增部分三
类net.newxy.util.Auto增加了一个方法,
public Object increase(Object value,int increment,int len)
参数increment为增量,可以是负值。
本次技术文档作相应增加
新增部分一
标签新属性讲解。 新增部分二
在标签定义文件newxy-bean.tld中增加了标签几个属性。 新增部分三
FormBean类及DynaFormBean类重要方法
3. 快速上手
3.1. 环境设置,newxy.properties文件
对持续化数据的操作由net.newxy.dbm.DBM类的子类执行,每一数据库至少有一个DBM子类(DAO), DAO所需数据库连接来源于newxy.properties文件配置的数据源名,或由DAO实现的函数获取。
将数据源名设为jdbc/default,如果已有的数据源名不是jdbc/default,在newxy.properties文件中加入一行 ds.default=xxx,其中xxx是已设的数据源名。如果没有数据源,在newxy.properties文件中加入四行 driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/line_order?user=root&password=mysql&characterEncoding=gbkuser=rootpass=mysql将newxy.properties文件copy到类文件的根部,即src/下,编译打包后,此文件应在WEB-INF/classes下。更多信息参看"数据库连接、字符编码"。
 
3.2. 数据库准备
范例用到的表:/*客户表*/create table customers (id int primary key,name VARCHAR(255))/*订单表*/create table orders (id int primary key,customer_id int,date smalldatetime)/*订单--物品关系表*/create table line_items (line_number int primary key,order_id int not null,product_id int,quantity int)/*物品表*/create table products (id int primary key,serialNumber VARCHAR(255),product varchar(255))/*工商企业行业代码表*/create table industry(id int primary key,code char(2) not null, /*代码*/industry varchar(255) not null /*行业名称*/)/*工商企业表*/create table enterprise(id int primary key,industry_code char(1) not null,/*行业类别代码*/register_id varchar(13) not null,/*注册号*/name varchar(255) not null,/*企业名称*/address varchar(255) not null,/*经营场所*/principal varchar(50) not null,/*负责人*/dealIn varchar(255) null /*经营范围*/)/*资源表*/create table resources(resource_id int primary key,resName varchar(50) not null,/*资源名*/content image not null,/*文件内容*/ext varchar(10) null,/*资源的扩展名,也可是文件扩展名*/remark text null,/*备注*/ver varchar(50) null,/*版本*/type1 int null,/*0:新坐标库及文档,1:新坐标范例,2:其它java资源,3:其它 */type2 int null,uploadDate smalldatetime null/*上传日期*/)3.3. 初识 newxy(新坐标) 在main(){......}中访问数据库
建立JAVA类
1. 类TestDao 负责数据的基本操作package common;import net.newxy.dbm.DBM;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class TestDao extends DBM{public TestDao(){super();}public Connection getConnection(String dsJndi) throws Exception {Connection cn=null;try {Class.forName("com.mysql.jdbc.Driver").newInstance();cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/line_order?user=root&password=mysql");} catch (ClassNotFoundException ex) {} catch (IllegalAccessException ex) {} catch (InstantiationException ex) {} catch (SQLException ex1) {throw new Exception(ex1.getMessage());}return cn;}}2.建立测试类 Testpackage common;import java.util.List;import net.newxy.dbm.DynaDto;import net.newxy.struts_faces.DynaFormBean;import net.newxy.util.BeanArrayList;public class Test2 {public static void main(String[] args) {TestDao dao=new TestDao();List dtos=null;DynaDto dto=null;try {//插入数据到物品表//第一条dto=new DynaDto();dto.set_table("products");dto.set("serialNumber","6927693100029");dto.set("product","罗汉果止咳片");dao.update(dto);//第二条dto=new DynaDto();dto.set_table("products");dto.set("serialNumber","6931893700484");dto.set("product","克拉霉素 胶囊");dao.update(dto);//查询数据dtos =dao.list("select * from products");for(int i=0;i0){dto = new DynaDto(dtos.get(0));dto.set("product","克拉霉素胶囊");dao.update(dto);}//数据删除(方法一) 删除 "罗汉果止咳片"dao.prepareStatement("delete from products where serialNumber=‘6927693100029‘");//数据删除(方法二) 删除 "克拉霉素胶囊"dtos=dao.list("select * from products where serialNumber=‘6931893700484‘");if(dtos.size()>0){dto = new DynaDto(dtos.get(0));dao.remove(dto);}} catch (Exception ex) {System.out.println(ex.getMessage());}}}3.4. 再识 newxy(新坐标) 配置struts实现对表的插入、更新、删除
在struts 配置文件中设置formBean 及 action
newxy(新坐标)中net.newxy.struts_faces.DynaFormBean在绝大多数据情况下可直接作为struts的formBean 实现类。
同样 newxy(新坐标)中net.newxy.struts_faces.DispatchAction在绝大多数据情况下可直接作为struts的action 实现类。net.newxy.struts_faces.DispatchAction是org.apache.struts.actions.DispatchAction的子类,所以在struts配置文件中要为action设置parameter,通常将parameter设为method。
本例中,为对在线购物的物品进行操作,在struts中设置formBean及action如下(注意实现类):
数据库连接
假设系统中未设数据源。在类文件根部,即 res/下建立newxy.properties文件,在文件中加入
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/line_order?user=root&password=mysqluser=rootpass=mysql打包或build后,在WEB工程中newxy.properties文件应在/WEB-INF/classes/下1.数据简单查询
将newxy(新坐标)包中的newxy-html.tld、newxy-logic.tld、newxy-bean.tld拷到/WEB-INF下。
建立/samples/products.jsp文件<%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%><%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%><%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>
find

newxy(新坐标) 数据简单查询

${index+1}:
输出结果如下(因用户输入的不同结果有所不同):newxy(新坐标) 数据简单查询
1: 罗汉果止咳片
2: 克拉霉素胶囊
2.数据更新
在/samples/products.jsp中加入如下几行

newxy(新坐标) 数据更新

条码
物品名称
完整的/samples/products.jsp如下:<%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%><%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%><%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>find

newxy(新坐标) 数据简单查询

${index+1}:

newxy(新坐标) 数据更新

条码
物品名称
输出结果如下:
newxy(新坐标) 数据简单查询
1: 罗汉果止咳片
2: 克拉霉素胶囊
newxy(新坐标) 数据更新
条码
物品名称

将"罗汉果止咳片"改为"罗汉果止咳片(止咳类药)",点击"更新"后结果如下(注意:列表中的数据也发生了改变):
newxy(新坐标) 数据简单查询
1: 罗汉果止咳片(止咳类药)
2: 克拉霉素胶囊
newxy(新坐标) 数据更新
条码
物品名称

3.数据删除
在/samples/products.jsp中加入如下代码:

newxy(新坐标) 数据删除

条码
物品名称

完整的/samples/products.jsp如下:
<%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%><%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%><%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>find

newxy(新坐标) 数据简单查询

${index+1}:

newxy(新坐标) 数据更新

条码
物品名称

newxy(新坐标) 数据删除

条码
物品名称

输出结果如下:
newxy(新坐标) 数据简单查询
1: 罗汉果止咳片(止咳类药)
2: 克拉霉素胶囊
newxy(新坐标) 数据更新
条码
物品名称
newxy(新坐标) 数据删除
条码
物品名称

点击"删除"后,当前记录自动移到下一条
newxy(新坐标) 数据简单查询
1: 克拉霉素胶囊
newxy(新坐标) 数据更新
条码
物品名称
newxy(新坐标) 数据删除
条码
物品名称

3.5. 免struts配置、“零”代码,实现分类查询、导航、插入、更新、删除、客户端保留状态
这个例子对工商企业按行业分类显示,并可新建、更新、删除、分页导航、在客户端保留状态(选择的行业、企业名称), 例子自动在数据库与本地之间进行字符编码转换,几个铵钮的文字是国际化的,行业名称从数据库获取后放到缓存中,缓存时长为一小时。 当删除一条记录时,企业列表中不再显示,记录数自动减一,所选企业自动移到下一条,编辑框中数据重填入下一条内容...... 例子不用配置struts,只用几个newxy(新坐标)的标签和struts标签,不需在后台写java代码,也不需在jsp页面上镶入java脚本, jsp页面极其简洁,可称为“零”代码。
实例 效果图
三个jsp页面
/zh_cn/samples/sample1/index.jsp
<%@ page contentType="text/html; charset=GBK" %> <%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %> 企业行业分类
/zh_cn/samples/sample1/_industry.jsp
<%@ page contentType="text/html; charset=GBK" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%> <%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%> <%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>
== 行 业 ==
/zh_cn/samples/sample1/_enterprise.jsp
<%@ page contentType="text/html; charset=GBK" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%> <%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%> <%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>
== 企 业 列 表 ==
 
== 企 业 信 息 编 辑 ==
注册号:
负责人:
企业名称:

企业地址:

经营范围:
两个表:行业表、企业表
行业表
create table industry( id int primary key, code char(2) not null, /*代码*/ industry varchar(255) not null /*行业名称*/ ) 企业表
create table enterprise( id int primary key, industry_code char(1) not null,/*行业类别代码*/ register_id varchar(13) not null,/*注册号*/ name varchar(255) not null,/*企业名称*/ address varchar(255) not null,/*经营场所*/ principal varchar(50) not null,/*负责人*/ dealIn varchar(255) null /*经营范围*/ )
4. 体系统结构
5. newxy.properites, 数据库连接、字符编码、DAO类的配置文件
5.1. 简介
newxy(新坐标)可以同时对多个数据库操作,net.newxy.dbm.DBM的一个子类对应一个数据源。newxy(新坐标)中有个默认的DAO类net.newxy.dbm.BaseDAO,它将"jdbc/default"作为数据源的jndi名。5.2. 默认数据源或数据库连接
1.运用系统中的数据源jndi名设为 jdbc/default; 2.如果系统中已有数据源的jndi名不是 jdbc/default,假设为 jdbc/xxx,则在 src/下的newxy.properties文件中加上一条: ds.default=jdbc/xxx 3.如果系统中没有数据源,则在src/下的newxy.properties文件中加入如下几行: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/line_order?user=root&password=mysql user=root pass=mysql
5.3. 通过编程方式获取数据库连接
用户可以在自定义默认DAO类中通过java代码获取数据库连接,只需覆盖超类net.newxy.dbm.BaseDAO中public Connection getConnection(String dsJndi) throws Exception 方法,或实现抽象超类net.newxy.dbm.DBM中public Connection getConnection(String dsJndi) throws Exception 方法,例如:
package common;import net.newxy.dbm.DBM;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DefaultDao extends DBM{public Connection getConnection(String dsJndi) throws Exception {Connection cn=null;try {Class.forName("com.mysql.jdbc.Driver").newInstance();cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/line_order?user=root&password=mysql");} catch (ClassNotFoundException ex) {} catch (IllegalAccessException ex) {} catch (InstantiationException ex) {} catch (SQLException ex1) {throw new Exception(ex1.getMessage());}return cn;}}在public Connection getConnection(String dsJndi) throws Exception 方法中参数String dsJndi被忽略。
在src/下的newxy.properties文件中加入: dao.default=common.DefaultDAO5.4. 数据库字符编码
net.newxy.dbm.DBM数据插入、更新、查询等方法会对数据进行字符编码转换,会将数据从本地字符编码转化为数据库字符编码,或将数据库字符编码转化为本地字符编码。 如果默认数据库字符编码不是操作系统本地字符编码,假设为ISO-8859-1,应在src/下的newxy.properites文件中加入: encoding.ds.default=ISO-8859-1
 
5.5. 本地字符编码
newxy(新坐标)从数据库获取数据后会根据用户的Local将数据的字码编码转换为Local相应的字符编码。这需在src/下的newxy.properties文件中加入: encoding.locale.zh_CN=GBK如果没有设置,会将从数据库获取的数据转换为操作系统本地字符编码
 
5.6. 默认DAO类
newxy(新坐标)中有个默认的DAO类net.newxy.dbm.BaseDAO,它将"jdbc/default"作为数据源的jndi名。 net.newxy.dbm.BaseDAO类可执行基本的数据插入、更新、删除等。用户可以建立自己的默认DAO类,以实现通用规则,但应继承net.newxy.dbm.BaseDAO或继承net.newxy.dbm.DBM。 假设用户默认DAO类是common.DefaultDAO,则需在src/下的newxy.properties文件中加入: dao.default=common.DefaultDAOnewxy(新坐标)建议用户的业务类继承默认DAO类。
 
6. 持久化类
6.1. DynaDto 通用持久化类
6.1.1. 保留属性名
在hibernate中,对数据库表都有一个持续化类与之对应,并有一个配置文件。在newxy(新坐标)中,可以只用一个通用持续化类net.newxy.dbm.DynaDto。 如果用户改变了表的字段名或字段类型,根本不需要修改持续化类及其配置文件(实际是没有配置文件),这极大地方便了用户,减少了大量的代码和工作。 为此,net.newxy.dbm.DynaDto及net.newxy.struts_faces.DynaFormBean保留了一些属性名,如下:
_coll_sql_nql_ejbHome_warnForSql_page_index_navigate_refresh_cache_cacheTime_add_lg_order_dao_dsJndi_table_select_from_frwdnewxy(新坐标)要求用户在设计数据库表时尽量不要使用以上属性名作为字段名。6.1.2. set、setValue方法
在实例化一个DynaDto后,常常要将数据库的表的字段值及表名set进去。
1.set方法 在实例化一个DynaDto后,通过set方法将值对加入到实例中。如
net.newxy.dbm.DynaDto dto=new net.newxy.dbm.DynaDto();dto.set("serialNumber","6931893700484");dto.set("product","克拉霉素胶囊");
2.setValue方法 对于一些保留属性的赋值方法是setValue,如将表名的值对加入到实例中:
net.newxy.dbm.DynaDto dto=new net.newxy.dbm.DynaDto();dto.setValue("_table","products");//或 dao.set_table("products");完整的例子如下,该例实现了数据插入。 net.newxy.dbm.DynaDto dto=new net.newxy.dbm.DynaDto();dto.setValue("_table","products");dto.set("serialNumber","6927693100029");dto.set("product","罗汉果止咳片");TestDao dao=new TestDao();dao.update(dto);7. IFacade接口、DBM抽象类、BaseDAO类、IFacadeFactory工厂
7.1. IFacade接口简介
package net.newxy.dbm;import java.util.*;import java.sql.Connection;import net.newxy.struts_faces.DynaFormBean;import java.sql.SQLException;public interface IFacade extends IDsLocale{void registerDto(Object bean) throws Exception;Connection getConnection() throws Exception;Connection getConnection(String dsJndi) throws Exception;void begin() throws Exception;void commit() throws Exception;void rollback() throws Exception;void setTransactionIsolation(int transactionIsolation)throws Exception;void setIsTransaction(boolean isTransaction);void setRollbacked(boolean rollbacked);boolean getIsTransaction();void setPFs(String[] PFs);void setFieldNames(String[] fieldNames);String[] getPFs();String[] getFieldNames();String getTableName();String getTableName(Object dto);void initialParams();void setLocale(Locale locale);Object getDto();void setDto(Object dto) throws Exception;public void encodeToHere(Object obj);public void encodeToThere(Object obj);void prepareStatement(String sql) throws Exception;void prepareCall(String sql) throws Exception;Object prepareCall(Class c,String sql,Object[] params) throws Exception;List list(String sql) throws Exception;Object findBySql(Class c,String sql) throws Exception;Object findBySql(Class c,String sql,boolean refresh,boolean cache,long interval) throws Exception;Object findBySql(String sql) throws Exception; //result type is DynaFormBeanObject findBySql(String sql,boolean refresh,boolean cache,long interval) throws Exception;Object findByPrimaryKey(Object parms) throws Exception;Object callByMethodName(String callByMethodName, Object parms) throws Exception;Object load(Object dto) throws Exception;Object update(Object dto) throws Exception;void remove(Object dto) throws Exception;}抽象类net.newxy.dbm.DBM实现了除Connection getConnection(String dsJndi) throws Exception外的所有方法
默认DAO类net.newxy.dbm.BaseDAO继承了net.newxy.dbm.DBM并实现了Connection getConnection(String dsJndi) throws Exception方法。
7.2. DBM抽象类简介
抽象类net.newxy.dbm.DBM实现了除Connection getConnection(String dsJndi) throws Exception外的所有方法。
void prepareCall(String sql) throws Exception; 该方法用于调用数据库没有参数的存储过程 Object findBySql(String sql) throws Exception;
结果类型是 DynaFormBean Object findByPrimaryKey(Object parms) throws Exception; Object update(Object dto) throws Exception; void remove(Object dto) throws Exception;
8. 主关键值生成器
8.1. 接口IAuto
主关键类Auto实现了接口IAuto,IAuto接口如下:
package net.newxy.util;public interface IAuto {Object increase(Object value,int len);Object decrease(Object value,int len);}Object increase(Object value,int len)方法使value值增加并返回。Object decrease(Object value,int len)方法使value值减少并返回。
8.2. 类Auto
主关键类Auto实现了接口IAuto
Object increase(Object value,int increment,int len)
如果value为Long、Integer、Short、BigDecimal类型,value值加上increment返回,len参数忽略。
如果value为String类型,但表达的是数值,则从value获取long型数值,加加上increment后再转为len长的String型,并返回。
这个方法不只限于数据库操作方面的运用。
Object increase(Object value,int len)
如果value为Long、Integer、Short、BigDecimal类型,value值增一返回,len参数忽略。
如果value为String类型,但表达的是数值,则从value获取long型数值,加一后再转为len长的String型,并返回。
Object decrease(Object value,int len)
如果value为Long、Integer、Short、BigDecimal类型,value值减一返回,len参数忽略。
如果value为String类型,但表达的是数值,则从value获取long型数值,减一后再转为len长的String型,并返回。
在未来版本开发者可以自己构建主关键字值生成器,只要实现了IAuto接口。
8.3. 主关键字值生成器的运用
主关键字值生成器类net.newxy.util.Auto由net.newxy.dbm.DBM的update方法调用, 如果值对象不包含主关键字赋值语句,update方法将调用Auto的increase方法,获得一个比现有主关键字最大值大一的value赋给主关键字,并作插入操作。 一般情况下开发者可以不必直接调用。下面是“快速上手”用过的例子:
dto=new DynaDto();dto.setValue("_table","products");dto.set("serialNumber","6927693100029");dto.set("product","罗汉果止咳片");dao.update(dto);例中每有赋给主关键id值,也就是说没有 dto.set("id",“1”)这样的句子。dao.update(dto)方法获取一个比已有最大值大一的value,赋给id,作插入操作。
9. FormBean类、DynaFormBean类与Struts的ActionForm类
9.1. 继承关系
net.newxy.struts_faces.FormBean继承自org.apache.struts.action.ActionForm,定义如下: public class FormBean extends org.apache.struts.action.ActionForm{......}net.newxy.struts_faces.DynaFormBean继承自net.newxy.struts_faces.FormBean,定义如下: public class DynaFormBean extends net.newxy.struts_faces.FormBean implements org.apache.commons.beanutils.DynaBean{......}net.newxy.struts_faces.DynaFormBean间接继承自struts的org.apache.struts.action.ActionForm。
 
9.2. FormBean类及DynaFormBean类重要方法
net.newxy.struts_faces.DynaFormBean类继承自net.newxy.struts_faces.FormBean,下面是net.newxy.struts.faces.DynaFormBean及其父类net.newxy.struts.faces.FormBean的几个重要方法
1、public void append(java.lang.Object dto)
在结果集_coll的最后追加一条记录。同时将索引号指向最后一条。并用最后一条记录数据填写formBean。
2、public java.lang.String setCollection(java.lang.Object objs)
设置结果集,与set_coll(Collection _coll)相比,该方法除了作set_coll(Collection _coll)操作外,还对与分页浏览的相关属性值进行计算,将计算结果重新填入formBean的_navigate属性中,并重新设置索引号。
3、public void setDto(java.lang.String no)
将formBean中的数据填写到以no参数值为索引号的记录中。
4、public void setForm(java.lang.String no)
以no参数值为索引号,查找该条记录,如果存在,将该条记录数据填入的formBean中,并以no值为索引号。
5、public void setForm(java.lang.Object dto)
dto为包含数据的javaBean。将该Bean的值填入formBean中。这个javaBean类继承自net.newxy.dbm.Dto,但在目前版本只介绍formBean类net.newxy.struts.faces.FormBean及持久类net.newxy.dbm.Dto,参数dto暂理解成通用持久类net.newxy.dbm.DynaDto。
6、public java.lang.Object getDto()
从formBean得到持久类实例。
7、public java.lang.Object getDto(java.lang.String no)
以no为序号,返回这条记录。如果不存在,返回空。
8、public void remove(java.lang.String no)
从结果集中删除以no参数值为序号的记录。
9、public java.lang.Object cloneDto(java.lang.String no)
以no参数值为索引号,得到这条记录的克隆
10、public void empty()
将formBean数据清空,但保留属性不会被清除,包括保存了记录集的属性_coll。
11、public java.util.Map getValues()
获取保存了属性值对的HashMap,页面表单submit上传的属性保存在这个Map中。
12、public java.lang.Object get(java.lang.String name)
获取以name值为属性名的属性值
13、public void set(java.lang.String name, java.lang.Object value)
设置属性值。如果name是保留属性,将不进行set操作。
14、public void setValue(java.lang.String name,java.lang.Object value)
保留属性的set方法,通过此方法可以改变保留属性值。
15、public void set_dao(java.lang.String _dao)
设置DAO类别名,_dao是保留属性,也可用方法setValue(“_dao”,_dao)。
16、public void set_index(java.lang.String _index)
设置记录集的索引号,_index是保留属性,也可用方法setValue(“_index”,_index)。
9.3. DynaFormBean类的特点
struts提供的表单数据自动绑定功能很有限,使用net.newxy.struts_faces.DynaFormBean 作为formBean的实现类,开发者就不需为每个表单开发单独的类。
在jsp页面上,在等标签里的属性如果不存在于DynaFormBean的实例中, DynaFormBean的实例会将该属性加入到DynaFormBean的实例中,并且赋给该属性空值,这样就不会抛出异常。 用户在静态页面上为该属性赋值并提交后,如果该属性名在数据库表中有对应字段,它并参于数据库的操作, 如果数据库表中没有对应字段,它将被忽略。可以利用这个特性向后台提交各种数据,以作控或它用。 这既解决了strus“过份严格”绑定数据的不足,又增加了在后台处理业务的灵活性。
10. DispatchAction类,对Struts DispatchAction类的继承
10.1. 默认方法
net.newxy.struts_faces.DispatchAction继承自org.apache.struts.actiions.DispatchAction。 开发者在利用struts时可以将Action类直接继承自net.newxy.struts_faces.DispatchAction;使用net.newxy.struts_faces.DispatchAction应注意几点:
在struts的配置中,要为action 设定 parameter参数; net.newxy.struts_faces.DispatchAction的子类不要有execute方法;
net.newxy.struts_faces.DispatchAction有几个非常有用的默认方法 public ActionForward find(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{......} jsp页面表单传来的数据在这里组合成sql查询语句,将查询结果以java Bean保存到action配置时指定的scope中, 并以httpServletRequest.getParameter("_frwd")为forward名进行转发。 public ActionForward update(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{......} jsp页面表单传来的数据在这里组合成sql update语句,actionForm数据保存到数据库, 并以httpServletRequest.getParameter("_frwd")为forward名进行转发。 public ActionForward remove(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{......} 以httpServletRequest传来的参数在这里组合成sql delete语句,作数据库delete操作。 并以httpServletRequest.getParameter("_frwd")为forward名进行转发。 public ActionForward edit(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{......} 从actionForm中得到属性_index的值,或从httpServletRequest.getParameter("_index")得到, 这是actionForm属性_coll(记录集)中记录行数,找到这条记录,将其数据填到actionForm中, 名意是"edit",可以对其编辑或显示。再以httpServletRequest.getParameter("_frwd")为forward名进行转发。 public ActionForward empty(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{......} 将actionForm非保存属性值清空,供用户录入一条新数据,这样因为没有主关键字值, update时会自动获得增一的主关键字值,然后作插入操作。主要供用户新建一条记录用。
 
11. newxy查询语言(Query Language), NQL
11.1. 简介
net.newxy.dbm.NQL 是 newxy(新坐标)的面向对象的查询类。他以标准的sql语言为基础,开发者不需要学习新的语法规则。不需要在查询语句中镶入值对象类名。通过add()方法加入新的查询条件,通过and()、addAnd()方法及or()、addOr()方法设置逻辑关系。利用多态特性,控制查询范围。
newxy(新坐标)处理多项查询时采用NQL技术,这样可因不同身份的人形成不同的查询语句。
以下是 NQL 类的几个构造方法
public NQL(IFacade ifacade,String _sql)throws Exception{ this.ifacade=ifacade; this._sql=_sql; initial(); } ifacade是net.newxy.dbm.DBM及其子类的接口。_sql是最初sql语句。 public NQL(String dao,String _sql)throws Exception{ this.dao=dao; this._sql=_sql; initial(); }
dao 是src/下newxy.properties文件中设置的DAO类别名。例如
dao.test=common.TestDao
参数dao就可以是"dao.test"。
_sql是最初sql语句。
public NQL(String _sql)throws Exception{ this._sql=_sql; initial(); }
这个构造函数调用的initial()方法会用默认DAO类的实例赋给NQL类变量ifacade。_sql是最初sql语句。
11.2. 应用举例
下面举几个例子。类NQL1、NQL2、NQL3、NQL4之间有递次继承关系。NQL1继承自net.newxy.dbm.NQL类。
NQL1 以"select b.* from industry as a,enterprise as b where{a.code=b.industry_code}"作为 构造函数参数。查询得企业表enterprise中所有数据。
NQL2 继承 NQL1,在NQL1的基础上加以限制,查询结果企业的经营范围包含"批发"或"餐饮"
NQL3 继承 NQL2,在NQL2的基础上以加扩张,使查询结果企业也可以是行业代码等于"D"。
NQL4 继承 NQL3,在NQL3的基础上加限制,使查询结果在NQL3的基础上,使企业名称必需包含"公司"或行业代码等于"A"。
类NQL1,定义及运用
定义
package common; import net.newxy.dbm.NQL; public class NQL1 extends NQL{ public NQL1()throws Exception{ super("select b.* from industry as a,enterprise as b where{a.code=b.industry_code}"); } } 注意:作为参数的查询语句中应有where{},用的是大括号,而不是小括号,表明这里是动态生成查询条件的地方。还有种形式是:select * from enterprise where{}
运用,查询得企业表enterprise中所有数据
NQL nql=new NQL1(); List list=nql.list(); for (int i = 0; i < list.size(); i++) { DynaBean bean = (DynaBean) list.get(i); System.out.println(bean.get("name")+" "+bean.get("dealIn")); } 产生的SQL语句是:select b.* from industry as a,enterprise as b where (a.code=b.industry_code) 类NQL2,定义及运用
定义 package common; public class NQL2 extends NQL1{ public NQL2() throws Exception{ super(); and(); addOr(); add("b.dealIn like ‘%批发%‘"); add("b.dealIn like ‘%餐饮%‘"); setWhere(); } } 运用,在NQL1的基础上加以限制,查询结果企业的经营范围包含"批发"或"餐饮" NQL nql=new NQL2(); List list=nql.list(); 产生的SQL语句是:select b.* from industry as a,enterprise as b where ((a.code=b.industry_code) and (b.dealIn like ‘%批发%‘ or b.dealIn like ‘%餐饮%‘)) 类NQL3,定义及运用
定义 package common; public class NQL3 extends NQL2{ public NQL3() throws Exception{ super(); or(); add("b","industry_code","D"); setWhere(); } } 运用,在NQL2的基础上加以扩张,使查询结果企业可以是行业代码等于"D" NQL nql=new NQL3(); List list=nql.list(); 产生的SQL语句是:select b.* from industry as a,enterprise as b where ((a.code=b.industry_code) and ((b.dealIn like ‘%批发%‘ or b.dealIn like ‘%餐饮%‘) or (b.industry_code=‘D‘))) 类NQL4,定义及运用
定义 public class NQL4 extends NQL3{ public NQL4() throws Exception{ super(); and(); addOr(); add("b.name like ‘%加工%‘"); add("b","industry_code","A"); setWhere(); } } 运用,在NQL3的基础上加限制,使查询结果在NQL3的基础上,使企业名称必需包含"公司"或行业代码等于"A"。 NQL nql=new NQL4(); List list=nql.list(); 产生的SQL语句是:
select b.* from industry as a,enterprise as b where ((a.code=b.industry_code) and (((b.dealIn like ‘%批发%‘ or b.dealIn like ‘%餐饮%‘) or (b.industry_code=‘D‘)) and (b.name like ‘%公司%‘ or b.industry_code=‘A‘))) NQL4产生的sql语句也可由直接得到,方法如下: NQL nql = new NQL("select b.* from industry as a,enterprise as b where{a.code=b.industry_code}"); nql.and(); nql.addOr(); nql.add("b.dealIn like ‘%批发%‘"); nql.add("b.dealIn like ‘%餐饮%‘"); nql.setWhere(); nql.or(); nql.add("b","industry_code","D"); nql.setWhere(); nql.and(); nql.addOr(); nql.add("b.name like ‘%公司%‘"); nql.add("b","industry_code","A"); nql.setWhere 产生的SQL语句是:
select b.* from industry as a,enterprise as b where ((a.code=b.industry_code) and (((b.dealIn like ‘%批发%‘ or b.dealIn like ‘%餐饮%‘) or (b.industry_code=‘D‘)) and (b.name like ‘%公司%‘ or b.industry_code=‘A‘)))
注:
1.红色条件是构造NQL实例时的基本条件,它与后来产生的条件始终是"and "关系。
2.setWhere()方法会将当前附加的条件与先前条件结合构成新的条件。前后条件之间是"and"还是"or"由 and()、or()方法决定。 当前附加各条件之间是"and"还是"or"关系则由addAnd()、addOr()方法决定。可参看NQL4的构造方法及产生的sql语句(注意黑色部分):
public NQL4() throws Exception{super();and();addOr();add("b.name like ‘%公司%‘");add("b","industry_code","A");setWhere();}select b.* from industry as a,enterprise as b where ((a.code=b.industry_code) and(((b.dealIn like ‘%批发%‘ or b.dealIn like ‘%餐饮%‘) or (b.industry_code=‘D‘))and (b.name like ‘%公司%‘ or b.industry_code=‘A‘)))3.如果NQL3的构造函数中不包含setWhere();则NQL4产生的sql语句如下:
select b.* from industry as a,enterprise as b where ((a.code=b.industry_code) and ((b.dealIn like ‘%批发%‘ or b.dealIn like ‘%餐饮%‘) and (b.industry_code=‘D‘ or b.name like ‘%公司%‘ or b.industry_code=‘A‘)))
NQL3构造函数中 add("b","industry_code","D")加入条件会与NQL4构造函数中add("b.name like ‘%公司%‘")、add("b","industry_code","A")加入的条件一同解析,放入同一括号中。结果SQL语名包含的是
and (b.industry_code=‘D‘ or b.name like ‘%公司%‘ or b.industry_code=‘A‘)
所以NQL类的子类构造函数应是如下形式 super();or();//或者 and();addAnd();//或者 addOr();add("b.name like ‘%公司%‘");add("b","industry_code","D");setWhere();否则就不用继承,直接用NQL。
 
12. 数据缓存(Cache)
12.1. 简介
所有查询所得数据可以用sql语句作为键名存入在类net.newxy.struts_faces.Cache的单子实例中,同时保存了put时间,缓存时长。 net.newxy.struts_faces.Cache实现了Runnable接口。一个线程每隔60秒作一次检查,超过缓存时长的数据将被清除出缓存。
//类Cachepackage net.newxy.struts_faces;import java.util.*;import net.newxy.cfg.Configure;public class Cache implements Runnable{private static Cache cache=new Cache();private Map dtosMap; // 以sql为键名,保存查询结果。private Map dateMap; // 以sql为键名,保存查询结果put入dtosMap的时间。private Map cacheTimeMap; // 以sql为键名,保存查询结果在dtosMap中的时长。private Map pksMap;private Thread thread=null;public Cache(){......}......}12.2. 类net.newxy.dbm.DBM几个能实现查询缓存的方法
以下是类net.newxy.dbm.DBM几个能实现查询缓存的方法
Object findBySql(String sql,boolean refresh,boolean cache,long interval) throws Exception; 如果refresh==false并且cache==false该查询方法等同于 Object findBySql(String sql) throws Exception,不对数据缓存。
如果refresh==true,cache值将被忽略,强制查询,并将结果存入缓存中。interval是缓存时长,如果interval==0, 则有如下计算:
if(interval==0){ Object L=cacheTimeMap.get(sql);//忽取缓存时长 if(L!=null) interval=((Long)L).longValue(); else{ String intervalStr= src/下文件newxy.properties中的 cacheTime值。 if(intervalStr==null) intervalStr="3600000";//一小时 try{ interval=Long.parseLong(intervalStr); catch(Exception e){ interval=3600000; } } } 由上可见,缓存时长可在src/下newxy.propertie文件中cacheTime值决定,默认值是一小时.但可由查询方法最后决定缓存时长.
如果refresh==false 并且 cache==true,则在缓存中忽取数据,如果没有,则查询,以interval为缓存时长保存到缓存中。
Object findBySql(String sql) throws Exception; 该方法在下列几种情况下有缓存作用。但不推荐开发者这样使用,newxy(新坐标)的工具会用到。
(1)sql以:cache结尾,数据从缓存中忽取,如果缓存中没有,查询并存入缓存。如同 findBySql(String sql,false,true,0);
(2)sql以:cache:interval=60000 结尾,数据从缓存中忽取,如果缓存中没有,查询,以指定时长存入缓存。如同 findBySql(String sql,false,true,60000);
(3)sql以:refresh结尾,强制查询,并存入缓存。如同 findBySql(String sql,true,false,0);
(4)sql以:refresh:interval=60000 结尾,强制查询,并以指定时长存入缓存。如同 findBySql(String sql,true,false,60000);
如果以上几种情况不存在,仅仅查询,将结果返回。
Object findBySql(Class c,String sql,boolean refresh,boolean cache,long interval) throws Exception;
参数c是数据库表的值对象类的“类”实例。本次文档暂不介绍。 Object findBySql(Class c,String sql) throws Exception;
参数c是数据库表的值对象类的“类”实例。本次文档暂不介绍。
12.3. newxy(新坐标)查询语言(NQL)对缓存的实现
newxy(新坐标)查询语言(NQL)对缓存的实现
newxy(新坐标)查询语言由类net.newxy.dbm.NQL实现。
NQL中与缓存、刷新有关的set方法
public void setRefresh(boolean refresh) { this.refresh = refresh; } 如果setRefresh(true),则强制查询并保存到缓存。如果setRefresh(false),则是否缓存根据setCache(true)或setCache(false),见下面。 public void setCache(boolean cache) { this.refresh=false; this.cache = cache; } 如果setCache(true),则从缓存中忽取数据,若没有,则查询并存入缓存。如果setCache(false),仅仅查询。 强制查询,并存入缓存 NQL nql = new NQL("select * from enterprise"); ...... nql.setRefresh(true); nql.setCacheTime(120000); //缓存时长为二分钟 List list = nql.list(); //数据put入缓存的时间为当前系统时间。 ...... 从缓存中忽取数据,如果空,则查询,并存入缓存 NQL nql = new NQL("select * from enterprise"); ...... nql.setCache(true); nql.setCacheTime(120000); //缓存时长为二分钟 List list = nql.list(); //如果缓存中有数据,不改变数据put入缓存的时间。 ......
12.4. 通过网页或jsp页面实现缓存查询
通过网页或jsp页面实现缓存查询。一种方法是用标准的
标签或struts 的标签或newxy(新坐标)的标签实现。另一种是用 newxy(新坐标)的标签实现。
使用标准的 标签实现缓存查询,以下是一个范例
sql语句
该范例的意义是:以用户输入的sql语句为键名在缓存中get数据,如果没有数据,则以用户输入的sql语句查询,并将查询所得数据以一分钟为时长存入缓存中,并存入action配置决定的scope中。 如果将 换成 则强制查询,并将结果以一分钟为时长存入缓存中。 在该范例中,用了struts的action,action的type是 newxy(新坐标)的 net.newxy.struts_faces.DispatchAction,几个参数名_sql、_cache、_cacheTime 都是约定的,后台可以不写java代码。
用struts标签及newxy(新坐标)的标签实现查询缓存的方法与标准标签的方法相同。这两个标签会转换为标准的 标签。
newxy(新坐标)标签的缓存查询方法
范例一:
范例一例解:Bean名为enterprise,默认范围session,如果session中没有,在缓存中获取,如果缓存中没有则以sql语句查询,结果以enterprise名存入session。 并以二分钟的时长存入缓存中。如果页面再次载入,且sql语句内容发生改变,则强制查询,结果以二分钟为时长存入缓存中,同时以enterprise为名存入session。
范例二:
范例二例解:Bean名为enterprise,默认范围session,强制以sql语句查询,结果以二分钟为时长存入缓存中,并以enterprise为名存入session中。
对以上二例查询结果通常这样使用(在一个表单中列出企业名称和地址):

13. newxy(新坐标)标签
13.1. 简介
newxy(新坐标)建立了一套标签。newxy(新坐标)标签按struts的标签分类方法分成三类:bean、html、logic。
newxy(新坐标)标签前辍在struts标签前辍前加上"n",即"newxy"的意思,分别是nbean、nhtml、nlogic。
newxy(新坐标)标签充分利用自身技术框架对数据库及java bean操纵的功能,在不写或少写java代码的情况下构建运用系统。
newxy(新坐标)标签产生几个javascripts函数供标签、标签产生的、click事件调用, 同时自身还能进行数据的update、delete、insert、find、reset、及从列表选某条记录的操作。
newxy(新坐标)标签标签可以分页、导航。
newxy(新坐标)标签提供了几个javascripts函数,用于在鼠标over、clik、out数据行时对数据行色彩进行修饰。
newxy(新坐标)标签提供了几个预定的css的class,被产生的javascripts函数引用。
标签和标签配合使用,可以产生标签,并有onclik,onover,onout事件,可以修饰数据行色彩,并能为 javascripts变量赋值,以被其它标签产的javascripts方法调用。
newxy(新坐标)标签除强大的对数据库及java bean操纵的功能外,一个很特别的能力是通过设定数据行的不同色彩在客户端保留java bean状态。
13.2. nbean标签
13.2.1. 标签
属性 request default 意义
name true   bean 名,标签在scope范围内以此名getAttribute(name),如果结果为空,将在Cache中获取,或以sql查询,结果以name保存到scope中。
scope false session bean保存的范围,默认为session。
dao false dao.default 执行sql语名的DAO,是src/下newxy.properties文件中设定值,如 dao.xxx=common.TestDAo,此时属性dao为dao.xxx。如果用户没有自定义DAO类,属性dao值可为空。
sql true   查询语句
refresh false false 如果refresh等于true或yes,强制查询,结果保存到Cache中,且保存到scope中。
cache false false 如果cache等于true或yes,如果在scope中getAttribute(name)为空,则在cache中获取,保存到scope中,如果cache中没有则以sql为语句查询,结果保存到Cache中,也保存到scope中
cacheTime false3600(秒) 数据保存到Cache中的时长。
注:关于Cache(数据缓存)的内容参看主题: 数据缓存(Cache)
13.2.2. 标签
属性 request default 意义
collName true   collName是保存在scope中的bean名,该bean是Collection类型,它与struts标签中的name属性类型相同。 它的元素是org.apache.struts.util.LabelValueBean类型。struts标签举例如下
scope false page bean保存的范围。默认为pageContext范围
label false   属性label与属性value二者必有其一。label是bean某个元素org.apache.struts.util.LabelValueBean的label(getLabel())值,目的是要以此label值获取该元的value(getValue())值。
value false   属性value与属性label二者必有其一。value是bean某个元素org.apache.struts.util.LabelValueBean的value(getValue())值,目的是要以此value值获取该元的value(getLabel())值。
var false   变量名,如果空,获取的label或value直接写到页面,否则以var为名保存到scope中
13.2.3. 标签
假设在某个scope内有两个bean: bean1是记录集,是Collection类型,bean2是newxy(新坐标)的DynaFormBean类型,在bean2中有一属性_coll是Collection类型,是记录集。 在设计jsp页时我们经常有这样的需要:
1.在bean1或bean2中以一条记录的关键字值获得这条记录,存入某个scope中。实现如下:
将id为001的学生记录以stu为名保存在session(默认范围)中。
2.在bean1或bean2中以一条记录的关键字值获得这条记录另一字段值,存入某个scope中。实现如下:
将id为001的学生姓名以stuName为名保存的session中
3.bean是单条记录,获取某字段值。可以这样实现:
这样与struts标签作用相同,不推荐开发者使用。
属性 request default 意义
name true   Collection或newxy(新坐标)DynaFormBean类型的java bean名
fieldName true   关键字字段名
fieldValue true   关键字字段值
lookupFieldName true   查到记录后,将获取以此值为名的另一字段名。
var true   结果存入scope中的变量名
13.2.4. 标签
标签对用户权限进行判断,如没有权限防问此jsp页,只打印一条没有权限的信息,且后面jsp页面内容不再显示。
标签非常相似,
判断有没有权限的方法是根据bean的字段名、字段值等属性进行比较、匹配,如果有结果表明有权限。
匹配结果可用var属性值保存,供开发者进一步使用。
属性 request default 意义
name true   scope中保存bean的键名,该bean是newxy(新坐标)net.newxy.struts-faces.DynaFormBean类型, 或net.newxy.struts-faces.FormBean类型,或一般的java Bean类型。
如果bean不存在,打印“没有权限!”,后面的jsp页面内容被忽略。
fieldName false   如果bean存在,且fieldName不空,分两种情况:
一、fieldValue为空,则以fieldName属性值在bean中获取该字段值,如果空,打印“没有权限!”;
二、fieldValue不空,则将上项查得属性值与fieldValue进行比较,如果不相等,又分两种情况:
1、bean不是net.newxy.struts_faces.FormBean或net.newxy.struts_faces.DynaFormBean类型,打印“没有权限!”;
2、bean是net.newxy.struts_faces.FormBean或net.newxy.struts_faces.DynaFormBean类型,   以fieldName值为字段名,以fieldValue为字段值,在记录集中查找记录,如果没有,打印“没有权限!”;
fieldValue false   关键字字段值,其意义见fieldName属性的说明。
lookupFieldName false   如果lookupFieldName不空,根据fieldName及fieldValue匹配所得结果,以lookupFieldName属性值为字段名获取字段值, 如果结果为空,打印“没有权限!”。
message false   在没有权限时如果message为空,打印“没有权限!”(已国际化了),否则打印message值。
var false   根据各属性值匹配的结果不为空时,将匹配结果以var值为名保存到toScope中。
scope false session 以name值为键名保存bean的范围。
toScope false page 见属性var的说明。
13.2.5. 标签
属性 request default 意义
table false   表名,保存访问信息.
title false   页面主题,如果为空,将赋值为request.getRequestURI();
titleField false title 保存主题的字段名
countField false   记录点击次数的字段名,如果此值不空,更新此字段值,作为访问计数,否则插入新的记录, 以记录数作为访问计数。如果以插入新记录作为访问计数,表中需有一名为sessionId字段,用于保存会话id。
ipField false id 保存客户端ip地址的字段名,countField为空时有意义。
timeField false id 保存访问时间的字段名,countField为空时有意义。
bySession false true 如果此值是no或false,页面每点击一次计数一次,否则在同一会话中同一页面的点击只计数一次。
当bySession属性不等于no且不等于false时,如果title属性值相同,不会重复记数. 如:某页面文件上有此标签 , 一旦有用户访问,并对表作一次插入操作,同一会话中只插一次,而且记录了客户端的IP。特别注意,标签中没有countField属性。可以这样统计访问量:
页面访问计数
资源名访问人次
当bySession属性不等于no且不等于false时,如果title属性值相同,不会重复记数. 如:某页面文件上有此标签 , 一旦有用户访问,并在表中找title字段值为"生活频道"的记录,将visitTimes字段值加一,同一会话中只加一次。但visitTimes值的更新是由一实用类net.newxy.util.Count完成的,这个类有一线程每隔一分种进行一次更新操作。特别注意,标签中有countField属性。可以这样统计访问量:
页面访问计数
页面访问人次
当标签中加入bySession属性,设其值为"false"或"no",以上计数则是按点击计算,不按人次计算,即不管是在同一会话中与否,每点击一次都会计数一次。
13.2.6. 标签
将bean或bean的某属性值写到页面,与struts的作用相似.
struts标签的缺陷是不能表现普通文本原有格式.
属性 request default 意义
name true   与struts标签中的name意义相同。
property false   与struts标签中的property意义相同。
filter false true 如果文本外观由超文本标记修饰,filter应为false或no,否则如果内容是普通文本,filter应为默认的true.
scope false session bean存储的范围,可选值有:page,request,session,application。默认值为session
13.3. nhtml标签
13.3.1. 标签
属性 request default 意义
js false js1     javascripts 文件名(不含扩展名),含有javascripts 函数,主要供标签产生的鼠标事件调用修饰颜色。使用标签必须用此标签。
标签会在/context/js/下找js属性指定的文件,如果文件不存在,到/context/下找,如果不存在,标签会将包中的同名文件读出,写到/context/下,并加上引用代码。形式如下:
13.3.2. 标签
属性 request default 意义
stylesheet false stylesheet1     stylesheet属性指css文件名(不含扩展名),主要供标签产生的鼠标事件调用修饰颜色。使用标签必须用此标签。
标签会在/context/css/下找stylesheet属性指定的文件,如果文件不存在,标签会在/context/下找,如果文件不存在,标签会将包中的同名文件读出,写到/context/下,并加上引用代码。
用户可用自己的css,将其放到/context/css/下,如果/context/css/下没用与用户同名css文件,也可放到/context/下。  stylesheet属性值是stylesheet2时输入如下:
13.3.3. 标签
属性 request default 意义
action true     action属性有两种用法。
1.action属性值是struts配置的 action path 元素值。submit后由Action类的某方法执行。
2.action属性值是某jsp文件。这时formName不能空。submit后由jsp文件上某标签执行, 这个标签id属性值等于此标签actionId属性值,或等于调用submit()的方法的产生者(某标签,它产生的javascript方法调用submit())的id值,它的formName属性值也等于此标签的formName属性值。 如果action值为空,action值默认为 request.getRequestURI(),由当前路径上某标签执行。
actionId false   action属性值是某jsp文件,actionId是这个jsp文件上某标签id属性值。
formName false   formName是formBean名,如果scope范围没有与属性formName值相同的formBean,标签会实例化一个  net.newxy.struts_faces.DynaFormBean,以属性formName值为键名放入scope中。  属性formName值也是产生的表单name值。
formId false   产生的表单id值。在客户端,如果有多个同名表单,则需要id加以区别。formId就不能空。
标签类扩展了struts标签类。其它属性与标签属性意义相同。
13.3.4. 标签
属性 request default 意义
onclick false   onclick事件有重要运用,参见重要实践
所有属性与
包含的元素意义相同。
13.3.5. 标签
属性 request default 意义
page true   某jsp页的路径,或其它路径,但这路径最终能转发到某jsp页,如果page为空,page值将为当前路径,即 request.getRequestURI();
actionId true   page所指jsp文件上某标签id值,标签选择index值为序号的记录填到formBean中。 当前版本只用于标签内,转到另一页面时,当前所在的标签中的记录被填到formBean中. 效果是:用户点击某条记录的超链接,到另一页面就能得到详细信息,或对其编辑.
如果不需page属性所指jsp执行某项操作,则不要用此标签。
13.3.6. 标签
属性 request default 意义
name true   最终输出的name值。
collName false   collName与sql不能同时为空
collName是保存在scope中的bean名,该bean是Collection类型,它与struts标签中的name属性类型相同。 它的元素是org.apache.struts.util.LabelValueBean类型。
sql false   如果collName为空,标签会以sql为查询语句得到DynaFormBean,以labelName值为字段名得到的字段值为option的标签,以valueName值为字段名得到的字段值为option的value。 如果collName为空且sql不为空,则labelName及valueName属性不能为空。
labelName false   参见sql属性介绍。
valueName false   参见sql属性介绍。
13.3.7. 标签
属性 request default 意义
name true   此标签用于显示图像。
name是FormBean存于scope中的名,与struts标签中的name意义相同。
property false   property是FormBean的属性名,与struts标签中的property意义相同。
path true   path是servlet类net.newxy.servlet.ShowImage的影射名,假设web.xml中有如下设置: showImage net.newxy.servlet.ShowImage showImage /showImage path值应是"/showImage",是显示图像的Servlet路径。
ext false jpeg 图像的格式,如"jpeg","gif"等,默认值是session。
scope false session FormBean存储的范围,可选值有:page,request,session,application。默认值为session
13.3.8. 标签
标签继承自struts的org.apache.struts.taglib.html.BaseFieldTag, 目的是要向最终用户隐葳重要信息,如不能在html页面代码中看到sql真实语句。开发者必须注意两点:
1.在标签中,对特殊字符不进行转换,如,它不将‘<‘转换成<
2.通常用于多项查询时隐藏sql语句、表名、字段名。如,   最终用户看到的html代码中是这样的
13.3.9. 标签
标签类继承自struts标签类。所不同的是增加了maxSize等元素。maxSize是文件的最大值,单位是K字节, 如果上传文件大于此值,所上传数据不会保存到数据库中或文件夹中,并有信息提示。该标签的其它属性意义可参看struts标签的相同属性。
下面是相比于struts标签新增的元素。
属性 request default 意义
maxSize false   上传文件大小的最大值,单位:千字节。
fileNameField false   保存文件名的表字段。
fileExtendNameField false   保存文件扩展名的表字段。
fileTypeField false   保存文件类型的表字段。
fileSizeField false   保存文件大小的表字段。
fileLimit false   上传文件的限制类型。如:fileLimit="jsp",除了jsp文件,其它文件都不能上传。
如果多个文件上传至数据库,只要有一个文件不符合要求(如:文件过大,或类型被限制),不会进行update操作,并有提示提息。
如果多个文件上传至文件夹,符合要求的可上传,不符合要求的不上传。已上传的和不能上传的都会提示给用户。
13.3.10. 标签
,及都会产生几个javascripts函数,这些函数名是id值加Update等字符串组成,并带有参数。 标签目的是产生一个铵钮,通过点击铵钮调用这些函数。调用的结果是数据更新或插入, 或删除某条记录,或选择某条记录填入formBean中,或reset表单中数据。
标签不一定要放到标签或标签中。
update操作不影响struts在静态页面上的表单验证。
属性 request default 意义
actionId true   actionId是指某个标签或标签的id号,它在当前路径上,不一定在当前jsp页面上。 比如,jsp1.jsp包含了jsp2.jsp。jsp1.jsp上有一标签其id="act1",jsp2.jsp上有一标签标签actionId可以是act1。
method true   method属性值是edit、newOne、update、remove、reset、find、upload。根据这些值的不同,铵钮点击后的作用也不同, 前五项值产生的铵钮,其点击事件与产生的铵钮作用相同。 find值产生的铵钮点击后会将当前表单提交上去的数据组成查询语句,进行查询。
value false 与method属性值同 铵钮上的文字。
src false   图片文件的路径。如果此值不空,输出结果是:
13.3.11. 标签
,及都会产生几个javascripts函数,这些函数名是id值加Update等字符串组成,并带有参数。 标签目的是产生几个铵钮通过点击调用这些函数。调用的结果是数据更新或插入, 或删除某条记录,或选择某条记录填入formBean中,或reset表单中数据。
标签不一定要放到标签或标签中。
update操作不影响struts在静态页面上的表单验证。
属性 request default 意义
actionId true   actionId是指某个标签或标签的id号,它在当前路径上,不一定在当前jsp页面上。 比如,jsp1.jsp包含了jsp2.jsp。jsp1.jsp上有一标签其id="act1",jsp2.jsp上有一标签标签actionId的值可以是act1。
noEdit false   标签在默认的情况下产生五个铵钮,中文是“编辑”、“新建”、“更新”、“删除”、“重置”。如果不需“编辑”铵钮,noEdit值可填yes或true。 “编辑”铵钮的点击事件是以参数index的值为序号,在结果集中找到这条记录,将这条记录值填到formBean中,这个formBean保存在scope中,其键名等于参数formName的值。
editValue false   标签产生的一个铵钮中文是“编辑”,其意义是将某条记录填到formBean中传给用户进行编辑。 但实际运中,用户可能只是浏览某条记录信息。这时可通过editValue值替换“编辑”字样。
noNewOne false   如果不需“新键”铵钮,noNewOne值可填yes或true。“新建”铵钮的点击事件是清空formBean(但记录集还在)。 因为原有表的主关键字也清掉了,用户提交数据后就会作插入操作。
noUpdate false   如果不需“更新”铵钮,noUpdate值可填yes或true。“更新”铵钮的点击事件是数据的update或insert。 如果有主关键字,且根据主关键字值在数据库中能查到此条数据就作update操作,否则作insert操作。
noRemove false   如果不需“删除”铵钮,noRemove值可填yes或true。“删除”铵钮的点击事件是从数据库中删除index参数指定的记录, 如果参数中没有index,删除当前formBean数据对应的记录。
noReset false   如果不需“重置”铵钮,noReset值可填yes或true。“重置”铵钮的点击事件重置表单数据,作用与铵钮相同。
13.4. nlogic标签
13.4.1. 标签
该标签产生页面导航铵钮。该标签需与标签或struts标签配合使用。 如果该标签放在后面。需在 中设定length属性值,且与此标签legnth属性值相同。
属性 request default 意义
name true   scope范围内保存bean的键名,该bean为net.newxy.struts_faces.FormBean或net.newxy.struts_faces.DynaFormBean类型。
scope false session bean保存的范围,默认为session。
length false 25 每页显示的记录数。
CLASS false   css样式名,修饰导航铵钮风格。
style false   修饰导航铵钮风格。
13.4.2. 标签
该标签继承自struts的org.apache.struts.taglib.logic.IterateTag。
属性 request default 意义
name true   scope范围内保存bean的键名,该bean为net.newxy.struts_faces.FormBean或net.newxy.struts_faces.DynaFormBean类型。
scope false session bean保存的范围,默认为session。
length false 1000 显示的最大记录数,如果没有标签,最大显示1000条记录。
indexId false index 参见struts标签的同名属性。
keys false   bean对应的数库表的主关键字段名,如果有多个,用逗号隔开。目的是将主关键字名及值传给,它产生点击时对javascripts脚本变量赋值,最终会再传回后端。
其它属性意义参见struts标签同名属性。
13.4.3. 标签
所有jsp页面可看成是树的叶,jsp页面所在的“文件夹”可看成分枝结点,所有jsp页面和分枝结点构成树。 标签用于显示当前页的位置,从树根(web上下文)到当前“文件夹”结点,以超链形式列出。 如何使用,请参看工具类net.newxy.util.Explorer的介绍.
属性 request default 意义
separator false > 分隔符.
13.4.4. 标签
属性 request default 意义
id true   此标签的标志号,名称应符合java变量规范,但不能以‘$‘开始。此值会被其它标签引用。
formName true   存储于scope中FormBean的名。
formId false   如果formName名与某表单中的name值相同, formId则与表单中id值相同,这个表单极有可能是标签产生的。如果scope中没有FormBeam,标签会实例化一个net.newxy.struts_faces.DynaFormBean,以name值为名存入scope中。
scope false session FormBean存储的范围,可选值有:page,request,session,application。默认值为session
此标签有两个作用,一是产生javascripts方法,这些方法或调用表单的submit()方法,或调用window.location=""方法,共同的特点是带着数据访问另一路径。 二是接收页面参数,并作数据处理。
此标签可能只用到产生的javascripts方法,也可能只起作对数据处理的作用。它经常身兼二职,既用到产生的javascripts方法,又进行数据处理。 它处理的数据可能是由不同jsp页面上产生的javascripts方法调用表单的submit()方法或window.location=""方法传来的。
理解此标签很重要!
13.4.5. 标签
属性 request default 意义
id true   此属性与的id意义相同。
formId false   标签可以利用path属性值得到action的name元素值,这个值与中的formName值意义相同。 而此标签formId属性与中的formId意义相同。
path true   此属性值是struts某action配置的path元素值,通常带有“.do"。
parameter false method struts配置action的parameter值。此标签产生的方法在后台调用到net.newxy.struts_faces.DispatchAction或它的子类方法。parameter属性会以如下的方式用到,
/context/action1.do?method=update
蓝色的"method"就是parameter属性值。
forward false   struts配置action的forward值,它是eidt,update,find等方法执行后转发的参数,这些方法会执行如下代码:
return actionMapping.findForward(forward);
但是这此方法执行后也可以各自的forward值转发。 这就需要设置属性 editForward,updateForward等。
editForward false   edit方法执行后转发时参数值,edit方法执行后调用
return actionMapping.findForward(editForward);
参见forward属性说明。
newOneForward false   newOne方法执行后转发时参数值,newOne方法执行后调用
return actionMapping.findForward(newOneForward);
参见forward属性说明。
updateForward false   update方法执行后转发时参数值,update方法执行后调用
return actionMapping.findForward(updateForward);
参见forward属性说明。
removeForward false   remove方法执行后转发时参数值,remove方法执行后调用
return actionMapping.findForward(removeForward);
参见forward属性说明。
callForward false   call方法执行后转发时参数值,call方法执行后调用
return actionMapping.findForward(callForward);
参见forward属性说明。
editMethod false   开发者的action调用的是自己建立的net.newxy.struts_faces.DispatchAction子类方法。 开发者在调用super.edit()方法前可能作预先处理,假设开发者定义的方法为:
public ActionForward myEdit(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{ ...... ActionForward actionForward=super.edit(); ...... return actionForward; } 这时editMethod值应为"myEdit"。其实开发者myEdit方法可以做与"edit"不相干的事。
newOneMethod false   参见editMethod属性说明。
updateMethod false   参见editMethod属性说明。
removeMethod false   参见editMethod属性说明。
callMethod false   参见editMethod属性说明。
此标签的运用场合
如果开发者在后台处理某事务,要用到action的name元素值,它是formBean保存到scope中的键名, 还用到formBean包含的记录集的某条记录的序号或关键字值之类的参数。开发者为了得到这些值最简单有效的方法 就是利用newxy(新坐标)标签如,,这时就需要用到此标签, 而由按钮产生的事件调用此标签产生的脚本方法, 可以方便的将参数送到后台交由开发者定义的类方法来处理。
13.4.6. 标签
1.标签需结合标签一同使用,是为标签传递转发条件。
2.标签以parameter为名得到参数值,保存到request中,供子标签引用。如果parameter为空或以其为名的参数值为空,标签会以name、property、scope属性值来得到一值,保存到request中, 如果得到的值为空,子标签将被忽略。
3.标签用于转发,根据标签保存在request的值的不同,转发到不同的页面。
属性 request default 意义
name false   scope范围内保存bean的键名。
property false   bean的属性名。
scope false session bean保存的范围,默认为session。
parameter false   客户端传来的参数名。
13.4.7. 标签
1.标签需放在标签中,否则会报告错误。
2.标签用于转发,根据标签保存在request的值的不同,转发到不同的页面。
属性 request default 意义
test false   test的值是转发条件,与标签保存在request的值进行比较。如果相等,以path值为转发路径。如果test值为空,以path值为路径转发。
path true   path是转发路径,且是相对路径,相对于上下文。path的值不能包含上下文。
举例:
假设rights是保存了用户权限的bean,如果display属性值为yes,转发到"/display.jsp",display属性值为no,转发到"/noRight.jsp",如果display属性值不空,且为其它值,转发到"/list.jsp"。如果display属性值为空,不转发,三个标签被忽略。
14. 事务和并行(Transactions And Concurrency)
newxy(新坐标)的事务交由底层的数据库连接管理(在未来版本中,如果数据库连接有JTA的支持,那么在newxy(新坐标)事务中进行的操作将是整个原子性JTA事务的一部分)。
一个Transaction实例除有一个主线程外,还有一个专门负责超时回滚任务的线程。主线程负责对一批需要一次性完成的单元进行操作。如果在设定或默认的时间内主线程一批操作尚未完成,负责超时回滚任务的线程就会干预,回滚事务。
newxy(新坐标)使用起来很方便,只需在调用IFacade接口方法前调用事务实例的方法call(IFacade ifacade), 或call(IFacade ifacade,int transactionIsolation)如 tran.call(ifacade).update(dto); newxy(新坐标)事务运用举例:
设有数据库有两表:/*客户表*/create table customers (id int primary key,name VARCHAR(255))/*订单表*/create table orders (id int primary key,customer_id int,date TIMESTAMP) 运用一
//新建一名叫“张五”的客户,新建一与此用户关联的定单,订单表字段customer_id是“张五”客户的id号, //id号由系统自动生成。 package common; import net.newxy.dbm.*; import org.apache.commons.beanutils.DynaBean; public class Test{ public static void main(String[] args) { TestSqlServerDao dao1=new TestSqlServerDao(); DynaDto customerDto=new DynaDto(); customerDto.setValue("_table","customers"); customerDto.set("name","张五"); DynaDto ordersDto=new DynaDto(); ordersDto.setValue("_table","orders"); ordersDto.set("date",net.newxy.util.DateTools.todayInTs()); Transaction tran=new Transaction(); try{ tran.begin(); Object result1=tran.call(dao1).update(customerDto); if(result1!=null){ // result不等于空,表明是插入操作,且result中包含了自动生成的主关键字值。 ordersDto.set("customer_id",((DynaBean)result1).get("id")); }else{ // result为空,表明是update操作,客户id保存在customerDto中。 // 此例因为没有给customerDto设置id,因而肯定是自动获得id值后作插入操作, // result肯定不为空。 ordersDto.set("customer_id",customerDto.get("id")); } tran.call(dao1).update(ordersDto); tran.commit(); }catch(Exception e2){ try { tran.rollback(); } catch (Exception ex) { } System.out.println(e2.getMessage()); } } } //dao类TestSqlServerDao package common; import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException; import net.newxy.dbm.BaseDAO; public class TestSqlServerDao extends BaseDAO{ public TestSqlServerDao(){ super(); } public Connection getConnection(String dsJndi) throws Exception { Connection cn=null; try { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://localhost:1433; SendStringParametersAsUnicode=false","webUser","myPass"); } catch (ClassNotFoundException ex) { } catch (IllegalAccessException ex) { } catch (InstantiationException ex) { } catch (SQLException ex1) { throw new Exception(ex1.getMessage()); } return cn; } } 运用二
//默认的60秒后,负责超时回滚任务的线程将检查事务是否已完成,如果没完成,回滚事务。 //设置超时时间的方法是: Transaction tran=new Transaction(); tran.setTransactionTimeout(10); try{ tran.begin(); ...... tran.commit(); }catch(Exception e2){ try { tran.rollback(); } catch (Exception ex) { } System.out.println(e2.getMessage()); } 运用三
//设置事务隔离等级: Transaction tran=new Transaction(); tran.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_UNCOMMITTED); try{ tran.begin(); ...... tran.commit(); }catch(Exception e2){ try { tran.rollback(); } catch (Exception ex) { } System.out.println(e2.getMessage()); } 运用四
// 事务同时对多个数据库操作。方法是,如同dao类TestSqlServerDao,再建另一dao类Dao2, // Dao2实现的getConnection(String dsJndi)方法获得另一数据库连接。 TestSqlServerDao dao1=new TestSqlServerDao(); Dao2 dao2=new Dao2(); Transaction tran=new Transaction(); try{ tran.begin(); ...... tran.call(dao1,).update(...); tran.call(dao2).remove(...); ...... tran.commit(); }catch(Exception e2){ try { tran.rollback(); } catch (Exception ex) { } System.out.println(e2.getMessage()); } 运用五
//事务中开发者自己要直接运用数据库连接,但开发者不能在事务中关闭数据库连接。 TestSqlServerDao dao1=new TestSqlServerDao(); Transaction tran=new Transaction(); try{ tran.begin(); ...... Connection con=tran.call(dao1).getConnection(); ...... tran.commit(); }catch(Exception e2){ try { tran.rollback(); } catch (Exception ex) { } System.out.println(e2.getMessage()); } 运用六
// 事务同时对多个数据库操作,且不同数据库要求不同的隔离等级, TestSqlServerDao dao1=new TestSqlServerDao(); Dao2 dao2=new Dao2(); Transaction tran=new Transaction(); try{ tran.begin(); ...... tran.call(dao1,java.sql.Connection.TRANSACTION_READ_UNCOMMITTED).update(...); tran.call(dao2,java.sql.Connection.TRANSACTION_NONE)).remove(...); ...... tran.commit(); }catch(Exception e2){ try { tran.rollback(); } catch (Exception ex) { } System.out.println(e2.getMessage()); }
15. 重要实践
15.1. 文件上传至文件夹
下面是文件上传至文件夹的jsp页面。不需后台。
<%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%><%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%>文件上传至文件夹文件夹:
不大于1024K:
不大于1024K:
_directory为保留属性,其值是保存文件的文件夹,可以是绝对路径,也可以是URI,如:"c:\temp"、"files/myfiles",或"/files/myfiles";
本例可同时上传二个文件,上传文件不大于1024K。理论上同时上传文件数量不限,上传成功与否可同时提示给用户。
15.2. 文件上传至数据库
下面是文件上传至数据库的jsp页面。不需后台。
<%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%><%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%>文件上传至数据库数据库表名:
说明:
不大于1024K:
不大于1024K:
说明: _table为保留属性,其值是数据库表名。
本例可同时上传二个文件,上传文件不大于1024K。理论上同时上传文件数量不限,上传成功与否会提示给用户。
newxy(新坐标)实现文件上传至数据库,可以同时保存文件名、文件类型、大小、扩展名等信息。标签详解 文件名: 上传的文件名保存到某字段中,保存文件名的字段名由标签fileNameField元素值指定。
文件大小: 上传的文件大小保存到某字段中,保存文件大小的字段名由标签fileSizeField元素值指定。本例上传文件不大于 1024K
文件类型: 上传的文件类型保存到某字段中,保存文件类型的字段名由标签fileTypeField元素值指定。
文件扩展名: 上传的文件扩展名保存到某字段中,保存文件扩展名的字段名由标签fileExtendNameField元素值指定。
限制类型: 上传文件的限制类型由标签fileLimit元素值指定。如fileLimit="jsp",只能上传jsp文件。本例不限制。
数据库连接
为保证标签能得到数据库连接,系统应有如下设置之一:
1.web.xml文件中有数据源设置: jdbc/default javax.sql.DataSource Container 2.web.xml文件数据源设置的res-ref-name不是jdbc/default,假设是jdbc/xxx,需在WEB-INF/classes/newxy.properties文件中加入一行:
ds.default=jdbc/xxx
3.web.xml中没有数据源设置,需在WEB-INF/classes/newxy.properties文件中加入四行(假设是mysql数据库): driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/myDatabase user=root pass=mysql 4.以上设置都没有,可用写代码方式获得数据库连接。见5.3. 通过编程方式获取数据库连接,如果开发者的DAO类是common.DefaultDao,需在WEB-INF/classes/newxy.properties文件中加入一行:
dao.default=common.DefaultDao //DAO类:common.DefaultDao package common; import net.newxy.dbm.DBM; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DefaultDao extends DBM{ public Connection getConnection(String dsJndi) throws Exception { Connection cn=null; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); cn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/myDatabase?user=root&password=mysql"); } catch (ClassNotFoundException ex) { } catch (IllegalAccessException ex) { } catch (InstantiationException ex) { } catch (SQLException ex1) { throw new Exception(ex1.getMessage()); } return cn; } }
15.3. 文件上传至文件夹与上传至数据库的比较
文件上传至文件夹与上传至数据库有两点不同:
上传至文件夹,在标签
中应放入
上传至数据库,在标签
中应放入
上传至文件夹,标签的method="upload";上传到数据库标签的method="update"
上传至数据库时,标签的property值是保存文件内容的字段名。
上传到文件来,标签的property值无意义,但上传多个文件时,其值应不相同。