我的空間,寫我所寫,禪我所藏

          與我一起遨游吧

           

          通過數據庫的設置字段,對流程中的jsp控件進行權限顯示控制,最終以javascript串返回頁面實現

             public static String limitControls(String procdefId,String activityId,String url)throws WfException{
              Connection con = DbConnectionManager.getInstance().getConnection(
                         poolName);
             Statement st = null;
             String value="";
            try {
                 st = con.createStatement();
                 String iSql = "";
                 ///
                 if(activityId!=null&&!"null".equals(activityId)){
                 iSql = "select distinct a.controltype,a.controlname,a.viewtype,c.formname from activitycontrollimits a,activitycontrol c,ASSIGNMENTEVENTAUDITS b where a.limitno=c.limitno and c.actdefid=b.activitydefinitionid and b.ACTIVITYID='"+activityId+"' and url='"+url+"'" ;
                 
                 }
                 ///進去發起頁面 activityid is null
                 else
                 iSql = "select distinct a.controltype,a.controlname,a.viewtype,c.formname from activitycontrollimits a,activitycontrol c where a.limitno=c.limitno and procdefid='"+procdefId+"' and actdefid='null' and url='"+url+"'" ;
                 System.out.println(iSql);
                 ResultSet rs = st.executeQuery(iSql);
                
                 while (rs.next()) {
                  int cType = rs.getInt(3);
                  switch(cType){
                  case 0:value = value+"document.all['"+rs.getString(2)+"'].disabled=true;";
                         break;
                  case 1:
                   if(rs.getInt(1)==3)
                    value = value="self.location='commons/noallow.jsp'";
                   else
                   value = value+"document.all['"+rs.getString(2)+"'].style.display='none';";
                         break;
                  //case 2:value=  value+"document.all['"+rs.getString(2)+"'].style.display='block';";
                        // break;
               
                  default:
                     value = value+"document.all['"+rs.getString(2)+"'].disabled=false;";
                     break;
                  }
                 }
                // if(value.trim().length()==0)
                //  value="self.location='/commons/noallow.jsp'";
               } catch (Exception e) {
                e.printStackTrace();
                 throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"生成校驗串失敗!",
                           ErrorInfo.getTrace(e, e.getStackTrace()));
                }    finally {
                  DbConnectionManager.getInstance().freeConnection(poolName, con);
              }
                value= "<script language='javascript'>"+value;
                value = value+"</script>";
              return value; 
             }

          posted @ 2007-06-25 15:43 imcb 閱讀(746) | 評論 (0)編輯 收藏

          在數據庫上進行一些配置,動態進行配值操作

          package com.augur.wf.shark.common.util;


          import javax.naming.InitialContext;
          import javax.servlet.http.HttpServletRequest;

          import org.apache.commons.dbcp.BasicDataSource;

          import com.augur.wf.shark.common.Exception.*;
          import java.util.List;
          import java.util.ArrayList;
          import  com.augur.wf.shark.common.Db.DbConnectionManager;
          import com.augur.wf.shark.SharkProviderImpl;
          import com.augurit.pysz.login.po.Usertable;
          import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;

          import java.io.RandomAccessFile;
          import java.sql.Statement;
          import java.sql.ResultSet;
          import java.sql.Connection;
          /**
           *
           * @author Administrator
           *
           */
          public class CodeFormula {
              public CodeFormula() {
                  try {
                      jbInit();
                  } catch (Exception ex) {
                      ex.printStackTrace();
                  }
              }

             private static final String poolName = "idb";
             public static final int apply_code = 1;  
             public static final int get_code = 2; 
             public static final int putback_code =3 ;
             public static final int refuse_code =4;
             public static final int abort_code =5;
             private static List getBeforeCode(String procId,String activityId,int codeType)throws WfException{
                 Connection con = DbConnectionManager.getInstance().getConnection(
                                            poolName);
                            Statement st = null;
                            List codes  = new ArrayList();
                            try {
                                    st = con.createStatement();
                                    String iSql = "select code from activitycode a,ASSIGNMENTEVENTAUDITS b where a.FIRETYPE=0 and  a.procdefid=b.PROCESSDEFINITIONID and a.actdefid=ACTIVITYDEFINITIONID and b.PROCESSID='"+procId+"' and b.ACTIVITYID='"+activityId+"' and codetype='"+codeType+"'";
          System.out.println(iSql);
                                    ResultSet rs = st.executeQuery(iSql);
                                    if (rs.next()) {
                                       codes.add(rs.getString(1));
                                    }
                            } catch (Exception e) {
                                throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"獲取節點代碼失敗!"+activityId,
                                              ErrorInfo.getTrace(e, e.getStackTrace()));
                            } finally {
                                DbConnectionManager.getInstance().freeConnection(poolName, con);
                            }
                            return codes;

             }
             private  static List getAfterCode(String procId,String activityId,int codeType)throws WfException{
                 Connection con = DbConnectionManager.getInstance().getConnection(
                                             poolName);
                             Statement st = null;
                             List codes  = new ArrayList();
                             try {
                                     st = con.createStatement();
                                     String iSql = "select distinct code from activitycode a,ASSIGNMENTEVENTAUDITS b where a.FIRETYPE=1 and a.procdefid=b.PROCESSDEFINITIONID and a.actdefid=ACTIVITYDEFINITIONID and b.PROCESSID='"+procId+"' and b.ACTIVITYID='"+activityId+"' and codetype='"+codeType+"'";
                                     System.out.println(iSql);
                                     ResultSet rs = st.executeQuery(iSql);
                                     if (rs.next()) {
                                        codes.add(rs.getString(1));
                                     }
                             } catch (Exception e) {
                                 throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"獲取節點代碼失敗!"+activityId,
                                               ErrorInfo.getTrace(e, e.getStackTrace()));
                             } finally {
                                 DbConnectionManager.getInstance().freeConnection(poolName, con);
                             }
                             return codes;

             }

            
             private static void updValue(String formId,String tableName,String fieldName,String value)throws WfException{
                 Connection con = DbConnectionManager.getInstance().getConnection(
                                            poolName);
                            Statement st = null;
                            try {
                                    st = con.createStatement();
                                    String iSql = "update  "+tableName+" set "+fieldName+"='"+value+"' where formid='"+formId+"'";
                                    System.out.println(iSql);
                                    st.execute(iSql);
                            } catch (Exception e) {
                                throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"更新代碼失敗!",
                                              ErrorInfo.getTrace(e, e.getStackTrace()));
                            } finally {
                                DbConnectionManager.getInstance().freeConnection(poolName, con);
                            }
                         

             }

             private static String getValue(String formId,String tableName,String fieldName)throws WfException{
                 Connection con = DbConnectionManager.getInstance().getConnection(
                                            poolName);
                            Statement st = null;
                            String value = null;
                            try {
                                    st = con.createStatement();
                                    String iSql = "select "+fieldName+" from "+tableName+" where applyid='"+formId+"'";
                                    ResultSet rs = st.executeQuery(iSql);
                                    if (rs.next()) {
                                       value = rs.getString(1);
                                    }
                            } catch (Exception e) {
                                throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"獲取值失敗!",
                                              ErrorInfo.getTrace(e, e.getStackTrace()));
                            } finally {
                                DbConnectionManager.getInstance().freeConnection(poolName, con);
                            }
                            return value;

             }


             //private static void get

             private static void parseCode(String procId,String activityId,String code,HttpServletRequest request) throws WfException{
                try{
                    String funName = code.substring(0, 6);
                  
                    ///設置流程變量代碼解釋   setVal opinion view.opinion or setVal opinion db.table1.opinion
                    if ("setVal".equals(funName)) {
                        String[] strs = code.split(" "); 
                        String valName = strs[1].trim();  //代碼前部分-流程變量名
                        String valValue = strs[2].trim(); //代碼后部分
                        String[] valueDefs = valValue.split("\\."); //解釋代碼后部分
                        String dataDefType =valueDefs[0];   //數據來源類型 view為頁面,data 為數據庫
                        String defFieldName = null;
                        String value = null;
                        //從頁面獲取數據才設置變量  格式: setVal
                        if ("view".equals(dataDefType)) {
                            defFieldName = valueDefs[1];
                            value = request.getParameter(
                                    defFieldName);
                        }
                        //從數據庫中獲取數據才設置變量?????
                        else if ("data".equals(dataDefType)) {
                        
                            String tableName = valueDefs[1];
                            defFieldName = valueDefs[2];
                            String formId = ExProcessManager.getExprocessRelaDataId(
                                    procId);
                            value = getValue(formId,tableName,defFieldName);
                        }
                       
                        else if("cons".equals(dataDefType)){
                         value = valueDefs[1];
                        }
                        Usertable user =(Usertable) request.getSession().getAttribute("login_user");
                        SharkProviderImpl.variableSet(SharkProviderImpl.connect(user.getUserid(),user.getPasswd()), activityId, valName,
                                                          value);
                    }
                   
                    if("updFld".equals(funName)){  //updFld tablea.jiaofei data.tableb.jiaofei
                     String[] strs = code.split(" "); 
                        String valName = strs[1].trim();  //代碼前部分-流程變量名
                        String valValue = strs[2].trim(); //代碼后部分
                        String[] fldDef = valName.split("\\.");
                        String[] valueDefs = valValue.split("\\."); //解釋代碼后部分
                        String dataDefType =valueDefs[0];   //數據來源類型 view為頁面,data 為數據庫
                        String defFieldName = null;
                        String value = null;
                        String formId = ExProcessManager.getExprocessRelaDataId(
                                procId);
                        //從頁面獲取數據才設置變量  格式: setVal
                        if ("view".equals(dataDefType)) {
                            defFieldName = valueDefs[1];
                            value = request.getParameter(
                                    defFieldName);
                        }
                        //從數據庫中獲取數據才設置變量?????
                        else if ("data".equals(dataDefType)) {
                        
                            String tableName = valueDefs[1];
                            defFieldName = valueDefs[2];
                           
                            value = getValue(formId,tableName,defFieldName);
                        }
                       
                        else if("cons".equals(dataDefType)){
                         value = valueDefs[1];
                        }
                       
                        updValue(formId,fldDef[0],fldDef[1],value);
                    }
                   
                   
                }
                catch(Exception e){
                 e.printStackTrace();
                 throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"解釋代碼失敗!"+code,
                            ErrorInfo.getTrace(e, e.getStackTrace()));
                }
             }


             public static void parseBeforeCode(String procId,String activityId,int codeType,HttpServletRequest request)throws WfException{
                 try{
                    List codes =  getBeforeCode(procId,activityId,codeType);
                    for(int i=0;i<codes.size();i++){
                        parseCode(procId,activityId,codes.get(i).toString(),request);
                    }
                 }
                 catch(WfException e){
                     throw e;
                 }
                 catch(Exception e1){
                     throw new WfException();
                 }
             }
             public static void parseAfterCode(String procId,String activityId,int codeType,HttpServletRequest request)throws WfException{
                 try{
                       List codes = getAfterCode(procId,activityId,codeType);
                       for(int i=0;i<codes.size();i++){
                        parseCode(procId,activityId,codes.get(i).toString(),request);
                    }

                   }
                   catch(WfException e){
                       throw e;
                   }
                   catch(Exception e1){
                       throw new WfException();
                   }

             }
            
            
             public static String limitControls(String procdefId,String activityId,String url)throws WfException{
              Connection con = DbConnectionManager.getInstance().getConnection(
                         poolName);
             Statement st = null;
             String value="";
            try {
                 st = con.createStatement();
                 String iSql = "";
                 ///
                 if(activityId!=null&&!"null".equals(activityId)){
                 iSql = "select distinct a.controltype,a.controlname,a.viewtype,c.formname from activitycontrollimits a,activitycontrol c,ASSIGNMENTEVENTAUDITS b where a.limitno=c.limitno and c.actdefid=b.activitydefinitionid and b.ACTIVITYID='"+activityId+"' and url='"+url+"'" ;
                 
                 }
                 ///進去發起頁面 activityid is null
                 else
                 iSql = "select distinct a.controltype,a.controlname,a.viewtype,c.formname from activitycontrollimits a,activitycontrol c where a.limitno=c.limitno and procdefid='"+procdefId+"' and actdefid='null' and url='"+url+"'" ;
                 System.out.println(iSql);
                 ResultSet rs = st.executeQuery(iSql);
                
                 while (rs.next()) {
                  int cType = rs.getInt(3);
                  switch(cType){
                  case 0:value = value+"document.all['"+rs.getString(2)+"'].disabled=true;";
                         break;
                  case 1:
                   if(rs.getInt(1)==3)
                    value = value="self.location='commons/noallow.jsp'";
                   else
                   value = value+"document.all['"+rs.getString(2)+"'].style.display='none';";
                         break;
                  //case 2:value=  value+"document.all['"+rs.getString(2)+"'].style.display='block';";
                        // break;
               
                  default:
                     value = value+"document.all['"+rs.getString(2)+"'].disabled=false;";
                     break;
                  }
                 }
                // if(value.trim().length()==0)
                //  value="self.location='/commons/noallow.jsp'";
               } catch (Exception e) {
                e.printStackTrace();
                 throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"生成校驗串失敗!",
                           ErrorInfo.getTrace(e, e.getStackTrace()));
                }    finally {
                  DbConnectionManager.getInstance().freeConnection(poolName, con);
              }
                value= "<script language='javascript'>"+value;
                value = value+"</script>";
              return value; 
             }
            
            
            
             public static String parseClientControl(String activityId) throws WfException{
              Connection con = DbConnectionManager.getInstance().getConnection(
                         poolName);
             Statement st = null;
             String value= "";
            try {
                 st = con.createStatement();
                 String iSql = "select distinct a.procdefid,a.actdefid,a.controltype,a.name,a.value,a.label,a.todefid from activitycodecontrol a,ASSIGNMENTEVENTAUDITS b where a.actdefid=b.activitydefinitionid and b.ACTIVITYID='"+activityId+"'" ;
                 System.out.println(iSql);
                 ResultSet rs = st.executeQuery(iSql);
                 while (rs.next()) {
                  int cType = rs.getInt(3);
                  switch(cType){
                  case 0:value = value+"<input type='checkbox'  name='"+rs.getString(4)+"' value='"+rs.getString(5)+"'>"+rs.getString(6);
                         break;
                  case 1:value = value+rs.getString(6)+"<input type='text' name='"+rs.getString(4)+"' value='"+rs.getString(5)+"'>";
                         break;
                  case 2:value=  value+"<input type='radio' onclick=getUsers('"+rs.getString(7)+"') touserid='"+rs.getString(7)+"' name='"+rs.getString(4)+"' value='"+rs.getString(5)+"'>"+rs.getString(6);
                         break;
               
                  default:
                   value = value+"<input type='checkbox' onclick=getUsers('"+rs.getString(7)+"') touserid='"+rs.getString(7)+"' name='"+rs.getString(4)+"' value='"+rs.getString(5)+"'>"+rs.getString(5);
                     break;
                  }
                 }
               } catch (Exception e) {
                e.printStackTrace();
                 throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"解釋客戶端變量失敗!",
                           ErrorInfo.getTrace(e, e.getStackTrace()));
                }    finally {
                  DbConnectionManager.getInstance().freeConnection(poolName, con);
              }
              return value;
            }

             public static void main(String[] args){
                 try{
                   //  CodeFormula.parseCode(null,null,"setVal laid data.tablea.filed", null);
                 
                  try{
                   BasicDataSource ds = new BasicDataSource();
                   ds.setDriverClassName("org.gjt.mm.mysql.Driver");
                   ds.setUrl("jdbc:mysql://localhost/sample");
                   ds.setUsername("root");
                   ds.setPassword("dddd");
                   ds.setInitialSize(2);

                   Hashtable env = new Hashtable();
                   env.put("java.naming.factory.initial","org.apache.naming.java.javaURLContextFactory");
                   InitialContext ctx=new InitialContext();

                   ctx.bind("tomcatDS",ds);
                   ds = (BasicDataSource)ctx.lookup("tomcatDS");
                   Connection con = ds.getConnection();
                   Statement stmt = con.createStatement();
                   String strSql = "select * from user";
                   ResultSet rs = stmt.executeQuery(strSql);
                   while(rs.next()){
                   System.out.println("id="+rs.getString(1));
                   }
                   rs.close();
                   stmt.close();
                   con.close();
                  }
                  catch(Exception ex){
                   ex.printStackTrace();
                  }

                


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

              private void jbInit() throws Exception {
              }

          }


          解析數據庫表上的Code字段的值樣式:
          updFld exprocess.BUSSSTATE cons.12001

          setVal outopin cont.test

          posted @ 2007-06-25 15:29 imcb 閱讀(268) | 評論 (0)編輯 收藏

          JDBC通用的查詢方法。


          formId查詢的條件字段,tableName是表名,fieldName要查詢的字段  


          private static String getValue(String formId,String tableName,String fieldName)throws WfException{
                 Connection con = DbConnectionManager.getInstance().getConnection(
                                            poolName);
                            Statement st = null;
                            String value = null;
                            try {
                                    st = con.createStatement();
                                    String iSql = "select "+fieldName+" from "+tableName+" where applyid='"+formId+"'";
                                    ResultSet rs = st.executeQuery(iSql);
                                    if (rs.next()) {
                                       value = rs.getString(1);
                                    }
                            } catch (Exception e) {
                                throw new WfException(ErrorInfo.EXT_PROC_MANAGER_ERROR,"獲取值失敗!",
                                              ErrorInfo.getTrace(e, e.getStackTrace()));
                            } finally {
                                DbConnectionManager.getInstance().freeConnection(poolName, con);
                            }
                            return value;

             }

          posted @ 2007-06-25 14:49 imcb 閱讀(574) | 評論 (0)編輯 收藏

          讀取遠程文件,然后在指定目錄下生成同樣的文件

          private void FileWrite(String ftp,String DXBS,String fileName,String fileExt){
                  java.net.URL urlfile 
          = null;
                  HttpURLConnection httpUrl 
          = null;

                  
          try {

                      
          // 連接指定的網絡資源,獲取網絡輸入流
                      urlfile = new java.net.URL(ftp+"/"+DXBS+"/"+fileName+"."+fileExt);
                      httpUrl 
          = (HttpURLConnection) urlfile.openConnection();
                      httpUrl.connect();
                      
          int bytesum = 0;
                      
          int byteread = 0;
                      InputStream inStream 
          = httpUrl.getInputStream();
                      
          this.mkdir("d:/ftp/"+DXBS);
                      FileOutputStream fs 
          = new FileOutputStream("D:/ftp/"+DXBS+"/"+fileName+"."+fileExt);
                      
          byte[] buffer = new byte[1444];
                      
          while ((byteread = inStream.read(buffer)) != -1{
                          bytesum 
          += byteread;
                          fs.write(buffer, 
          0, byteread);
                      }

                  }
           catch (Exception e) {

                  }
           
                  
              }

              
               
          private void mkdir(String mkdirName) throws Exception {

                  File dirFile 
          = new File(mkdirName);
                  
          boolean bFile = dirFile.exists();
                  
          if (bFile == true{
                  }
           else {
                      bFile 
          = dirFile.mkdir();
                      
          if (bFile == true{
                      }
           else {
                          System.exit(
          1);
                      }

                  }


              }
                大家看代碼,第一個方法是讀取遠程的文件,生成同樣的目錄文件,下面的方法是生成文件夾

          posted @ 2007-06-25 13:39 imcb 閱讀(629) | 評論 (1)編輯 收藏

          javascript 操作 excel

          <html>

          <head>
          <script language="javascript" type="text/javascript">


          </script><script language="javascript" type="text/javascript">
          function MakeExcel(){
          var i,j;
              try {
                var xls    = new ActiveXObject ( "Excel.Application" );
               }
              catch(e) {
                   alert( "要打印該表,您必須安裝Excel電子表格軟件,同時瀏覽器須使用“ActiveX 控件”,您的瀏覽器須允許執行控件。 請點擊【幫助】了解瀏覽器設置方法!");
                        return "";
               }

                      xls.visible =true;  //設置excel為可見

              var xlBook = xls.Workbooks.Add;
              var xlsheet = xlBook.Worksheets(1);
              <!--合并-->
                xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,7)).mergecells=true;
                xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,7)).value="發卡記錄";
               //  xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,6)).Interior.ColorIndex=5;//設置底色為藍色 
                          //   xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(1,6)).Font.ColorIndex=4;//設置字體色         
             // xlsheet.Rows(1). Interior .ColorIndex = 5 ;//設置底色為藍色  設置背景色 Rows(1).Font.ColorIndex=4  

              <!--設置行高-->
              xlsheet.Rows(1).RowHeight = 25;
              <!--設置字體 ws.Range(ws.Cells(i0+1,j0), ws.Cells(i0+1,j1)).Font.Size = 13 -->
              xlsheet.Rows(1).Font.Size=14;
              <!--設置字體 設置選定區的字體  xlsheet.Range(xlsheet.Cells(i0,j0), ws.Cells(i0,j0)).Font.Name = "黑體" -->
              xlsheet.Rows(1).Font.Name="黑體";
              <!--設置列寬 xlsheet.Columns(2)=14;-->

              xlsheet.Columns("A:D").ColumnWidth =18;
               <!--設置顯示字符而不是數字-->
              xlsheet.Columns(2).NumberFormatLocal="@";
              xlsheet.Columns(7).NumberFormatLocal="@";


               //設置單元格內容自動換行 range.WrapText  =  true  ;
               //設置單元格內容水平對齊方式 range.HorizontalAlignment  =  Excel.XlHAlign.xlHAlignCenter;//設置單元格內容豎直堆砌方式
                //range.VerticalAlignment=Excel.XlVAlign.xlVAlignCenter
              //range.WrapText  =  true;  xlsheet.Rows(3).WrapText=true  自動換行
            
              //設置標題欄

               xlsheet.Cells(2,1).Value="卡號";
               xlsheet.Cells(2,2).Value="密碼";
               xlsheet.Cells(2,3).Value="計費方式";
               xlsheet.Cells(2,4).Value="有效天數";
               xlsheet.Cells(2,5).Value="金額";
               xlsheet.Cells(2,6).Value="所屬服務項目";
                 xlsheet.Cells(2,7).Value="發卡時間";

               var oTable=document.all['fors:data'];
               var rowNum=oTable.rows.length;
               for(i=2;i<=rowNum;i++){
               for (j=1;j<=7;j++){
          //html table類容寫到excel

                 xlsheet.Cells(i+1,j).Value=oTable.rows(i-1).cells(j-1).innerHTML;
                      }


              }
              <!--   xlsheet.Range(xls.Cells(i+4,2),xls.Cells(rowNum,4)).Merge; -->
              // xlsheet.Range(xlsheet.Cells(i, 4), xlsheet.Cells(i-1, 6)).BorderAround , 4
               // for(mn=1,mn<=6;mn++) .     xlsheet.Range(xlsheet.Cells(1, mn), xlsheet.Cells(i1, j)).Columns.AutoFit;
                xlsheet.Columns.AutoFit;
                           xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(rowNum+1,7)).HorizontalAlignment =-4108;//居中
                             xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(1,7)).VerticalAlignment =-4108;
                           xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Font.Size=10;

                xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(3).Weight = 2; //設置左邊距
                 xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(4).Weight = 2;//設置右邊距
                       xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(1).Weight = 2;//設置頂邊距
                 xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,7)).Borders(2).Weight = 2;//設置底邊距

           

                 
                  xls.UserControl = true;  //很重要,不能省略,不然會出問題 意思是excel交由用戶控制
                 xls=null;
                 xlBook=null;
                 xlsheet=null;

          }

           


          </script>  <link href="css/styles3.css" rel="stylesheet" type="text/css"/>
          <title>ziyuanweihu</title>
          </head>
          <body>
            <form id="fors" method="post" action="/WebModule/admins/card/showcard.faces" enctype="application/x-www-form-urlencoded">

             
               
               
               
              <table id="fors:top" border="0" cellpadding="0" cellspacing="0" width="100%">
          <tbody>
          <tr>
          <td class="left"><img src="images/jiao1.gif" alt="" /></td>
          <td class="topMiddle"></td>
          <td class="right"><img src="images/jiao2.gif" alt="" /></td>
          </tr>
          </tbody>
          </table>            
                      
            
                
                
              <table border="0" cellpadding="0" cellspacing="0" width="100%">
          <tbody>
          <tr>
          <td class="middleLeft"></td>
          <td class="btstyle"><table id="fors:sort" border="0" cellpadding="0" cellspacing="0" style="valign:center" width="100%">
          <tbody>
          <tr>
          <td class="btstyle"><input type="button" name="fors:_id7" value="生成excel文件" onclick="MakeExcel()" /><input type="submit" name="fors:_id8" value="返回" /></td>
          </tr>
          </tbody>
          </table>
          <table id="fors:data" border="1" cellpadding="0" cellspacing="1" width="100%">
          <thead>
          <tr>
          <th scope="col"><span id="fors:data:headerText1">卡号</span></th>
          <th scope="col"><span id="fors:data:headerText2">密码</span></th>
          <th scope="col"><span id="fors:data:headerText3">计费方式</span></th>
          <th scope="col"><span id="fors:data:headerText4">有效天数</span></th>
          <th scope="col">金额</th>
          <th scope="col"><span id="fors:data:headerText6">所属服务项目</span></th>
          <th scope="col"><span id="fors:data:headerText7">发卡时间</span></th>
          </tr>
          </thead>
          <tbody>
          <tr>
          <td>h000010010</td>
          <td>543860</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010011</td>
          <td>683352</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010012</td>
          <td>433215</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010013</td>
          <td>393899</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010014</td>
          <td>031736</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010015</td>
          <td>188600</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010016</td>
          <td>363407</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010017</td>
          <td>175315</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010018</td>
          <td>354437</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          <tr>
          <td>h000010019</td>
          <td>234750</td>
          <td>计点</td>
          <td></td>
          <td>2.0</td>
          <td>测试项目</td>
          <td>2006-06-23 10:14:40.843</td>
          </tr>
          </tbody>
          </table>
          </td>
          <td class="middleRight"></td>
          </tr>
          </tbody>
          </table>

              <table id="fors:bottom" border="0" cellpadding="0" cellspacing="0" width="100%">
                <tbody>
                  <tr>
                    <td class="left">
                      <img src="images/jiao3.gif" alt=""/>
                    </td>
                    <td class="bottomMiddle">          </td>
                    <td class="right">
                      <img src="images/jiao4.gif" alt=""/>
                    </td>
                  </tr>
                </tbody>
              </table>
           <input type="hidden" name="fors" value="fors" /></form>
          </body>

          </html>
          歡迎加入QQ群:30406099 

          posted @ 2007-06-25 13:07 imcb 閱讀(301) | 評論 (0)編輯 收藏

          替換字符串的方法

           /**
            * Replace all occurence of forReplace with replaceWith in input string.
            *
            * @param input
            *            represents input string
            * @param forReplace
            *            represents substring for replace
            * @param replaceWith
            *            represents replaced string value
            * @return new string with replaced values
            */
           private static String replaceAll(String input, String forReplace,
             String replaceWith) {
            if (input == null)
             return null;
            StringBuffer result = new StringBuffer();
            boolean hasMore = true;
            while (hasMore) {
             int start = input.indexOf(forReplace);
             int end = start + forReplace.length();
             if (start != -1) {
              result.append(input.substring(0, start) + replaceWith);
              input = input.substring(end);
             } else {
              hasMore = false;
              result.append(input);
             }
            }
            if (result.toString().equals(""))
             return input; // nothing is changed
            else
             return result.toString();
           }

          posted @ 2007-06-25 10:59 imcb 閱讀(161) | 評論 (0)編輯 收藏

          Java中文&編碼問題小結

          Java中文&編碼問題小結

           

          笨笨

           

          Java字符編碼轉換過程說明

           

           

          javacn_fig1.gif 

          常見問題

           

           

          javacn_fig2.gif 

          JVM

          JVM啟動后,JVM會設置一些系統屬性以表明JVM的缺省區域。

          user.language,user.region,file.encoding等。 可以使用System.getProperties()詳細查看所有的系統屬性。

           

          如在英文操作系統(UNIX)下,可以使用如下屬性定義強制指定JVM為中文環境 -Dclient.encoding.override=GBK -Dfile.encoding=GBK -Duser.language=zh -Duser.region=CN

           

          .java-->.class編譯

          說明:一般javac根據當前os區域設置,自動決定源文件的編碼.可以通過-encoding強制指定.

           

          錯誤可能:

          1 gbk編碼源文件在英文環境下編譯,javac不能正確轉換.曾見于java/jsp在英文unix. 檢測方法:\u4e00格式的漢字,繞開javac編碼,再在jvm,將漢字作為int打印,看值是否相等;或直接以UTF-8編碼打開.class文件,看看常量字符串是否正確保存漢字。

           

          文件讀寫

          外部數據如文件經過讀寫和轉換兩個步驟,轉為jvm所使用字符。InputStream/OutputStream用于讀寫原始外部數據,Reader/Writer執行讀寫和轉換兩個步驟。

           

          1 文件讀寫轉換由java.io.Reader/Writer執行;輸入輸出流 InputStream/OutputStream 處理漢字不合適,應該首選使用Reader/Writer,如 FileReader/FileWriter

           

          2 FileReader/FileWriter使用JVM當前編碼讀寫文件.如果有其它編碼格式,使用InputStreamReader/OutputStreamWriter

           

          3 PrintStream有點特殊,它自動使用jvm缺省編碼進行轉換。

           

           

          讀取.properties文件

          .propeties文件由Properties類以iso8859-1編碼讀取,因此不能在其中直接寫漢字,需要使用JDK native2ascii工具轉換漢字為\uXXXX格式。命令行:native2ascii –encoding GBK inputfile outputfile

           

          讀取XML文件

          1 XML文件讀寫同于文件讀寫,但應注意確保XML頭中聲明如<? xml version=”1.0” encoding=”gb2312” ?>與文件編碼保持一致。

           

          2 javax.xml.SAXParser類接受InputStream作為輸入參數,對于Reader,需要用org.xml.sax.InputSource包裝一下,再給SAXParser

           

          3 對于UTF-8編碼 XML,注意防止編輯器自動加上\uFFFE BOM, xml parser會報告content is not allowed in prolog

           

           

          字節數組

          1 使用 new String(byteArray,encoding)  String.getBytes(encoding) 在字節數組和字符串之間進行轉換

           

          也可以用ByteArrayInputStream/ByteArrayOutputStream轉為流后再用InputStreamReader/OutputStreamWriter轉換。

           

          錯誤編碼的字符串(iso8859-1轉碼gbk)

          如果我們得到的字符串是由錯誤的轉碼方式產生的,例如:對于gbk中文,由iso8859-1方式轉換,此時如果用調試器看到的字符串一般是 的樣子,長度一般為文本的字節長度,而非漢字個數。

           

          可以采用如下方式轉為正確的中文:

          text = new String( text.getBytes(“iso8859-1”),”gbk”);

           

          JDBC

          轉換過程由JDBC Driver執行,取決于各JDBC數據庫實現。對此經驗尚積累不夠。

           

          1 對于ORACLE數據庫,需要數據庫創建時指定編碼方式為gbk,否則會出現漢字轉碼錯誤

          2 對于 SQL Server 2000 ,最好以nvarchar/nchar類型存放文本,即不存在中文/編碼轉換問題。

          3 連接 Mysql,將 connectionString 設置成 encoding gb2312

           String connectionString  = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=gb2312";

           

          WEB/Servlet/JSP

          1 對于JSP,確定頭部加上 <%@ page contentType="text/html;charset=gb2312"%>這樣的標簽。

          2 對于Servlet,確定 設置setContentType (“text/html; charset=gb2312”),以上兩條用于使得輸出漢字沒有問題。

          3 為輸出HTML head中加一個 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> ,讓瀏覽器正確確定HTML編碼。

           

          4 Web應用加一個Filter,確保每個Request明確調用setCharacterEncoding方法,讓輸入漢字能夠正確解析。

           

           

          import java.io.IOException;

          import javax.servlet.Filter;

          import javax.servlet.FilterChain;

          import javax.servlet.FilterConfig;

          import javax.servlet.ServletException;

          import javax.servlet.ServletRequest;

          import javax.servlet.ServletResponse;

          import javax.servlet.UnavailableException;

          import javax.servlet.http.HttpServletRequest;

           

          /**

           * Example filter that sets the character encoding to be used in parsing the

           * incoming request

           */

          public class SetCharacterEncodingFilter

              implements Filter {

           public SetCharacterEncodingFilter()

           {}

           protected boolean debug = false;

           protected String encoding = null;

           protected FilterConfig filterConfig = null;

           public void destroy() {

              this.encoding = null;

              this.filterConfig = null;

           }

           

           public void doFilter(ServletRequest request, ServletResponse response,

                                 FilterChain chain) throws IOException, ServletException {

          //    if (request.getCharacterEncoding() == null)

          //    {

          //      String encoding = getEncoding();

          //      if (encoding != null)

          //        request.setCharacterEncoding(encoding);

          //

          //    }

                request.setCharacterEncoding(encoding);

                if ( debug ){

                  System.out.println( ((HttpServletRequest)request).getRequestURI()+"setted to "+encoding );

                }

              chain.doFilter(request, response);

           }

           

           public void init(FilterConfig filterConfig) throws ServletException {

              this.filterConfig = filterConfig;

              this.encoding = filterConfig.getInitParameter("encoding");

              this.debug = "true".equalsIgnoreCase( filterConfig.getInitParameter("debug") );

           }

           

           protected String getEncoding() {

              return (this.encoding);

           }

          }

           

           

          web.xml中加入:

           

           <filter>

              <filter-name>LocalEncodingFilter</filter-name>

              <display-name>LocalEncodingFilter</display-name>

              <filter-class>com.ccb.ectipmanager.request.SetCharacterEncodingFilter</filter-class>

              <init-param>

                <param-name>encoding</param-name>

                <param-value>gb2312</param-value>

              </init-param>

              <init-param>

                <param-name>debug</param-name>

                <param-value>false</param-value>

              </init-param>

           </filter>

           

             <filter-mapping>

              <filter-name>LocalEncodingFilter</filter-name>

              <url-pattern>/*</url-pattern>

           </filter-mapping>

           

          5 用于Weblogicvedor-specific):

          其一:web.xml里加上如下腳本:

          <context-param>

           <param-name>weblogic.httpd.inputCharset./*</param-name>

           <param-value>GBK</param-value>

          </context-param>

          其二(可選)在weblogic.xml里加上如下腳本:

          <charset-params>

           <input-charset>

                <resource-path>/*</resource-path>

                <java-charset-name>GBK</java-charset-name>

           </input-charset>

          </charset-params>

           

          SWING/AWT/SWT

          對于SWING/AWTJava會有些缺省字體如Dialog/San Serif,這些字體到系統真實字體的映射在$JRE_HOME/lib/font.properties.XXX文件中指定。排除字體顯示問題時,首先需要確定JVM的區域為zh_CN,這樣font.properties.zh_CN文件才會發生作用。對于 font.properties.zh_CN , 需要檢查是否映射缺省字體到中文字體如宋體。

           

          Swing中,Java自行解釋TTF字體,渲染顯示;對于AWT,SWT顯示部分交由操作系統。首先需要確定系統裝有中文字體。

           

          1 漢字顯示為,一般為顯示字體沒有使用中文字體,因為Java對于當前字體顯示不了的字符,不會像Windows一樣再采用缺省字體顯示。

          2 部分不常見漢字不能顯示,一般為顯示字庫中漢字不全,可以換另外的中文字體試試。

          3 對于AWT/SWT,首先確定JVM運行環境的區域設置為中文,因為此處設計JVM與操作系統api調用的轉換問題,再檢查其它問題。

           

          JNI

          JNIjstringUTF-8編碼給我們,需要我們自行轉為本地編碼。對于Windows,可以采用WideCharToMultiByte/MultiByteToWideChar函數進行轉換,對于Unix,可以采用iconv庫。

           

          這里從SUN jdk 1.4 源代碼中找到一段使用jvm String 對象的getBytes的轉換方式,相對簡單和跨平臺,不需要第三方庫,但速度稍慢。函數原型如下:

           

          /* Convert between Java strings and i18n C strings */

          JNIEXPORT jstring

          NewStringPlatform(JNIEnv *env, const char *str);

           

          JNIEXPORT const char *

          GetStringPlatformChars(JNIEnv *env, jstring jstr, jboolean *isCopy);

           

          JNIEXPORT jstring JNICALL

          JNU_NewStringPlatform(JNIEnv *env, const char *str);

           

          JNIEXPORT const char * JNICALL

          JNU_GetStringPlatformChars(JNIEnv *env, jstring jstr, jboolean *isCopy);

           

          JNIEXPORT void JNICALL

          JNU_ReleaseStringPlatformChars(JNIEnv *env, jstring jstr, const char *str);

           

           

          附件jni_util.h,jni_util.c

           

           

          TUXEDO/JOLT

          JOLT對于傳遞的字符串需要用如下進行轉碼

          new String(ls_tt.getBytes("GBK"),"iso8859-1")

           

          對于返回的字符串

          new String(error_message.getBytes("iso8859-1"),"GBK");

          jolt 的系統屬性 bea.jolt.encoding不應該設置,如果設置,JSH會報告說錯誤的協議.

           

           

          JDK1.4/1.5新增部分

          字符集相關類(Charset/CharsetEncoder/CharsetDecoder)

          jdk1.4開始,對字符集的支持在java.nio.charset包中實現。

           

          常用功能:

          1 列出jvm所支持字符集:Charset.availableCharsets()

          2 能否對看某個Unicode字符編碼,CharsetEncoder.canEncode()

           

          Unicode Surrogate/CJK EXT B

          Unicode 范圍一般所用為\U0000-\UFFFF范圍,jvm使用1char就可以表示,對于CJK EXT B區漢字,范圍大于\U20000,則需要采用2char方能表示,此即Unicode Surrogate。這2char的值范圍 落在Character.SURROGATE 區域內,用Character.getType()來判斷。

           

          jdk 1.4尚不能在Swing中正確處理surrogate區的Unicode字符,jdk1.5可以。對于CJK EXT B區漢字,目前可以使用的字庫為宋體-方正超大字符集”,Office安裝。

           

          常見問題

          JVM下,用System.out.println不能正確打印中文,顯示為???

          System.out.printlnPrintStream,它采用jvm缺省字符集進行轉碼工作,如果jvm的缺省字符集為iso8859-1,則中文顯示會有問題。此問題常見于Unix下,jvm的區域沒有明確指定的情況。

           

          在英文UNIX環境下,System.out.println能夠正確打印漢字,但是內部處理錯誤

          可能是漢字在輸入轉換時,就沒有正確轉碼:

          gbk文本à(iso8859-1轉碼)àjvm char(iso8859-1編碼漢字)à (iso8859-1轉碼)à輸出。

          gbk漢字經過兩次錯誤轉碼,原封不動的被傳遞到輸出,但是在jvm中,并未以正確的unicode編碼表示,而是以一個漢字字節一個char的方式表示,從而導致此類錯誤。

           

           

          GB2312-80GBKGB18030-2000 漢字字符集

           

          GB2312-80 是在國內計算機漢字信息技術發展初始階段制定的,其中包含了大部分常用的一、二級漢字,和 9 區的符號。該字符集是幾乎所有的中文系統和國際化的軟件都支持的中文字符集,這也是最基本的中文字符集。其編碼范圍是高位0xa10xfe,低位也是 0xa1-0xfe;漢字從 0xb0a1 開始,結束于 0xf7fe

           

          GBK GB2312-80 的擴展,是向上兼容的。它包含了 20902 個漢字,其編碼范圍是 0x8140-0xfefe,剔除高位 0x80 的字位。其所有字符都可以一對一映射到 Unicode 2.0,也就是說 JAVA 實際上提供了 GBK 字符集的支持。這是現階段 Windows 和其它一些中文操作系統的缺省字符集,但并不是所有的國際化軟件都支持該字符集,感覺是他們并不完全知道 GBK 是怎么回事。值得注意的是它不是國家標準,而只是規范。隨著 GB18030-2000國標的發布,它將在不久的將來完成它的歷史使命。

           

          GB18030-2000(GBK2K) GBK 的基礎上進一步擴展了漢字,增加了藏、蒙等少數民族的字形。GBK2K 從根本上解決了字位不夠,字形不足的問題。它有幾個特點,

           

          它并沒有確定所有的字形,只是規定了編碼范圍,留待以后擴充。

          編碼是變長的,其二字節部分與 GBK 兼容;四字節部分是擴充的字形、字位,其編碼范圍是首字節 0x81-0xfe、二字節0x30-0x39、三字節 0x81-0xfe、四字節0x30-0x39

           

          UTF-8/UTF-16/UTF-32

           

          UTF,即Unicode Transformer Format,是Unicode代碼點(code point)的實際表示方式,按其基本長度所用位數分為UTF-8/16/32。它也可以認為是一種特殊的外部數據編碼,但能夠與Unicode代碼點做一一對應。

           

          UTF-8是變長編碼,每個Unicode代碼點按照不同范圍,可以有1-3字節的不同長度。

          UTF-16長度相對固定,只要不處理大于\U200000范圍的字符,每個Unicode代碼點使用16位即2字節表示,超出部分使用兩個UTF-164字節表示。按照高低位字節順序,又分為UTF-16BE/UTF-16LE

          UTF-32長度始終固定,每個Unicode代碼點使用32位即4字節表示。按照高低位字節順序,又分為UTF-32BE/UTF-32LE

           

          UTF編碼有個優點,即盡管編碼字節數不等,但是不像gb2312/gbk編碼一樣,需要從文本開始尋找,才能正確對漢字進行定位。在UTF編碼下,根據相對固定的算法,從當前位置就能夠知道當前字節是否是一個代碼點的開始還是結束,從而相對簡單的進行字符定位。不過定位問題最簡單的還是UTF-32,它根本不需要進行字符定位,但是相對的大小也增加不少。

           

           

          關于GCJ JVM

          GCJ并未完全依照sun jdk的做法,對于區域和編碼問題考慮尚不夠周全。GCJ啟動時,區域始終設為en_US,編碼也缺省為iso8859-1。但是可以用Reader/Writer做正確編碼轉換。

          posted @ 2007-06-12 10:27 imcb 閱讀(453) | 評論 (0)編輯 收藏

          讀寫Property文件

          關于Java文件路徑問題

          1.如何獲得當前文件路徑

          常用:

          字符串類型:System.getProperty("user.dir");

          綜合:

          package com.zcjl.test.base;
          import java.io.File;
          public class Test {
              public static void main(String[] args) throws Exception {
                  System.out.println(
                      Thread.currentThread().getContextClassLoader().getResource(""));
                  System.out.println(Test.class.getClassLoader().getResource(""));
                  System.out.println(ClassLoader.getSystemResource(""));
                  System.out.println(Test.class.getResource(""));
                  System.out.println(Test.class.getResource("/"));
                  System.out.println(new File("").getAbsolutePath());
                  System.out.println(System.getProperty("user.dir"));

              }
          }

          2.Web服務中

          (1).Weblogic

          WebApplication的系統文件根目錄是你的weblogic安裝所在根目錄。
          例如:如果你的weblogic安裝在c:\bea\weblogic700.....
          那么,你的文件根路徑就是c:\.
          所以,有兩種方式能夠讓你訪問你的服務器端的文件:
          a.使用絕對路徑:
          比如將你的參數文件放在c:\yourconfig\yourconf.properties,
          直接使用 new FileInputStream("yourconfig/yourconf.properties");
          b.使用相對路徑:
          相對路徑的根目錄就是你的webapplication的根路徑,即WEB-INF的上一級目錄,將你的參數文件放在yourwebapp\yourconfig\yourconf.properties,
          這樣使用:
          new FileInputStream("./yourconfig/yourconf.properties");
          這兩種方式均可,自己選擇。

          (2).Tomcat

          在類中輸出System.getProperty("user.dir");顯示的是%Tomcat_Home%/bin

          (3).Resin

          不是你的JSP放的相對路徑,是JSP引擎執行這個JSP編譯成SERVLET
          的路徑為根.比如用新建文件法測試File f = new File("a.htm");
          這個a.htm在resin的安裝目錄下

          (4).如何讀相對路徑哪?

          在Java文件中getResource或getResourceAsStream均可

          例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",這里的/代表web發布根路徑下WEB-INF/classes

          (5).獲得文件真實路徑

          string  file_real_path=request.getRealPath("mypath/filename"); 

          通常使用request.getRealPath("/"); 

          3.文件操作的類

          import java.io.*;
          import java.net.*;
          import java.util.*;
          //import javax.swing.filechooser.*;
          //import org.jr.swing.filter.*;

          /**
          * 此類中封裝一些常用的文件操作。
          * 所有方法都是靜態方法,不需要生成此類的實例,
          * 為避免生成此類的實例,構造方法被申明為private類型的。
          * @since  0.1
          */

          public class FileUtil {
            /**
             * 私有構造方法,防止類的實例化,因為工具類不需要實例化。
             */
            private FileUtil() {

            }

            /**
             * 修改文件的最后訪問時間。
             * 如果文件不存在則創建該文件。
             * <b>目前這個方法的行為方式還不穩定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
             * @param file 需要修改最后訪問時間的文件。
             * @since  0.1
             */
            public static void touch(File file) {
              long currentTime = System.currentTimeMillis();
              if (!file.exists()) {
                System.err.println("file not found:" + file.getName());
                System.err.println("Create a new file:" + file.getName());
                try {
                  if (file.createNewFile()) {
                  //  System.out.println("Succeeded!");
                  }
                  else {
                  //  System.err.println("Create file failed!");
                  }
                }
                catch (IOException e) {
                //  System.err.println("Create file failed!");
                  e.printStackTrace();
                }
              }
              boolean result = file.setLastModified(currentTime);
              if (!result) {
              //  System.err.println("touch failed: " + file.getName());
              }
            }

            /**
             * 修改文件的最后訪問時間。
             * 如果文件不存在則創建該文件。
             * <b>目前這個方法的行為方式還不穩定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
             * @param fileName 需要修改最后訪問時間的文件的文件名。
             * @since  0.1
             */
            public static void touch(String fileName) {
              File file = new File(fileName);
              touch(file);
            }

            /**
             * 修改文件的最后訪問時間。
             * 如果文件不存在則創建該文件。
             * <b>目前這個方法的行為方式還不穩定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
             * @param files 需要修改最后訪問時間的文件數組。
             * @since  0.1
             */
            public static void touch(File[] files) {
              for (int i = 0; i < files.length; i++) {
                touch(files);
              }
            }

            /**
             * 修改文件的最后訪問時間。
             * 如果文件不存在則創建該文件。
             * <b>目前這個方法的行為方式還不穩定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

          慮中。</b>
             * @param fileNames 需要修改最后訪問時間的文件名數組。
             * @since  0.1
             */
            public static void touch(String[] fileNames) {
              File[] files = new File[fileNames.length];
              for (int i = 0; i < fileNames.length; i++) {
                files = new File(fileNames);
              }
              touch(files);
            }

            /**
             * 判斷指定的文件是否存在。
             * @param fileName 要判斷的文件的文件名
             * @return 存在時返回true,否則返回false。
             * @since  0.1
             */
            public static boolean isFileExist(String fileName) {
              return new File(fileName).isFile();
            }

            /**
             * 創建指定的目錄。
             * 如果指定的目錄的父目錄不存在則創建其目錄書上所有需要的父目錄。
             * <b>注意:可能會在返回false的時候創建部分父目錄。</b>
             * @param file 要創建的目錄
             * @return 完全創建成功時返回true,否則返回false。
             * @since  0.1
             */
            public static boolean makeDirectory(File file) {
              File parent = file.getParentFile();
              if (parent != null) {
                return parent.mkdirs();
              }
              return false;
            }

            /**
             * 創建指定的目錄。
             * 如果指定的目錄的父目錄不存在則創建其目錄書上所有需要的父目錄。
             * <b>注意:可能會在返回false的時候創建部分父目錄。</b>
             * @param fileName 要創建的目錄的目錄名
             * @return 完全創建成功時返回true,否則返回false。
             * @since  0.1
             */
            public static boolean makeDirectory(String fileName) {
              File file = new File(fileName);
              return makeDirectory(file);
            }

            /**
             * 清空指定目錄中的文件。
             * 這個方法將盡可能刪除所有的文件,但是只要有一個文件沒有被刪除都會返回false。
             * 另外這個方法不會迭代刪除,即不會刪除子目錄及其內容。
             * @param directory 要清空的目錄
             * @return 目錄下的所有文件都被成功刪除時返回true,否則返回false.
             * @since  0.1
             */
            public static boolean emptyDirectory(File directory) {
              boolean result = false;
              File[] entries = directory.listFiles();
              for (int i = 0; i < entries.length; i++) {
                if (!entries.delete()) {
                  result = false;
                }
              }
              return true;
            }

            /**
             * 清空指定目錄中的文件。
             * 這個方法將盡可能刪除所有的文件,但是只要有一個文件沒有被刪除都會返回false。
             * 另外這個方法不會迭代刪除,即不會刪除子目錄及其內容。
             * @param directoryName 要清空的目錄的目錄名
             * @return 目錄下的所有文件都被成功刪除時返回true,否則返回false。
             * @since  0.1
             */
            public static boolean emptyDirectory(String directoryName) {
              File dir = new File(directoryName);
              return emptyDirectory(dir);
            }

            /**
             * 刪除指定目錄及其中的所有內容。
             * @param dirName 要刪除的目錄的目錄名
             * @return 刪除成功時返回true,否則返回false。
             * @since  0.1
             */
            public static boolean deleteDirectory(String dirName) {
              return deleteDirectory(new File(dirName));
            }

            /**
             * 刪除指定目錄及其中的所有內容。
             * @param dir 要刪除的目錄
             * @return 刪除成功時返回true,否則返回false。
             * @since  0.1
             */
            public static boolean deleteDirectory(File dir) {
              if ( (dir == null) || !dir.isDirectory()) {
                throw new IllegalArgumentException("Argument " + dir +
                                                   " is not a directory. ");
              }

              File[] entries = dir.listFiles();
              int sz = entries.length;

              for (int i = 0; i < sz; i++) {
                if (entries.isDirectory()) {
                  if (!deleteDirectory(entries)) {
                    return false;
                  }
                }
                else {
                  if (!entries.delete()) {
                    return false;
                  }
                }
              }

              if (!dir.delete()) {
                return false;
              }
              return true;
            }


            /**
             * 返回文件的URL地址。
             * @param file 文件
             * @return 文件對應的的URL地址
             * @throws MalformedURLException
             * @since  0.4
             * @deprecated 在實現的時候沒有注意到File類本身帶一個toURL方法將文件路徑轉換為URL。
             *             請使用File.toURL方法。
             */
            public static URL getURL(File file) throws MalformedURLException {
              String fileURL = "file:/" + file.getAbsolutePath();
              URL url = new URL(fileURL);
              return url;
            }

            /**
             * 從文件路徑得到文件名。
             * @param filePath 文件的路徑,可以是相對路徑也可以是絕對路徑
             * @return 對應的文件名
             * @since  0.4
             */
            public static String getFileName(String filePath) {
              File file = new File(filePath);
              return file.getName();
            }

            /**
             * 從文件名得到文件絕對路徑。
             * @param fileName 文件名
             * @return 對應的文件路徑
             * @since  0.4
             */
            public static String getFilePath(String fileName) {
              File file = new File(fileName);
              return file.getAbsolutePath();
            }

            /**
             * 將DOS/Windows格式的路徑轉換為UNIX/Linux格式的路徑。
             * 其實就是將路徑中的"\"全部換為"/",因為在某些情況下我們轉換為這種方式比較方便,
             * 某中程度上說"/"比"\"更適合作為路徑分隔符,而且DOS/Windows也將它當作路徑分隔符。
             * @param filePath 轉換前的路徑
             * @return 轉換后的路徑
             * @since  0.4
             */
            public static String toUNIXpath(String filePath) {
              return filePath.replace('\\', '/');
            }

            /**
             * 從文件名得到UNIX風格的文件絕對路徑。
             * @param fileName 文件名
             * @return 對應的UNIX風格的文件路徑
             * @since  0.4
             * @see #toUNIXpath(String filePath) toUNIXpath
             */
            public static String getUNIXfilePath(String fileName) {
              File file = new File(fileName);
              return toUNIXpath(file.getAbsolutePath());
            }

            /**
             * 得到文件的類型。
             * 實際上就是得到文件名中最后一個“.”后面的部分。
             * @param fileName 文件名
             * @return 文件名中的類型部分
             * @since  0.5
             */
            public static String getTypePart(String fileName) {
              int point = fileName.lastIndexOf('.');
              int length = fileName.length();
              if (point == -1 || point == length - 1) {
                return "";
              }
              else {
                return fileName.substring(point + 1, length);
              }
            }

            /**
             * 得到文件的類型。
             * 實際上就是得到文件名中最后一個“.”后面的部分。
             * @param file 文件
             * @return 文件名中的類型部分
             * @since  0.5
             */
            public static String getFileType(File file) {
              return getTypePart(file.getName());
            }

            /**
             * 得到文件的名字部分。
             * 實際上就是路徑中的最后一個路徑分隔符后的部分。
             * @param fileName 文件名
             * @return 文件名中的名字部分
             * @since  0.5
             */
            public static String getNamePart(String fileName) {
              int point = getPathLsatIndex(fileName);
              int length = fileName.length();
              if (point == -1) {
                return fileName;
              }
              else if (point == length - 1) {
                int secondPoint = getPathLsatIndex(fileName, point - 1);
                if (secondPoint == -1) {
                  if (length == 1) {
                    return fileName;
                  }
                  else {
                    return fileName.substring(0, point);
                  }
                }
                else {
                  return fileName.substring(secondPoint + 1, point);
                }
              }
              else {
                return fileName.substring(point + 1);
              }
            }

            /**
             * 得到文件名中的父路徑部分。
             * 對兩種路徑分隔符都有效。
             * 不存在時返回""。
             * 如果文件名是以路徑分隔符結尾的則不考慮該分隔符,例如"/path/"返回""。
             * @param fileName 文件名
             * @return 父路徑,不存在或者已經是父目錄時返回""
             * @since  0.5
             */
            public static String getPathPart(String fileName) {
              int point = getPathLsatIndex(fileName);
              int length = fileName.length();
              if (point == -1) {
                return "";
              }
              else if (point == length - 1) {
                int secondPoint = getPathLsatIndex(fileName, point - 1);
                if (secondPoint == -1) {
                  return "";
                }
                else {
                  return fileName.substring(0, secondPoint);
                }
              }
              else {
                return fileName.substring(0, point);
              }
            }

            /**
             * 得到路徑分隔符在文件路徑中首次出現的位置。
             * 對于DOS或者UNIX風格的分隔符都可以。
             * @param fileName 文件路徑
             * @return 路徑分隔符在路徑中首次出現的位置,沒有出現時返回-1。
             * @since  0.5
             */
            public static int getPathIndex(String fileName) {
              int point = fileName.indexOf('/');
              if (point == -1) {
                point = fileName.indexOf('\\');
              }
              return point;
            }

            /**
             * 得到路徑分隔符在文件路徑中指定位置后首次出現的位置。
             * 對于DOS或者UNIX風格的分隔符都可以。
             * @param fileName 文件路徑
             * @param fromIndex 開始查找的位置
             * @return 路徑分隔符在路徑中指定位置后首次出現的位置,沒有出現時返回-1。
             * @since  0.5
             */
            public static int getPathIndex(String fileName, int fromIndex) {
              int point = fileName.indexOf('/', fromIndex);
              if (point == -1) {
                point = fileName.indexOf('\\', fromIndex);
              }
              return point;
            }

            /**
             * 得到路徑分隔符在文件路徑中最后出現的位置。
             * 對于DOS或者UNIX風格的分隔符都可以。
             * @param fileName 文件路徑
             * @return 路徑分隔符在路徑中最后出現的位置,沒有出現時返回-1。
             * @since  0.5
             */
            public static int getPathLsatIndex(String fileName) {
              int point = fileName.lastIndexOf('/');
              if (point == -1) {
                point = fileName.lastIndexOf('\\');
              }
              return point;
            }

            /**
             * 得到路徑分隔符在文件路徑中指定位置前最后出現的位置。
             * 對于DOS或者UNIX風格的分隔符都可以。
             * @param fileName 文件路徑
             * @param fromIndex 開始查找的位置
             * @return 路徑分隔符在路徑中指定位置前最后出現的位置,沒有出現時返回-1。
             * @since  0.5
             */
            public static int getPathLsatIndex(String fileName, int fromIndex) {
              int point = fileName.lastIndexOf('/', fromIndex);
              if (point == -1) {
                point = fileName.lastIndexOf('\\', fromIndex);
              }
              return point;
            }

            /**
             * 將文件名中的類型部分去掉。
             * @param filename 文件名
             * @return 去掉類型部分的結果
             * @since  0.5
             */
            public static String trimType(String filename) {
              int index = filename.lastIndexOf(".");
              if (index != -1) {
                return filename.substring(0, index);
              }
              else {
                return filename;
              }
            }
            /**
             * 得到相對路徑。
             * 文件名不是目錄名的子節點時返回文件名。
             * @param pathName 目錄名
             * @param fileName 文件名
             * @return 得到文件名相對于目錄名的相對路徑,目錄下不存在該文件時返回文件名
             * @since  0.5
             */
            public static String getSubpath(String pathName,String fileName) {
              int index = fileName.indexOf(pathName);
              if (index != -1) {
                return fileName.substring(index + pathName.length() + 1);
              }
              else {
                return fileName;
              }
            }

          }
           4.遺留問題

          目前new FileInputStream()只會使用絕對路徑,相對沒用過,因為要相對于web服務器地址,比較麻煩

          還不如寫個配置文件來的快哪

          5.按Java文件類型分類讀取配置文件

          配置文件是應用系統中不可缺少的,可以增加程序的靈活性。java.util.Properties是從jdk1.2就有的類,一直到現在都支持load ()方法,jdk1.4以后save(output,string) ->store(output,string)。如果只是單純的讀,根本不存在煩惱的問題。web層可以通過 Thread.currentThread().getContextClassLoader().
          getResourceAsStream("xx.properties") 獲取;Application可以通過new FileInputStream("xx.properties");直接在classes一級獲取。關鍵是有時我們需要通過web修改配置文件,我們不能將路徑寫死了。經過測試覺得有以下心得:

          1.servlet中讀寫。如果運用Struts 或者Servlet可以直接在初始化參數中配置,調用時根據servlet的getRealPath("/")獲取真實路徑,再根據String file = this.servlet.getInitParameter("abc");獲取相對的WEB-INF的相對路徑。
          例:
          InputStream input = Thread.currentThread().getContextClassLoader().
          getResourceAsStream("abc.properties");
          Properties prop = new Properties();
          prop.load(input);
          input.close();
          OutputStream out = new FileOutputStream(path);
          prop.setProperty("abc", “test");
          prop.store(out, “–test–");
          out.close();

          2.直接在jsp中操作,通過jsp內置對象獲取可操作的絕對地址。
          例:
          // jsp頁面
          String path = pageContext.getServletContext().getRealPath("/");
          String realPath = path+"/WEB-INF/classes/abc.properties";

          //java 程序
          InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目錄下
          prop.load(in);
          in.close();

          OutputStream out = new FileOutputStream(path); // path為通過頁面傳入的路徑
          prop.setProperty("abc", “abcccccc");
          prop.store(out, “–test–");
          out.close();

          3.只通過Java程序操作資源文件
          InputStream in = new FileInputStream("abc.properties"); // 放在classes同級

          OutputStream out = new FileOutputStream("abc.properties");

          posted @ 2007-06-12 10:26 imcb 閱讀(1688) | 評論 (0)編輯 收藏

          DEBUG的使用

          名稱 解釋 格式
          a (Assemble) 逐行匯編 a [address]
          c (Compare) 比較兩內存塊 c range address
          d (Dump) 內存16進制顯示 d [address]或 d [range]
          e (Enter) 修改內存字節 e address [list]
          f (fin) 預置一段內存 f range list
          g (Go) 執行程序 g [=address][address...]
          h (Hexavithmetic) 制算術運算 h value value
          i (Input) 從指定端口地址輸入 i pataddress
          l (Load) 讀盤 l [address [driver seetor>
          m (Move) 內存塊傳送 m range address
          n (Name) 置文件名 n filespec [filespec...]
          o (Output) 從指定端口地址輸出 o portadress byte
          q (Quit) 結束 q
          r (Register) 顯示和修改寄存器 r [register name]
          s (Search) 查找字節串 s range list
          t (Trace) 跟蹤執行 t [=address] [value]
          u (Unassemble) 反匯編 u [address ]或range
          w (Write) 存盤 w [address[driver sector secnum>
          ? 聯機幫助 ?

          debug小匯編a命令

          debug小匯編a命令是一個很有用的功能,許多的小程序都要他來做。

          編一些小程序比匯編要來得方便,快潔。
          在Debug中,中斷是非常有用的,首先,讓我們先了解一下中斷。
          所謂中斷,其實,就是,當你做某事時,有人過來找你有其他事,你先放下手中的事(計算機中,稱為保護現場)
          ,再去與叫你的那個人辦事去,等完了,你又回,接著做剛才的事。這是個很通俗的講法。
          計算機在運行時,也會出現這種情況,我們叫之中斷。
          下面是他的一些常用中斷向量的入口值詳解:(記住哦,很用的...呵呵)




          IBM PC 中斷 int10
          ooH 屏幕方式設置

          入口:AH=0,AL=顯示方式代碼(0--6)
          0:40*25 黑白
          1:40*25 彩色
          2:80*25 黑白
          3:80*25 彩色文本
          4:320*200 彩色
          5:320*200 黑白
          6:640*200 黑白圖形模式
          7:80*25 單色字符(單色顯示器)

          0BH 色彩設置
          入口:AH=0B,BL=0 設背景色,BH=0--15 BL=1 設調色碼,BH=0--1
          0CH 寫圖形點
          入口:AH=0C,CX:DX=列號:行號,AL=顏色
          ODH 讀圖形點
          入口:AH=0D,CX:DX=列號:行號
          返回:AL=顏色
          0EH 在當前頁、當前光標處寫字符
          入口:AH=0E,AL=字符的ASCII碼,BL=前景色
          OFH 顯示器狀態
          入口:AH=0F
          返回:AL=當前顯示器方式,AH=屏幕列數,BH=當前頁號

          01H 光標設置
          入口:AH=1,CH=光標起始行號(00--0C),CL=光標結束行號(00--0C)
          注:CH > CL
          02H 光標定位
          入口:AH=2,BH=頁號,DH:DL=起始行:列
          03H 讀光標位置
          入口:AH=3,BH=頁號。
          返回:DH:DL=起始行:列
          06H 窗口上卷
          入品:AH=6,AL=窗口上卷行數,CH:CL-DH:DL 窗口坐標
          注:AL=0 卷動整個窗口
          07H 窗口下卷
          入口:AH=7,AL=窗口下卷行數,CH:CL-DH:DL 窗口坐標
          08H 讀當前光標處字符和屬性
          入口:AH=8,BH=頁號。
          返回:AH:AL=字符的顏色:字符的ASCII碼
          注:顏色代碼見下對照表
          09H:在當前光標處寫字符和屬性
          注:光標不下移
          入口:AH=9,BH=頁號,BL:AL=字符的顏色:字符的ASCII碼,CX=重復次數
          1 2 3 4 5 6 7 8
          BL R G B I R G B
          閃爍 字符底色 加亮 字符顏色

          中斷向量號表

          中斷號 解釋 中斷號 解釋
          0 除數為0錯 19 引導裝入程序
          1 音步中斷 1A 日時調用
          2 不可屏蔽中斷NMI 1B 鍵盤阻斷時得到控制權
          3 斷電中斷(CCH) 1C 時鐘中斷時得到控制權
          4 溢出中斷 1D 指向CRT初始參數表
          5 屏幕打印中斷 1E 指向盒帶參數表
          6-7 保留 1F 1KB圖形模式
          8 計時器中斷(18.2秒) 20 結束DOS程序
          9 鍵盤中斷 21 DOS功能調用
          A-D 保留 22 結束地址(建義用EXEC)
          E 軟盤機中斷 23 DOS Crtl-Break退出地址
          F 保留 24 DOS致命錯向量
          10 屏幕I/O調用 25 DOS絕對磁盤讀
          11 設備檢查調用 26 DOS絕對磁盤寫
          12 存儲器檢查調用 27 結束程序并駐留(建義用31h)
          13 軟盤機I/O調用 28-3F DOS保留
          14 RS-233I/O調用 40-7F 未用
          15 盒帶機I/O調用 80-85 BASIC保留
          16 鍵盤I/O調用 86-F0 BASIC解釋程序用
          17 打印機I/O調用 F1-FF 未用
          18 ROM-BASIC入口


          指令名詳解
          call 指令(過程調用)(控制指令-長轉移)

          詳解:

          段內直接調用

          段內間接調用(寄存器)

          段內間接調用(存儲器)

          段間直接調用

          段間間接調用

          指令名
          jmp 指令(無條件轉移指令)(控制指令-長轉移)

          詳解:
          段內直接跳轉

          短段內直接跳轉

          段內間接跳轉(寄存器)

          段內間接跳轉(存儲器)

          段間直接跳轉

          段間間接跳轉

          指令名
          ret 指令(過程返回)(控制指令-長轉移)

          詳解:

          段內返回

          段內返回立即數加于sp

          段間返回

          段間返回立即數加于sp

          na/jnbe 指令(控制指令-短轉移) 不小于或不等于時轉移

          jae/jnb 指令 (控制指令-短轉移) 大于或等于時轉移

          jb/jnae 指令 (控制指令-短轉移) 小于轉移

          jbe/jna 指令 (控制指令-短轉移) 小于或等 于轉移

          jg/jnle 指令(控制指令-短轉移) 大于轉移

          jge/jnl 指令 (控制指令-短轉移) 大于或等于轉移

          jl/jnge 指令 (控制指令-短轉移) 小于轉移

          jle/jng 指令 (控制指令-短轉移) 小于或等 于轉移

          je/jz 指令 (控制指令-短轉移) 等于轉移

          jne/jnz 指令 (控制指令-短轉移) 不等于轉移

          jc 指令 (控制指令-短轉移) 有進位時轉移

          jnc 指令 (控制指令-短轉移) 列進位時轉移
          jno 指令 (控制指令-短轉移) 不溢出時轉移
          jnp/jpo 指令 (控制指令-短轉移) 奇偶性為奇數時轉移

          jns 指令 (控制指令-短轉移) 符號位為"0"轉移

          jo 指令 (控制指令-短轉移) 溢出轉移

          jp/jpe 指令 (控制指令-短轉移) 奇偶性為偶數時轉移

          js 指令 (控制指令-短轉移) 符號位為"1"時轉移

          loop 指令 (循環控制指令-短轉移) cx 不為0時循環

          loope/loopz 指令 (循環控制指令-短轉移) cx 不為0且標志 z=1 時循環

          loopne/loopnz 指令 (循環控制指令-短轉移) cx 不為0且標志 z=0 時循環

          jcxz 指令 (循環控制指令-短轉移) cx 為0時轉移

          ★int 指令 (中斷指令) 中斷指令(后詳解)

          into 指令 (中斷指令) 溢出中斷

          iret 指令 (中斷指令) 中斷返回


          指令名
          shl 指令(邏輯左移)
          sal 指令(算術左移)
          shr 指令(邏輯右移)
          sar 指令(算術右移) 寄存器,1
          rol 指令(循環左移) 寄存器,cl
          ror 指令(循環右移) 存儲器,1
          rcl 指令(通過進位的循環左移)存儲器,cl
          rcr 指令(通過進位的循環右移)(邏輯運算)


          not 指令(取反運算)寄存器求反

          (邏輯運算)存儲器求反

          and 指令(與運算) (邏輯運算)

          寄存器 and 寄存器 寄存器
          寄存器 and 存儲器 寄存器

          存儲器 and 寄存器 存儲器

          立即數 and 存儲器 存儲器

          立即數 and 累加器 累加器

          or 指令(或運算)(邏輯運算)

          寄存器 or 寄存器 寄存器
          寄存器 or 存儲器 寄存器

          存儲器 or 寄存器 存儲器

          立即數 or 存儲器 存儲器

          立即數 or 累加器 累加器

          test 指令(測試) (邏輯運算)

          寄存器 test 寄存器
          寄存器 test 存儲器
          寄存器 test 立即數
          存儲器 test 立即數
          累加器 test 立即數

          movs 指令(串傳送)(字符串操作指令)
          單個傳送
          重復傳送

          cmps 指令(串比較) (字符串操作指令)
          單個比較
          重復比較

          scas 指令(串掃描)(字符串操作指令)
          單個搜索
          重復搜索

          lods 指令(裝入串)
          (字符串操作指令)
          單個裝載
          重復裝載

          stos 指令(保存串) (字符串操作指令)
          單個存儲
          重復存儲

          mov 指令(傳送字或字節)(數據傳送命令)
          寄存器與寄存器間傳送
          存儲器與寄存器間傳送
          立即數傳送給存儲器
          立即數傳送給寄存器
          存儲器傳送給累加器
          累加器傳送存儲器
          寄存器傳送給段寄存器
          存儲器傳送給段寄存器
          段寄存器傳送給寄存器
          段寄存器傳送給存儲存器

          pop 指令(把字彈出堆棧) (數據傳送命令)

          push 指令(把字壓入堆棧)
          存儲器
          寄存器
          段寄器
          xchg 指令(交換字或字節) (數據傳送命令)
          寄存器與寄存器交換
          存儲器與寄存器交換
          寄存器與累加器交換

          in 指令(端口輸入) (數據傳送命令)
          直接輸入
          間接輸入

          out 指令(端口輸出) (數據傳送指令)
          直接輸出
          間接輸出

          add 指令(加法)(算術指令)
          adc 指令(帶進位加法)
          寄存器+寄存器 寄存器
          寄存器+存儲器 寄存器
          存儲器+寄存器 存儲器
          立即數+存儲器 存儲器
          立即數+累加器 累加器

          inc 指令(加1)(算術指令)
          存儲器增量
          寄存器增量

          sub 指令(減法) (算術指令)
          sbb 指令(帶借位減法)
          寄存器-寄存器 寄存器
          寄存器-存儲器 寄存器
          存儲器-寄存器 存儲器
          立即數-存儲器 存儲器
          立即數-累加器 累加器

          dec 指令(減1)(算術指令)
          存儲器減量
          寄存器減量

          nec 指令(求反,以0減之)
          寄存器求補
          存儲器求補

          cmp 指令(比較)(算術指令)
          寄存器與寄存器比較
          寄存器與存儲器比較
          寄存器與立即數比較
          存儲器與立即數比較
          累加器與立即數比較

          mul 指令(無符號乘法) (算術指令)
          imul 指令(整數乘法)
          與8位寄存器相乘
          與16位寄存器相乘
          與8位存儲單元相乘
          與16位存儲單元相乘

          div 指令(無符號除法)(算術指令)
          idiv 指令(整數除法)
          被8位寄存器除
          被16位寄存器除
          被8位存儲單元除
          被16位存儲單元除


          Debug實戰
          1.查看主板的生產日期,版本
          D ffff:05
          D fe00:0e

          2.模擬Rest鍵功能
          A
          :100 jmp ffff:0000
          :105
          g

          3.快速格式化軟盤
          L 100 0 0 * '插入一張己格式化軟盤
          W 100 0 0 * '放入一張欲格式化軟盤
          注:* 分別為:720K e |1.2M id |1.44M 21

          4.硬盤格式化兩種方法
          (1)G=c800:05
          (2) A 100
          mov ax,0703
          mov cx,0001
          mov dx,0080
          int 13
          int 3
          g 100
          5.加速鍵盤
          A
          mov ax,0305
          mov bx,0000
          int 16
          int 20
          rcx
          10
          n fast.com
          w
          q

          6.關閉顯示器(恢復時,按任意鍵)

          A
          mov ax,1201
          mov bl,36
          int 10
          mov ah,0
          int 16
          mov ax,1200
          int 10
          rcx
          10
          n crt-of.com
          w
          q
          7.硬盤DOS引導記錄的修復
          在軟驅中放入一張己格式化軟盤
          debug
          -l 100 2 0 1
          -w 100 0 50 1
          把軟盤放入故障機軟驅中
          debug
          -l 100 0 50 1
          -w 100 2 0 1
          -q
          8.清coms中setup口令
          debug
          -a
          mov bx,0038
          mov cx,0000
          mov ax,bx
          out 70,al
          inc cx
          cmp cx,0006
          jnz 0106
          int 20
          -rcx
          :20
          -nclearpassword.com
          -w
          -q
          注:以上適合super與dtk機,對于ast機,因為他的口令放在coms的4ch-51h地址處,只要將:mov bx,0038 改為: mov
          bx,004c即可
          9.取消coms的密碼(將coms數據清為初始化)
          -o 70,10
          -o 71,10
          -g
          -q
          10.將硬盤主引導記錄保存到文件中

          debug
          -a
          mov ax,0201
          mov bx,0200
          mov cx,0001
          mov dx,0080
          mov int 13
          int 3
          -rcx
          :200
          -nboot.dat
          -w
          -q
          11.調用中斷實現重啟計算機(可以成文件)
          debug
          -a
          int 19
          int 20
          -rcx
          :2
          -nreset.com
          -w
          -q




          DEBUG主要命令

          DEBUG是為匯編語言設計的一種高度工具,它通過單步、設置斷點等方式為匯編語言程序員提供了非常有效的調試手段。
          一、DEBUG程序的調用
          在DOS的提示符下,可鍵入命令:
          C:\DEBUG [D:][PATH][FILENAME[.EXT>[PARM1][PARM2]
          其中,文件名是被調試文件的名字。如用戶鍵入文件,則DEBUG將指定的文件裝入存儲器中,用戶可對其進行調試。如果未鍵入文件名,則用戶可以用當前存儲器的內容工作,或者用DEBUG命令N和L把需要的文件裝入存儲器后再進行調試。命令中的D指定驅動器PATH為路徑,PARM1和PARM2則為運行被調試文件時所需要的命令參數。
          在DEBUG程序調入后,將出現提示符,此時就可用DEBUG命令來調試程序。
          二、DEBUG的主要命令
          1、顯示存儲單元的命令D(DUMP),格式為:
          _D[address]或_D[range]
          例如,按指定范圍顯示存儲單元內容的方法為:
          -d100 120
          18E4:0100 c7 06 04 02 38 01 c7 06-06 02 00 02 c7 06 08 02 G...8.G.....G...
          18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ..;..h..M PQVW.
          7
          18E4:0120 8B
          其中0100至0120是DEBUG顯示的單元內容,左邊用十六進制表示每個字節,右邊用ASCII字符表示每個字節,·表示不可顯示的字符。這里沒有指定段地址,D命令自動顯示DS段的內容。如果只指定首地址,則顯示從首地址開始的80個字節的內容。如果完全沒有指定地址,則顯示上一個D命令顯示的最后一個單元后的內容。
          2、修改存儲單元內容的命令有兩種。
          ·輸入命令E(ENTER),有兩種格式如下:第一種格式可以用給定的內容表來替代指定范圍的存儲單元內容。命令格式為:
          -E address [list]
          例如,-E DS:100 F3'XYZ'8D
          其中F3,'X','Y','Z'和各占一個字節,該命令可以用這五個字節來替代存儲單元DS:0100到0104的原先的內容
          第二種格式則是采用逐個單元相繼修改的方法。命令格式為:
          -E address
          例如,-E DS:100
          則可能顯示為:
          18E4:0100 89.-
          如果需要把該單元的內容修改為78,則用戶可以直接鍵入78,再按"空格"鍵可接著顯示下一個單元的內容,如下:
          18E4:0100 89.78 1B.-
          這樣,用戶可以不斷修改相繼單元的內容,直到用ENTER鍵結束該命令為止。
          ·填寫命令F(FILL),其格式為:
          -F range list
          例如:-F 4BA:0100 5 F3'XYZ'8D
          使04BA:0100~0104單元包含指定的五個字節的內容。如果list中的字節數超過指定的范圍,則忽略超過的項;如果list的字節數小于指定的范圍,則重復使用list填入,直到填滿指定的所有單元為止。
          3)檢查和修改寄存器內容的命令R(register),它有三種格式如下:
          ·顯示CPU內所有寄存器內容和標志位狀態,其格式為:
          -R
          例如,-r
          AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
          DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC
          18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000
          ·顯示和修改某個寄存器內容,其格式為:
          -R register name
          例如,鍵入
          -R AX
          系統將響應如下:
          AX F1F4

          即AX寄存器的當前內容為F1F4,如不修改則按ENTER鍵,否則,可鍵入欲修改的內容,如:

          -R bx
          BX 0369
          :059F
          則把BX寄存器的內容修改為059F。
          ·顯示和修改標志位狀態,命令格式為:
          -RF系統將響應,如:
          OV DN EI NG ZR AC PE CY-
          此時,如不修改其內容可按ENTER鍵,否則,可鍵入欲修改的內容,如:
          OV DN EI NG ZR AC PE CY-PONZDINV
          即可,可見鍵入的順序可以是任意的。
          4)運行命令G,其格式為:
          -G[=address1][address2[address3…>
          其中,地址1指定了運行的起始地址,如不指定則從當前的CS:IP開始運行。后面的地址均為斷點地址,當指令執行到斷點時,就停止執行并顯示當前所有寄存器及標志位的內容,和下一條將要執行的指令。
          5)跟蹤命令T(Trace),有兩種格式:
          ·逐條指令跟蹤
          -T [=address]
          從指定地址起執行一條指令后停下來,顯示所有寄存器內容及標志位的值。如未指定地址則從當前的CS:IP開始執行。
          ·多條指令跟蹤
          -T [=address][value]
          從指定地址起執行n條指令后停下來,n由value指定。
          6)匯編命令A(Assemble),其格式為:
          -A[address]
          該命令允許鍵入匯編語言語句,并能把它們匯編成機器代碼,相繼地存放在從指定地址開始的存儲區中。必須注意:DEBUG把鍵入的數字均看成十六進制數,所以如要鍵入十進制數,則其后應加以說明,如100D。
          7)反匯編命令U(Unassemble)有兩種格式。
          ·從指定地址開始,反匯編32個字節,其格式為:
          -U[address]
          例如:
          -u100
          18E4:0100 C70604023801 MOV WORD PTR[0204],0138
          18E4:0106 C70606020002 MOV WORD PTR[0206],0200
          18E4:010C C70606020202 MOV WORD PTR[0208],0202
          18E4:0112 BBO4O2 MOV BX,0204
          18E4:0115 E80200 CALL 011A
          18E4:0118 CD20 INT 20
          18E4:011A 50 PUSH AX
          18E4:011B 51 PUSH CX
          18E4:011C 56 PUSH SI
          18E4:011D 57 PUSH DI
          18E4:011E 8B37 MOV SI,[BX]
          如果地址被省略,則從上一個U命令的最后一條指令的下一個單元開始顯示32個字節。
          ·對指定范圍內的存儲單元進行反匯編,格式為:
          -U[range]
          例如:
          -u100 10c
          18E4:0100 C70604023801 MOV WORD PTR[0204],0138
          18E4:0106 C70606020002 MOV WORD PTR[0206],0200
          18E4:010C C70606020202 MOV WORD PTR[0208],0202

          -u100 112
          18E4:0100 C70604023801 MOV WORD PTR[0204],0138
          18E4:0106 C70606020002 MOV WORD PTR[0206],0200
          18E4:010C C70606020202 MOV WORD PTR[0208],0202

          可見這兩種格式是等效的。
          8)命名命令N(Name),其格式為:
          -N filespecs [filespecs]
          命令把兩個文件標識符格式化在CS:5CH和CS:6CH的兩個文件控制塊中,以便在其后用L或W命令把文件裝入存盤。filespecs的格式可以是:
          [d:][path] filename[.ext]
          例如,
          -N myprog
          -L
          -
          可把文件myprog裝入存儲器。
          9)裝入命令(Load),有兩種功能。
          ·把磁盤上指定扇區范圍的內容裝入到存儲器從指定地址開始的區域中。其格式為:
          -L[address[drive sector sector]
          ·裝入指定文件,其格式為:
          -L[address]
          此命令裝入已在CS:5CH中格式化了文件控制塊所指定的文件。如未指定地址,則裝入CS:0100開始的存儲區中。
          10)寫命令W(Write),有兩種功能。
          ·把數據寫入磁盤的指定扇區。其格式為:
          -W address drive sector sector
          ·把數據寫入指定的文件中。其格式為:
          -W[address]
          此命令把指定的存儲區中的數據寫入由CS:5CH處的文件控制塊所指定的文件中。如未指定地址則數據從CS:0100開始。要寫入文件的字節數應先放入BX和CX中。
          11)退出DEBUG命令Q(Quit),其格式為:
          -Q
          它退出DEBUG,返回DOS。本命令并無存盤功能,如需存盤應先使用W命令。

          問題:初學者問一個低級問題,執行debug-a后,如果有一行輸入錯誤,如何更改這一行?

          回答:
          加入進行如下輸入:
          D:\PWIN95\Desktop>debug
          -a
          2129:0100movax,200
          2129:0103movbx,200
          2129:0106movcx,200
          2129:0109
          此時,發現movbx,200一句錯誤,應為movbx,20,可以敲回車返回"-"狀態,然后輸入:
          -a103
          2129:0103movbx,20
          如果多或者少若干行,不必重新輸入,可以用M命令移動后面的程序來去掉或者增加程序空間.


          A.程序調用命令

          C>DEBUG [D:] [PATH] [FILENAME[.EXT]] [PARM1] [PARM2]

          其中,文件名是被調試文件的名字。如未鍵入文件名。可用DEBUG命令N和L把需要文件裝入存儲器后再調試。D指定驅動器,PATH為路徑,FILENAME為文件名,PARM為命令參數

          B.顯示存儲單元命令

          -D [ADDRESS]或 ;ADDRESS 地址

          -D [RANGE] ;RANGE 范圍

          C.修改存儲單元內容命令

          -E ADDRESS [LIST]

          D.檢查和修改寄存器內容命令

          -R [REGISTER NAME] ;Register name 寄存器名字

          E.匯編命令

          -A [ADDRESS]

          F.跟蹤命令

          -T [=ADDRESS] [VALUE] ;Value 變量值

          G.運行命令

          -G [=ADDRESS ] [ADDRESS2 [ADDRESS3]

          H.反匯編命令

          -U [ADDRESS]

          -U [RANGE]

          I.命名命令

          -N FILESPECS [FILESPECS]

          FILESPECS的格式可為[D:][PATH]FILENAME [.EXT]

          J.裝入命令

          -L [ADDRESS[DRIVE SECTOR SECTOR]] ;DRIVE SECTOR 磁盤 扇區

          K.寫命令

          W ADDRESS DRIVE SECTOR

          L.退出命令

          -Q

          posted @ 2007-06-02 13:10 imcb 閱讀(534) | 評論 (0)編輯 收藏

          通過HREF調用javascript

          通過HREF就可以調用javascript,有兩種方法十分簡單,如下:
          方法1
          <A HREF="javascript:myFunction()">

             Click here for Javascript action!</A>  

          注:如果Javascript被瀏覽器禁用,會有一個錯誤提示警告讀者無法運行Javascript程序。
          方法2
          <A HREF="nojavascripthere.htm"

            onClick="myFunction(); return false">

             Click here for Javascript action!

          </A>  

          注:如果Javascript被瀏覽器禁用,會顯示一個頁面警告讀者無法運行Javascript程序。

          posted @ 2007-06-01 11:26 imcb 閱讀(10152) | 評論 (0)編輯 收藏

          僅列出標題
          共3頁: 上一頁 1 2 3 下一頁 

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 上杭县| 宝应县| 伽师县| 海原县| 柘城县| 象州县| 汉中市| 从江县| 西乡县| 平昌县| 即墨市| 朝阳县| 米泉市| 古丈县| 永新县| 清水县| 海口市| 连山| 京山县| 英吉沙县| 富民县| 巴马| 新闻| 石首市| 独山县| 搜索| 视频| 建昌县| 山阴县| 丹阳市| 东台市| 海门市| 盖州市| 敦化市| 嘉兴市| 邮箱| 赤水市| 横峰县| 潜山县| 武川县| 玉屏|