posts - 193,  comments - 520,  trackbacks - 0
 
     摘要: 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)编辑 收藏
仅列出标题
共39页: First 上一页 31 32 33 34 35 36 37 38 39 下一页 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

关注工作流和企业业务流程改进。现就职于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

常用链接

留言簿(38)

随笔分类

随笔档案

文章分类

文章档案

常去的网站

搜索

  •  

最新评论

阅读排行榜

评论排行榜