<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    怎么解析一個(gè)xml字符串?我不是第一次看到有人問(wèn)這個(gè)問(wèn)題了..汗

    1.使用StringReader

    ?

    Document?doc? = ?builder.parse(? new ?java.io.StringReader(str));?

    2.使用DocumentHelper.parseText()

    String?text? = ? " <person>?<name>James</name>?</person> " ;?
    Document?document?
    = ?DocumentHelper.parseText(text);?

    3.最苯的方法:

    ?

    Document?doc?? = ??builder.parse(? new ??ByteArrayInputStream(str.getBytes()));?

    posted @ 2007-02-06 12:39 dennis 閱讀(469) | 評(píng)論 (0)編輯 收藏

    工作中還是一直使用jdk1.4.2版本,JDK5出來(lái)這么久也只是偶爾玩玩,特別是在學(xué)習(xí)EJB3時(shí)好好體驗(yàn)了一把Annotation的便利.

    枚舉類型也是JDK5引入的新的特性,看了幾篇文章,還是蠻有趣的.

    過(guò)去我們定義常量,都是在一個(gè)專門(mén)的類或者接口中定義一大堆靜態(tài)常量類型,比如衣服的尺寸:

    ?

    public ? class ?Size {

    ??
    public ? static ? final ?String?S = " S " ;

    ??
    public ? static ? final ?String?M = " M " ;

    ??
    public ? static ? final ?String?L = " L " ;

    ??
    public ? static ? final ?String?XX = " XX " ;

    ??

    }

    ?

    然后這樣調(diào)用:Size.X,Size.M...

    現(xiàn)在引入了枚舉類型,我們可以這樣定義:

    ?

    public ? enum ?Size? {

    ??S,M,L,XX,XXX,XXXL;

    }

    ?

    調(diào)用的方式不變,如:Size.S,Size.M...如果僅僅這樣的好處,好象還沒(méi)什么理由讓我們體驗(yàn)到便利的一面,OK,讓我們談?wù)別num的特性.

    1.排序,枚舉類型默認(rèn)按照原始排列的各個(gè)值元素的順序?yàn)橐罁?jù),比如上面的例子:S<M<L<XX<XXX<XXL.默認(rèn)提供compareTo()方法來(lái)比較:

    ?

    Size.S.compareTo(Size.M);?? // 結(jié)果為-1

    ?

    2.通過(guò)values()來(lái)列舉所有的值,比如:

    ?

    ??? for (Size?s:Size.values()) {

    ??????System.out.println(s);

    ???}

    ?

    此例用到了JDK5的新特性,簡(jiǎn)化的for循環(huán)

    3.枚舉類型的集合:J2SE5提供了EnumMap<K extends Enum<K>,V>和EnumSet<E extends Enum<E>)兩個(gè)枚舉類型的集合類型,以map為例子:

    ?

    EnumMap(Size,String)?map = new ?EnumMap(Size,String > (Size. class );

    map.put(Size.S,
    " 適合身高55-160的人 " );

    map.put(Size.M,
    " 適合身高160-165的人 " );

    map.put(Size.L,
    " 適合身高165-170的人 " );

    ?

    ...

    4.給枚舉類型增加方法:枚舉類型可以像類那樣添加方法,假設(shè)大家在挑衣服的時(shí)候,常常不關(guān)心現(xiàn)在試的衣服的尺碼多少,而是簡(jiǎn)單地獲取比當(dāng)前的大一個(gè)級(jí)別的尺碼,我們給Size增加一個(gè)increase()方法:

    ?

    ? public ?Size?increase()? {
    ???Size?sizes[]?
    = ? this .values();
    ???
    int ?pos? = ? this .ordinal();
    ???
    if ?(pos? < ?sizes.length? - ? 1 )
    ????pos
    ++ ;
    ???
    return ?sizes[pos];
    ?}

    ?

    通過(guò)ordinal()方法找到當(dāng)前的Size對(duì)象的值在整個(gè)Size值域中的位置,判斷位置是否是最大值,如果不是就再增長(zhǎng)一個(gè)級(jí)別返回.

    問(wèn)題來(lái)了,如果我們希望Size的每個(gè)值都有一個(gè)test方法返回消息,而且消息都不一樣.那我們?cè)撊绾翁幚?當(dāng)然,我們可以像上面這樣:

    public String test(){ ..}

    可以我們想實(shí)現(xiàn)更個(gè)性化的消息,比如"你好矮!...","你好胖..","你太高了吧!!!!"等等之類.首先我們給Size定義一個(gè)抽象方法:

    ?

    abstract ?String?test();

    ?

    然后就簡(jiǎn)單了,每個(gè)值都實(shí)現(xiàn)自己的test方法:

    ?

    S? {
    ??String?test()?
    {
    ???
    return ? " 號(hào)碼:S,很不厚道地說(shuō),你很矮 " ;
    ??}

    ?}
    ,

    M?
    {
    ??String?test()?
    {
    ???
    return ? " 號(hào)碼:M,如果你是MM,身高正合適 " ;
    ??}

    ?}
    ,

    L?
    {
    ??String?test()?
    {
    ???
    return ? " 號(hào)碼:L,帥哥,電話號(hào)碼多少 " ;
    ??}

    ?}
    ,

    XX?
    {
    ??String?test()?
    {
    ???
    return ? " 號(hào)碼:XX.MM,三圍不錯(cuò)..別打我!!! " ;
    ??}

    ?}
    ,

    ?

    ?....

    漂亮吧,枚舉類型實(shí)在是個(gè)有趣的東東,當(dāng)俺公司全面轉(zhuǎn)向J2SE5的時(shí)候可以好好玩一把

    ??

    posted @ 2007-02-06 12:37 dennis 閱讀(610) | 評(píng)論 (0)編輯 收藏

    常用的幾個(gè):

    ^[_/.0-9a-z-]+@([0-9a-z][0-9a-z-]+/.)+[a-z]{2,3}$

    ^[_a-z0-9-]+(/.[_a-z0-9-]+)*@[a-z0-9-]+(/.[a-z0-9-]+)*$

    ^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*[0-9a-zA-Z]+))@([a-zA-Z0-9-]+[.])+([a-zA-Z]{2}|net|com|gov|mil|org|edu|int)$

    ^([a-z0-9A-Z]+[-|//.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?//.)+[a-zA-Z]{2,}$

    /w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*

    在JAVA中使用:

    ?

    import java.sql.*;
    import java.io.*;
    import java.util.regex.*;

    public class test{
    ?public static void main(String[] args){
    ??try{
    ???String s = "";
    ???while(!s.equals("q")){
    ????System.out.print("input:");
    ????DataInputStream in = new DataInputStream(new BufferedInputStream(System.in));
    ????s = in.readLine();
    ????System.out.println("your input is :"+s);
    ????String check = "^([a-z0-9A-Z]+[-|//.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?//.)+[a-zA-Z]{2,}$";
    ????Pattern regex = Pattern.compile(check);
    ??????????????? Matcher matcher = regex.matcher(s);
    ??????????????? boolean isMatched = matcher.matches();
    ??????????????? if(isMatched){
    ??????????????? ?System.out.println("it's a email");
    ??????????? ?}else{
    ??????????? ??System.out.println("it's not a email");
    ??????????? ?}?
    ????
    ???}
    ??????? }catch(Exception e){
    ??????? ?System.out.println("error"+e.getMessage());
    ??? ?}
    ?}?????????

    posted @ 2007-02-06 12:33 dennis 閱讀(3926) | 評(píng)論 (2)編輯 收藏

    花了兩天時(shí)間,終于把jasperreport與項(xiàng)目中使用的hibernate結(jié)合使用.最新版本的ireport支持HQL查詢,可以在 ireport里面寫(xiě)HQL語(yǔ)句查詢并設(shè)計(jì)好報(bào)表.需要注意的是把hibernate.cfg.xml包括進(jìn)classpath!!(菜單options ->classpath進(jìn)行設(shè)置)給張圖:

    test2.jpg

    設(shè)計(jì)好報(bào)表之后編譯成jasper文件,在servlet中調(diào)用,我們需要實(shí)現(xiàn)自己的hibernate datasource:

    public class HibernateQueryResultDataSource implements JRDataSource {

    ?private String[] fields;

    ?private Iterator iterator;

    ?private Object currentValue;

    ?public HibernateQueryResultDataSource(List list, String[] fields) {
    ??this.fields = fields;
    ??this.iterator = list.iterator();
    ?}

    ?public Object getFieldValue(JRField field) throws JRException {
    ??Object value = null;
    ??int index = getFieldIndex(field.getName());
    ??if (index > -1) {
    ???Object[] values = (Object[]) currentValue;
    ???value = values[index];
    ??}
    ??return value;
    ?}

    ?public boolean next() throws JRException {
    ??currentValue = iterator.hasNext() ? iterator.next() : null;
    ??return (currentValue != null);
    ?}

    ?private int getFieldIndex(String field) {
    ??int index = -1;
    ??for (int i = 0; i < fields.length; i++) {
    ???if (fields[i].equals(field)) {
    ????index = i;
    ????break;
    ???}
    ??}
    ??return index;
    ?}

    }

    此類構(gòu)造函數(shù)需要兩個(gè)參數(shù),查詢結(jié)果的list以及查詢的所有屬性名(這些屬性名必須和報(bào)表界面的field名一致)

    ,使用方式如下:

    1.導(dǎo)出pdf:

    File reportFile = new File(getServletContext().getRealPath(
    ????"/reports/" + queryResult.getReportFileName() + ".jasper"));

    ??HibernateQueryResultDataSource dataSource = new HibernateQueryResultDataSource(
    ????queryResult.getList(parameters), queryResult.getFields());
    ??if (reportType.equals("pdf") || reportType.equals("")) {
    ???try {
    ????byte[] bytes = JasperRunManager.runReportToPdf(reportFile
    ??????.getPath(), null, dataSource);
    ????response.setContentType("application/pdf");
    ????response.setContentLength(bytes.length);
    ????ServletOutputStream ouputStream = response.getOutputStream();
    ????ouputStream.write(bytes, 0, bytes.length);
    ????ouputStream.flush();
    ????ouputStream.close();

    ???} catch (Exception e) {
    ????e.printStackTrace();
    ???}
    ??}

    2.導(dǎo)出excel,需要把poi-2.0-final-20040126.jar放進(jìn)web的lib里:

    try {

    ????JasperPrint print = JasperFillManager.fillReport(
    ??????new FileInputStream(reportFile), null, dataSource);
    ????// JRXlsExporter t=null;
    ????JRXlsExporter jRXlsExporter = new JRXlsExporter();
    ????ByteArrayOutputStream xlsReport = new ByteArrayOutputStream();
    ????jRXlsExporter.setParameter(JRExporterParameter.JASPER_PRINT,
    ??????print);
    ????jRXlsExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
    ??????xlsReport);
    ????jRXlsExporter
    ??????.setParameter(
    ????????JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
    ????????Boolean.TRUE);
    ????jRXlsExporter.setParameter(
    ??????JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,
    ??????Boolean.TRUE);
    ????// jRXlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,ReportsConstants.bankDetailsHtml);

    ????// jRXlsExporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
    ????// Boolean.TRUE);

    ????jRXlsExporter.exportReport();
    ????byte[] bytes = xlsReport.toByteArray();

    ???
    ????response.setContentType("application/vnd.ms-excel");
    ????response.setContentLength(bytes.length);
    ????xlsReport.close();
    ????OutputStream ouputStream = response.getOutputStream();
    ????ouputStream.write(bytes, 0, bytes.length);
    ????ouputStream.flush();
    ????ouputStream.close();

    ???} catch (Exception e) {
    ????e.printStackTrace();
    ???}

    posted @ 2007-02-06 12:31 dennis 閱讀(3113) | 評(píng)論 (1)編輯 收藏

    沒(méi)辦法直接設(shè)置可以采用變通手段來(lái)做:新建一個(gè)分組,組表達(dá)式寫(xiě)成new Integer($V{COLUMN_COUNT}.intValue()/?),?號(hào)用你所需要的數(shù)字來(lái)代替,代表每頁(yè)記錄數(shù)

    posted @ 2007-02-06 12:30 dennis 閱讀(656) | 評(píng)論 (0)編輯 收藏

    ?項(xiàng)目已經(jīng)上線,昨天客戶發(fā)現(xiàn)一個(gè)問(wèn)題,某個(gè)操作取消不了,查看一下log,系統(tǒng)是websphere5.x,發(fā)現(xiàn)以下的異常:

    E WLTC0033E: 在清除未解析 LocalTransactionContainment 時(shí),資源 jdbc/oa回滾。
    [07-1-15 17:37:09:280 CST] 57961377 LocalTranCoor E WLTC0032E: 一個(gè)或多個(gè)資源回滾。一個(gè)未解析的 LocalTransactionContainment 有一個(gè)未解析的回滾操作。
    [07-1-15 17:37:09:280 CST] 57961377 WebAppTransac E WTRN0043I: 由于 setRollbackOnly,本地事務(wù)回滾。
    [07-1-15 17:37:09:296 CST] 57961377 WebGroup????? E SRVE0026E: [Servlet 錯(cuò)誤]-[LocalTransaction rolled-back due to setRollbackOnly]:com.ibm.ws.LocalTransaction.RolledbackException
    ??? at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.cleanup(LocalTranCoordImpl.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.webapp.WebAppTransactionCollaborator.postInvoke(WebAppTransactionCollaborator.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.cache.invocation.CacheableInvocationContext.invoke(CacheableInvocationContext.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java(Compiled Code))
    ??? at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(Compiled Code))
    ??? at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(Compiled Code))
    ??? at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code))
    ??? at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))



    查了下代碼,一開(kāi)始沒(méi)發(fā)現(xiàn)有什么問(wèn)題,不過(guò)是4,5個(gè)增刪操作(兩張表以上)。把錯(cuò)誤信息輸入google搜索,挺多人碰到這個(gè)錯(cuò)誤,有的說(shuō)是websphere的bug,有的說(shuō)要把AutoCommit設(shè)置為true.
    websphere的事務(wù)處理確實(shí)有bug,不過(guò)我們已經(jīng)打過(guò)補(bǔ)丁,把AutoCommit設(shè)置為true的話,與我們所需要的效果不同,畢竟需要這些操作在同一個(gè)事務(wù)內(nèi)。昨天查了一個(gè)晚上沒(méi)找到原因,今天一段一段地調(diào)試代碼,讓我發(fā)現(xiàn)問(wèn)題了:
    conn = ConnectionManager.getConnection();
    conn.setAutoCommit(false);
    在conn.commit()前,我進(jìn)行了一個(gè)判斷:

    if(....){
    ? return;
    }
    conn.commit

    直接return,導(dǎo)致后面的conn.commit()沒(méi)有執(zhí)行,事務(wù)不完整。修改成:
    if(....){
    ? ...
    ? conn.commit();
    ? return;
    }

    所以這個(gè)異常的出現(xiàn),很有可能是你的事務(wù)處理有問(wèn)題,那條教訓(xùn)還是很有用的:一個(gè)方法最好不要有多個(gè)return語(yǔ)句。

    posted @ 2007-02-06 12:27 dennis 閱讀(1275) | 評(píng)論 (0)編輯 收藏

    ?這篇文章的想法來(lái)自于過(guò)去的兩篇文章:《設(shè)計(jì)自己的MVC框架》《設(shè)計(jì)模式之事務(wù)處理》
    鏈接:
    http://www.javaresearch.org/article/59935.htm
    http://www.javaresearch.org/article/59043.htm


    代碼下載同樣在www.126.com的郵箱里,用戶名 sharesources 密碼 javafans

    ??? 本文只是學(xué)習(xí)性質(zhì)的文章,我一開(kāi)始的想法就是修改《設(shè)計(jì)模式之事務(wù)處理》,提供Annotation來(lái)提供事務(wù)支持,支持到方法級(jí)別。通過(guò)引入一個(gè) @Transaction標(biāo)注,如果被此標(biāo)注的方法將自動(dòng)享受事務(wù)處理。目的是學(xué)習(xí)下Annotation和加深下對(duì)聲明式事務(wù)處理的理解。

    ??? Annotation是JDK5引入的新特性,現(xiàn)在越來(lái)越多的框架采用此特性來(lái)代替煩瑣的xml配置文件,比如hibernate,ejb3, spring等。對(duì)Annotation不了解,請(qǐng)閱讀IBM網(wǎng)站上的文章,還有推薦javaeye的Annotation專欄:http: //www.javaeye.com/subject/Annotation

    ??? 代碼的示例是一個(gè)簡(jiǎn)單的用戶管理例子。

    ??? 首先,環(huán)境是mysql+jdk5+myeclipse5+tomcat5,在mysql中建立一張表adminusers:
    ??? create table adminusers(id int(10) auto_increment not null primary key,
    ???? name varchar(10) not null,
    ???? password varchar(10) not null,
    ???? user_type varchar(10));
    ??? 然后在tomcat下建立一個(gè)數(shù)據(jù)源,把代碼中的strutslet.xml拷貝到tomcat安裝目錄下的 /conf/Catalina/localhost目錄里,請(qǐng)自行修改文件中的數(shù)據(jù)庫(kù)用戶名和密碼,以及數(shù)據(jù)庫(kù)名稱。另外,把mysql的 jdbc驅(qū)動(dòng)拷貝到tomcat安裝目錄下的common/lib目錄。這樣數(shù)據(jù)源就建好了。在web.xml中引用:

    ?? <resource-ref>
    ??? ??? <description>DB Connection</description>
    ??? ??? <res-ref-name>jdbc/test</res-ref-name>
    ??? ??? <res-type>javax.sql.DataSource</res-type>
    ??? ??? <res-auth>Container</res-auth>
    ??? </resource-ref>
    ???
    ??? 我的例子只是在《設(shè)計(jì)模式之事務(wù)處理》的基礎(chǔ)上改造的,在那篇文章里,我講解了自己對(duì)聲明式事務(wù)處理的理解,并利用動(dòng)態(tài)代理實(shí)現(xiàn)了一個(gè) TransactionWrapper(事務(wù)包裝器),通過(guò)業(yè)務(wù)代理工廠提供兩種版本的業(yè)務(wù)對(duì)象:經(jīng)過(guò)事務(wù)包裝的和未經(jīng)過(guò)事務(wù)包裝的。我們?cè)谀J(rèn)情況下包裝業(yè)務(wù)對(duì)象中的所有方法,但實(shí)際情況是,業(yè)務(wù)對(duì)象中的很多方法不用跟數(shù)據(jù)庫(kù)打交道,它們根本不需要包裝在一個(gè)事務(wù)上下文中,這就引出了,我們?yōu)槭裁床惶峁┮环N方式來(lái)配置哪些方法需要事務(wù)控制而哪些并不需要?甚至提供事務(wù)隔離級(jí)別的聲明?很自然的想法就是提供一個(gè)配置文件,類似spring式的事務(wù)聲明。既然JDK5已經(jīng)引入Annotation,相比于配置文件的煩瑣和容易出錯(cuò),我們定義一個(gè)@Transaction的annotation來(lái)提供此功能。

    ??? 看下Transaction.java的代碼:
    ??? package com.strutslet.db;

    ??? import java.lang.annotation.Documented;
    ??? import java.lang.annotation.ElementType;
    ??? import java.lang.annotation.Retention;
    ??? import java.lang.annotation.RetentionPolicy;
    ??? import java.lang.annotation.Target;
    ??? import java.sql.Connection;

    ??? @Target(ElementType.METHOD)
    ??? @Retention(RetentionPolicy.RUNTIME)
    ??? @Documented
    ??? public @interface Transaction {
    ?? ? ? //事務(wù)隔離級(jí)別,默認(rèn)為read_committed
    ?????? public int level() default Connection.TRANSACTION_READ_COMMITTED??? ;
    ??? }

    @Transaction 標(biāo)注只有一個(gè)屬性level,level表示事務(wù)的隔離級(jí)別,默認(rèn)為Read_Committed(也是一般JDBC驅(qū)動(dòng)的默認(rèn)級(jí)別,JDBC驅(qū)動(dòng)默認(rèn)級(jí)別一般于數(shù)據(jù)庫(kù)的隔離級(jí)別一致)。 @Target(ElementType.METHOD)表示此標(biāo)注作用于方法級(jí)別, @Retention(RetentionPolicy.RUNTIME)表示在運(yùn)行時(shí),此標(biāo)注的信息將被加載進(jìn)JVM并可以通過(guò)Annotation的 API讀取。我們?cè)谶\(yùn)行時(shí)讀取Annotation的信息,根據(jù)隔離級(jí)別和被標(biāo)注的方法名決定是否將業(yè)務(wù)對(duì)象的方法加進(jìn)事務(wù)控制。我們只要稍微修改下 TransactionWrapper:

    //TransactionWrapper.java
    package com.strutslet.db;

    import java.lang.annotation.Annotation;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.sql.Connection;
    import java.sql.SQLException;

    import com.strutslet.exception.SystemException;

    public class TransactionWrapper {

    ???
    ??? public static Object decorate(Object delegate) {
    ??? ??? return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    ??? ??? ??? ??? delegate.getClass().getInterfaces(), new XAWrapperHandler(
    ??? ??? ??? ??? ??? ??? delegate));
    ??? }

    ??? static final class XAWrapperHandler implements InvocationHandler {
    ??? ??? private final Object delegate;

    ??? ??? XAWrapperHandler(Object delegate) {
    ??? ??? ??? // Cache the wrapped delegate, so we can pass method invocations
    ??? ??? ??? // to it.
    ??? ??? ??? this.delegate = delegate;
    ??? ??? }

    ??? ??? public Object invoke(Object proxy, Method method, Object[] args)
    ??? ??? ??? ??? throws Throwable {
    ??? ??? ??? Object result = null;
    ??? ??? ??? Connection con = ConnectionManager.getConnection();
    ??????????? //得到Transaction標(biāo)注
    ??? ??? ??? Transaction transaction = method.getAnnotation(Transaction.class);

    ??? ??? ??? //如果不為空,說(shuō)明代理對(duì)象調(diào)用的方法需要事務(wù)控制。
    ??? ??? ??? if (transaction != null) {
    ??? ??? ??? ??? // System.out.println("transaction.." + con.toString());
    ??? ??? ??? ??? // 得到事務(wù)隔離級(jí)別信息
    ??? ??? ??? ??? int level = transaction.level();
    ??? ??? ??? ??? try {
    ??? ??? ??? ??? ??? if (con.getAutoCommit())
    ??? ??? ??? ??? ??? ??? con.setAutoCommit(false);
    ??????????????????? //設(shè)置事務(wù)隔離級(jí)別
    ??? ??? ??? ??? ??? con.setTransactionIsolation(level);
    ??????????????????? //調(diào)用原始對(duì)象的業(yè)務(wù)方法
    ??? ??? ??? ??? ??? result = method.invoke(delegate, args);
    ??? ??? ??? ??? ??? con.commit();
    ??? ??? ??? ??? ??? con.setAutoCommit(true);
    ??? ??? ??? ??? } catch (SQLException se) {
    ??? ??? ??? ??? ??? // Rollback exception will be thrown by the invoke method
    ??? ??? ??? ??? ??? con.rollback();
    ??? ??? ??? ??? ??? con.setAutoCommit(true);
    ??? ??? ??? ??? ??? throw new SystemException(se);
    ??? ??? ??? ??? } catch (Exception e) {
    ??? ??? ??? ??? ??? con.rollback();
    ??? ??? ??? ??? ??? con.setAutoCommit(true);
    ??? ??? ??? ??? ??? throw new SystemException(e);
    ??? ??? ??? ??? }
    ??? ??? ??? } else {
    ??? ??? ??? ??? result = method.invoke(delegate, args);
    ??? ??? ??? }

    ??? ??? ??? return result;
    ??? ??? }
    ??? }
    }

    現(xiàn)在,看下我們的UserManager業(yè)務(wù)接口,請(qǐng)注意,我們是使用動(dòng)態(tài)代理,只能代理接口,所以要把@Transaction標(biāo)注是接口中的業(yè)務(wù)方法(與EJB3中的Remote,Local接口類似的道理):
    package com.strutslet.demo.service;

    import java.sql.SQLException;

    import com.strutslet.db.Transaction;
    import com.strutslet.demo.domain.AdminUser;

    public interface UserManager {
    ??? //查詢,不需要事務(wù)控制
    ??? public boolean checkUser(String name, String password) throws SQLException;

    ??? //新增一個(gè)用戶,需要事務(wù)控制,默認(rèn)級(jí)別
    ??? @Transaction
    ??? public boolean addUser(AdminUser user) throws SQLException;

    }

    要把a(bǔ)ddUser改成其他事務(wù)隔離級(jí)別(比如oracle的serializable級(jí)別),稍微修改下:@Transaction(level=Connection.TRANSACTION_SERIALIZABLE)
    public boolean addUser(AdminUser user) throws SQLException;

    不準(zhǔn)備詳細(xì)解釋例子的業(yè)務(wù)流程,不過(guò)是登錄和增加用戶兩個(gè)業(yè)務(wù)方法,看下就明白。閱讀本文前最好已經(jīng)讀過(guò)開(kāi)頭提過(guò)的兩篇文章。我相信代碼是最好的解釋:)

    posted @ 2007-02-06 12:24 dennis 閱讀(1003) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文

    posted @ 2007-02-06 11:54 dennis 閱讀(2426) | 評(píng)論 (2)編輯 收藏

         摘要:   閱讀全文

    posted @ 2007-02-06 11:49 dennis 閱讀(3395) | 評(píng)論 (0)編輯 收藏

         摘要: 《J2EE設(shè)計(jì)模式》學(xué)習(xí)筆記  閱讀全文

    posted @ 2007-02-06 11:47 dennis 閱讀(1381) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共56頁(yè): First 上一頁(yè) 48 49 50 51 52 53 54 55 56 下一頁(yè) 
    主站蜘蛛池模板: 亚洲中文字幕久久精品无码VA| 亚洲欧洲视频在线观看| 国产亚洲欧洲精品| 亚洲精品高清国产一久久| 亚洲国产日韩在线成人蜜芽| 亚洲w码欧洲s码免费| 国产亚洲精品成人久久网站| 在线看片免费人成视频久网下载| 亚洲黄色免费观看| 好大好硬好爽免费视频| 亚洲国产成人精品无码久久久久久综合 | 毛片基地免费视频a| 成人亚洲综合天堂| 久久久久亚洲Av片无码v| 亚洲人成77777在线观看网| 男女猛烈激情xx00免费视频| 一级毛片在线免费观看| 免费无码黄动漫在线观看| 在线亚洲97se亚洲综合在线| 91亚洲自偷在线观看国产馆| 精品国产亚洲一区二区三区在线观看 | 免费福利网站在线观看| 免费a级毛片18以上观看精品| 亚洲va久久久噜噜噜久久狠狠 | 久爱免费观看在线网站| 免费看的黄色大片| 亚洲AV永久无码精品水牛影视| 亚洲一区二区久久| 男女一边摸一边做爽的免费视频| 无码国产精品一区二区免费式影视 | 亚洲专区在线视频| 美女露隐私全部免费直播| 美女内射无套日韩免费播放| 黄a大片av永久免费| 亚洲AV无码专区亚洲AV伊甸园| 亚洲色大成网站www久久九| 日韩精品无码免费专区午夜| 午夜男人一级毛片免费| 亚洲嫩模在线观看| 美女黄频a美女大全免费皮| 无码av免费毛片一区二区|