摘要: ibatis DAO 框架提供了事務管理模塊。而這個事務管理可以應用到很多場合,包括JDBC、Hibernate、JTA、SQLMAP等。下面以最簡單的JDBC來分析一下其如何實現事務管理。首先來看一段代碼:
public class OrderService { private DaoManager daoManager;...
閱讀全文
posted @
2006-01-20 17:50 ronghao 閱讀(7219) |
評論 (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 閱讀(583) |
評論 (0) |
編輯 收藏
其實很早就有這個愿望了,只是一直沒有實施。在買筆記本還是自己配臺式機的問題上一直拿不定主意。去年十一的時候就打算買了,朋友說,你一天上班要接受電腦9、10個小時的輻射,下班回來還要接著輻射啊。去年一年的工作,給我印象最深的恐怕就是:學到很多東西,但大部分都未能實際實施。想一想,報表、搜索引擎、工作流、郵件、lunix、css、webservice自己都有做過。工作中交給你一個未實現過的功能實現,google-->開源項目-->讀它的英文文檔-->跑出第一個demo-->應用到自己的模塊中-->研究它的源碼,這個過程是一個很愜意的事情。但問題是不能深入。懂點皮毛根本沒什么用!呵呵,用公司的電腦學自己想學的東西根本就沒那個時間。
買臺電腦,多寫代碼,多鉆研點東西,這就是今年的愿望。
posted @
2006-01-05 17:39 ronghao 閱讀(415) |
評論 (1) |
編輯 收藏
項目終于上線運行了,但是還是問題多多,但還好都不是涉及到邏輯的大問題。這兩天把數據備份這塊重做了一下,原先是自己寫的一個線程池,功能其實就是每天對mysql進行備份(當初設計為什么會把這個功能放到程序里實現??)。這完全是重復的造輪子!開始是用Jrontab重構了下,后來討論后決定在程序里把這項功能刪除,改在Linux里寫個備份腳本。每天的晚上12點進行備份,然后本機一份,ftp到另一臺服務器一份。有段時間沒操作Linux了,結果好多命令都忘了,寒!為什么會重復的造輪子??
posted @
2005-12-28 18:19 ronghao 閱讀(824) |
評論 (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 閱讀(1412) |
評論 (3) |
編輯 收藏