摘要: ibatis DAO 框架提供了事务管理模块。而这个事务管理可以应用到很多场合,包括JDBC、Hibernate、JTA、SQLMAP等。下面以最简单的JDBC来分析一下其如何实现事务管理。首先来看一段代码:
public class OrderService { private DaoManager daoManager;...
阅读全文
posted @
2006-01-20 17:50 ronghao 阅读(7206) |
评论 (6) |
编辑 收藏
一、执行期根据方法的名称来执行方法下面的示例演示了这一操作:
import java.lang.reflect.*;
public class method2 {
public int add(int a, int b) {
return a + b;
}
public static void main(String args[]) {
try {
Class cls = Class.forName("method2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod("add", partypes);
method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
System.out.println(retval.intvalue());
} catch (Throwable e) {
System.err.println(e);
}
}
}
注:上面划线的粗体字最好用Object methobj = cls.newInstance();来代替,原因很明显如果这个类及方法事先都是清楚的也不需要用reflection了
假如一个程序在执行的某处的时候才知道需要执行某个方法,这个方法的名称是在程序的运行过程中指定的 (例如,JavaBean 开发环境中就会做这样的事),那么上面的程序演示了如何做到。上例中,getMethod 用于查找一个具有两个整型参数且名为 add 的方法。找到该方法并创建了相应的 Method 对象之后,在正确的对象实例中执行它。执行该方法的时候,需要提供一个参数列表,这在上例中是分别包装了整数 37 和 47 的两个 Integer 对象。执行方法的返回的同样是一个 Integer 对象,它封装了返回值 84。
二、执行期创建新的对象
对于构造器,则不能像执行方法那样进行,因为执行一个构造器就意味着创建了一个新的对象 (准确的说,创建一个对象的过程包括分配内存和构造对象)。所以,与上例最相似的例子如下:
import java.lang.reflect.*;
public class constructor2 {
public constructor2() {
}
public constructor2(int a, int b) {
System.out.println("a = " + a + " b = " + b);
}
public static void main(String args[]) {
try {
Class cls = Class.forName("constructor2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct = cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);
} catch (Throwable e) {
System.err.println(e);
}
}
}
三、改变字段(域)的值
reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它,下面的例子可以说明这一点:
import java.lang.reflect.*;
public class field2 {
public double d;
public static void main(String args[]) {
try {
Class cls = Class.forName("field2");
Field fld = cls.getField("d");
field2 f2obj = new field2();
System.out.println("d = " + f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
} catch (Throwable e) {
System.err.println(e);
}
}
} 这个例子中,字段 d 的值被变为了 12.34。
实际开发时用Common BeanUtils
posted @
2006-01-17 17:41 ronghao 阅读(575) |
评论 (0) |
编辑 收藏
其实很早就有这个愿望了,只是一直没有实施。在买笔记本还是自己配台式机的问题上一直拿不定主意。去年十一的时候就打算买了,朋友说,你一天上班要接受电脑9、10个小时的辐射,下班回来还要接着辐射啊。去年一年的工作,给我印象最深的恐怕就是:学到很多东西,但大部分都未能实际实施。想一想,报表、搜索引擎、工作流、邮件、lunix、css、webservice自己都有做过。工作中交给你一个未实现过的功能实现,google-->开源项目-->读它的英文文档-->跑出第一个demo-->应用到自己的模块中-->研究它的源码,这个过程是一个很惬意的事情。但问题是不能深入。懂点皮毛根本没什么用!呵呵,用公司的电脑学自己想学的东西根本就没那个时间。
买台电脑,多写代码,多钻研点东西,这就是今年的愿望。
posted @
2006-01-05 17:39 ronghao 阅读(406) |
评论 (1) |
编辑 收藏
项目终于上线运行了,但是还是问题多多,但还好都不是涉及到逻辑的大问题。这两天把数据备份这块重做了一下,原先是自己写的一个线程池,功能其实就是每天对mysql进行备份(当初设计为什么会把这个功能放到程序里实现??)。这完全是重复的造轮子!开始是用Jrontab重构了下,后来讨论后决定在程序里把这项功能删除,改在Linux里写个备份脚本。每天的晚上12点进行备份,然后本机一份,ftp到另一台服务器一份。有段时间没操作Linux了,结果好多命令都忘了,寒!为什么会重复的造轮子??
posted @
2005-12-28 18:19 ronghao 阅读(816) |
评论 (4) |
编辑 收藏
在数据库里新建两个表
A、用户表
create table users (user_name varchar(20) not null,
user_pass varchar(20) not null,
PRIMARY KEY (user_name)) ;
B、用户与角色关联表
create table user_roles (user_name varchar(20) not null,
role_name varchar(20) not null,
PRIMARY KEY (user_name)) ;
C、插入数据
insert into users values('user1', 'password');
insert into user_roles values('user1', 'manager');
在tomcat的server.xml里加入描述
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/databaseName"
connectionName=yourname connectionPassword=yourpassword
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
在自己应用程序的web.xml里加入描述(基于表单)
<security-constraint>
<web-resource-collection>
<web-resource-name>My Test</web-resource-name>
<url-pattern>/get.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name> //能够访问的角色,可以多个
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>My Test</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/fail_login.html</form-error-page> //认证失败后跳转的页面
</form-login-config>
</login-config>
登录表单必须包含输入用户姓名和口令的字段,它们必须被分别命名为j_username和j_password,表单将这二个值发送给j_security_check逻辑名字。
下面是一个该表单如何在HTML网页中实现的例子:
<form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password">
<input type="submit" value="确定"/>
</form>
这样当对get.jsp进行访问时,tomcat就会自动转到login.jsp页面实现认证。对于简单的认证,小型系统,采用Tomcat实现容器内认证是方便的。
posted @
2005-12-28 14:00 ronghao 阅读(1406) |
评论 (3) |
编辑 收藏