posts - 15, comments - 20, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2009年8月31日

       刚开始使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,对Excel2003以前(包括2003)的版本没有问题,但读取Excel2007时发生如下异常:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

        该错误意思是说,文件中的数据是用Office2007+XML保存的,而现在却调用OLE2 Office文档处理,应该使用POI不同的部分来处理这些数据,比如使用XSSF来代替HSSF。

        于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)来读取Workbook,对Excel2007没有问题了,可是在读取Excel2003以前(包括2003)的版本时却发生了如下新异常(真是太悲剧了):
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
        该错误是说,操作无效,不能打开指定的xls文件。

        下载POI的源码后进行单步调试,发现刚开始的时候还是对的,但到ZipFile类后就找不到文件了,到网上查了下,原来是XSSF不能读取Excel2003以前(包括2003)的版本,这样的话,就需要在读取前判断文件是2003前的版本还是2007的版本,然后对应调用HSSF或XSSF来读取。
        这是初步的想法,但这种做法比较麻烦,看了下API,发现XSSF和HSSF虽然在不同的包里,但却引用了同一接口Workbook,于是想到了这样的读取方法:
        Workbook book = null;
        try {
            book = new XSSFWorkbook(excelFile);
        } catch (Exception ex) {
            book = new HSSFWorkbook(new FileInputStream(excelFile));
        }
        在各版本的Excel中测试,没有发生异常,问题解决。

posted @ 2011-03-16 16:17 spinage 阅读(12668) | 评论 (1)编辑 收藏

   最近遇到了request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1,这是为什么呢,照道理讲,应该是127.0.0.1才对,为什么这个获取的值变成了ipv6了呢,而且我发现这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现,用127.0.0.1不会出现),后来上网查了查原因,原来是/etc/hosts这个东西作怪(在windows上应该是C:\Windows\system32\drivers\etc\ hosts这个文件),只需要注释掉文件中的 # ::1 localhost 这一行即可解决问题。另外localhost这个文件很有用,这里你可以添加自己的条目,例如添加 192.168.0.111 buyer.com这样子,在浏览器中原来只能使用192.168.0.111来访问的,并可以使用 buyer.com来进行替换。

posted @ 2011-03-16 16:08 spinage 阅读(933) | 评论 (1)编辑 收藏

假设当前已执行:select * from tab;

   (a)ppend 添加文本到缓冲区当前行尾

       例: SQL>a  order by tname

  结果:select * from tab order by tname;

  (注:a后面跟2个空格)

  (c)hange/old/new 在当前行用新的文本替换旧的文本

  例:SQL>c/*/tname

  结果:select tname from tab;

  (c)hange/text 从当前行删除文本

  例:SQL>c/tab

  结果:select tname from ;

   del 删除当前行

    del n 删除第n行 

  (i)nput 文本 在当前行之后添加一行 

  (l)ist 显示缓冲区中所有行 

  (l)ist n 显示缓冲区中第 n 行 

  (l)ist m n 显示缓冲区中 m 到 n 行

  (r)un 执行当前缓冲区的命令

  /  执行当前缓冲区的命令

  @文件名 运行调入内存的sql文件

     例:SQL> edit s<回车>

  如果当前目录下不存在s.sql文件,则系统自动生成s.sql文件,

  在其中输入“select * from tab;”,存盘退出。

  SQL> @s<回车>

    系统会自动查询当前用户下的所有表、视图、同义词。

      @@文件名 在.sql文件中调用另一个.sql文件时使用

      例:SQL>edit test<回车>

           在其中输入"@s",存盘退出。(这里s为上例中创建的sql文件)

           SQL>@@test<回车>

           结果就是执行了文件s.sql中的语法:自动查询当前用户下的所有表、视图、同义词。

  save 文件名             将缓冲区的命令以文件方式存盘,缺省文件扩展名为.sql

  get 文件名           调入存盘的sql文件

  start 文件名         运行调入内存的sql文件

  spool 文件名        把这之后的各种操作及执行结果“假脱机”即存盘到磁盘文件上,默认文件扩展名为.lst

    spool                 显示当前的“假脱机”状态

    spool off            停止输出

  例:

  SQL> spool a

  SQL> spool

  正假脱机到 A.LST

  SQL> spool off

  SQL> spool

  当前无假脱机

  exit             退出SQL*PLUS

  desc 表名     显示表的结构

  show user     显示当前连接用户

  show error    显示错误

  show all       显示所有68个系统变量值

  edit                打开默认编辑器,Windows系统中默认是notepad.exe,把缓冲区中最后一条SQL语句调入afiedt.buf文件中进行编辑

    edit 文件名   把当前目录中指定的.sql文件调入编辑器进行编辑

   clear screen   清空当前屏幕显示

posted @ 2010-04-06 16:04 spinage 阅读(315) | 评论 (0)编辑 收藏

关于在MyEclipseWEB工程里面的JS/JSP经常会有语法错误提示,这是由于MyEclipse对其语法要求相当严格所造成的,而这些文件本身是可以运行并没有什么错误的,在你实际应用部署中并无影响.

此问题解决办法有两种:

一、就是您不用去管它提示,直接部署到你的WEB容器上运行是可以的,但此方法欠妥当。

二、选择你的工程右击菜单——>点击MyEclipse菜单项的Exclude From Validation,如果你的工程里还有其它需要它检验其合法性建议可以针对某一文件夹或具体文件进行此项操作,这样可以只针对WEB工程里的某一个文件夹里面的JSP/JS文件来进行验证排除,这样就不会对这些被排除的文件或文件夹进行验证了,不过再你打开这些文件时,文件里面是有错误提示的,但工程是不会出现语法错误提示的。这样不仅解决了工程总提示语法信息错误的烦恼,对于一些确实存在问题的文件也可以查看其错误问题所在,可谓一举两得。

另外还可以通过使用Remove All Validation Markers此菜单项进移除所有的验证语法错误提示信息。

posted @ 2010-04-06 13:29 spinage 阅读(2344) | 评论 (2)编辑 收藏

Tomcat:
IOException while loading persisted sessions: java.io.EOFException解决

严重: IOException while loading persisted sessions: java.io.EOFException
严重: Exception loading sessions from persistent storage

原因是tomcat对硬盘的session读取失败,彻底解决办法一下:将work下面的文件清空,主要是*.ser文件,或者只是删除掉session.ser即可以解决。

posted @ 2010-03-24 09:57 spinage 阅读(234) | 评论 (0)编辑 收藏

eclipse 无法启动 JVM terminated. Exit code=-1
eclipse.ini中内存设置过大的问题,以前我修改过内存设置,一直都好好的,之前eclipse.ini的配置如下:

 

-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-Duser.language=en
-XX:PermSize=256M
-XX:MaxPermSize=512M

现在修改了一下,-Xms256m改成-Xms128m,把Xmx512m  改为 Xmx256m,结果还真的好了,没想到居然是这样的小问题引起来的。

====================================================================================

第二个,我们的项目采用svn管理,查找.svn,把所有.svn的文件删除

第三个,查看项目根文件夹下的.metadata,发现.metadata下面差很多插件,把现有项目的.metadate覆盖进去即可

 

posted @ 2010-01-26 09:12 spinage 阅读(334) | 评论 (0)编辑 收藏

 

1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。
2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。
3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。
4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生
隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5,此时不走索引的情况类似于case3。日期转换也有类似问题,如:
select * from t where trunc(date_col) = trunc(sysdate)其中date_col为索引列,这样写不会走索引,可改写成select * from t where date_col >= trunc(sysdate)
and date_col < trunc(sysdate+1),此查询会走索引。
5、并不是所有情况使用索引都会加快查询速度,full scan table 有时会更快,尤其是当查询的数据量占整个表的比重较大时,因为full scan table采用的是多块读,
当Oracle优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。

6、<>

7、like’%dd’百分号在前

8、not in ,not exist. 

posted @ 2010-01-14 15:16 spinage 阅读(2027) | 评论 (0)编辑 收藏

利用pinyin4j开源的一个小项目取中文首字母
 
public static String getAllFirstLetter(String str) {
  String convert = "";
  for (int j = 0; j < str.length(); j++) {
   char word = str.charAt(j);
   String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
   if (pinyinArray != null) {
    convert += pinyinArray[0].charAt(0);
   } else {
    convert += word;
   }
  }
  return convert;
 }

posted @ 2009-11-27 10:30 spinage 阅读(863) | 评论 (0)编辑 收藏

 在许多开源的框架中都充分的利用了设计模式这一概念,Struts典型的MVC模式的化身,Spring是工厂模式和单例模式的充分体现。在项目开发中,能充分利用设计模式的思想来考虑问题,来解决问题,来通过代码去实现。不但可以提高代码的质量,对程序的扩展,重用带来很大方便。其实我们项目中用设计模式编程就是加了一个封装层,减少客户必须处理的对象的数量。

 在设计模式中一般都遵循这样的原则:
      (1)按接口编程。
      (2)尽量用聚合代替继承。
      (3)找出变化并封装之。
     上面主要讲了一些设计模式的作用和原则。接下来是我对门面模式的一个简单理解。Facade(门面模式)是美国著名的四人帮(GOF)写的23种模式之一。
       简单的理解:我们需要用一种比原有的方法更简单的方法与系统交互,或者说,我们需要以一种特殊的方式使用系统。主要是为子系统中的一组接口提供一个统一的接口。Facade模式定义了一个更高的接口,使子系统更加容易使用。它的意图要求一个一致的高层接口。

posted @ 2009-11-27 10:25 spinage 阅读(295) | 评论 (0)编辑 收藏

序列化机制只保存对象的类型信息,属性的类型信息和属性值,和方法没有什么关系,你就是给这个类增加10000个方法,序列化内容也不会增加任何东西。

posted @ 2009-11-24 11:01 spinage 阅读(201) | 评论 (0)编辑 收藏

1.写一个方法,用一个for循环打印九九乘法表
Java code   
    /**
     * 打印九九乘法口诀表
     */
    public void nineNineMulitTable(){
        for (int i = 1,j = 1; j <= 9; i++) {
              System.out.print(i+"*"+j+"="+i*j+" ");
              if(i==j){
                  i=0;
                  j++;
                  System.out.println();
              }
          }
    }

 

2.给定一个java.util.Date对象,如何转化为”2007-3-22 20:23:22”格式的字符串
  Java code
    /**
     * 将某个日期以固定格式转化成字符串
     * @param date
    * @return str
    */
    public String date2FormatStr(Date date)
    {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      String str = sdf.format(date);
      return str;
    }

3.写一个方法,能够判断任意一个整数是否素数
 
    /**
    * 判断任意一个整数是否素数
    * @param num
    * @return boolean
    */
    public boolean isPrimeNumber(int num)
    {
      for (int i = 2; i <= Math.sqrt(num); i++) {
          if(num%i==0)
          {
              return false;
          }
      }
      return true;
    }
4.写一个方法,输入任意一个整数,返回它的阶乘
Java code    
     /**
      *获得任意一个整数的阶乘
      *@param n
      *@returnn!
      */
      public int factorial(int num)
      {
        //递归
        if(num == 1)
        {
            return 1;
        }
        return num*factorial(num-1);
      }

5.写一个方法,用二分查找法判断任意整数在任意整数数组里面是否存在,若存在就返回它在数组中的索引位置,不存在返回-1
Java code    
      /**
       *二分查找特定整数在整型数组中的位置(递归)
       *@param dataset
       *@param data
       *@param beginIndex
       *@param endIndex
       *@return index
       */
       public int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
         int midIndex = (beginIndex+endIndex)/2;
         //如果查找的数要比开始索引的数据要小或者是比结束索引的书要大,或者开始查找的索引值大于结束的索引值返回-1没有查到
         if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
             return -1;
         }
         if(data <dataset[midIndex]){ 
             return binarySearch(dataset,data,beginIndex,midIndex-1);
         }else if(data>dataset[midIndex])
         {
             return binarySearch(dataset,data,midIndex+1,endIndex);
         }else {
             return midIndex;
         }
       }
      
       /**
        *二分查找特定整数在整型数组中的位置(非递归)
        *@param dataset
        *@param data
        *@return index
        */
        public int binarySearch(int[] dataset ,int data)
        {
          int beginIndex = 0; 
          int endIndex = dataset.length - 1; 
          int midIndex = -1;
          if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
              return -1;
          }
          while(beginIndex <= endIndex) {
              midIndex = (beginIndex+endIndex)/2;
              if(data <dataset[midIndex]) { 
                 endIndex = midIndex-1; 
              } else if(data>dataset[midIndex]) { 
                beginIndex = midIndex+1; 
              }else {
                return midIndex;
              }
          }
          return -1;
        }

posted @ 2009-10-27 17:46 spinage 阅读(203) | 评论 (0)编辑 收藏

1.一道SQL语句面试题,关于group by
表内容:
2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负

如果要生成下列结果, 该如何写sql语句?

            胜 负
2005-05-09 2 2
2005-05-10 1 2
------------------------------------------
create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-10','胜')
insert into #tmp values('2005-05-10','负')
insert into #tmp values('2005-05-10','负')

1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq
2) select N.rq,N.勝,M.負 from (
select rq,勝=count(*) from #tmp where shengfu='胜'group by rq)N inner join
(select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq
3)select a.col001,a.a1 胜,b.b1 负 from
(select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,
(select col001,count(col001) b1 from temp1 where col002='负' group by col001) b
where a.col001=b.col001

2.请教一个面试中遇到的SQL语句的查询问题
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
------------------------------------------
select (case when a>b then a else b end ),
(case when b>c then b esle c end)
from table_name

3.面试题:一个日期判断的sql语句?
请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)
------------------------------------------
select * from tb where datediff(dd,SendTime,getdate())=0

4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):  
   大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。  
       显示格式:  
       语文              数学                英语  
       及格              优秀                不及格    
------------------------------------------
select
(case when 语文>=80 then '优秀'
        when 语文>=60 then '及格'
else '不及格' end) as 语文,
(case when 数学>=80 then '优秀'
        when 数学>=60 then '及格'
else '不及格' end) as 数学,
(case when 英语>=80 then '优秀'
        when 英语>=60 then '及格'
else '不及格' end) as 英语
from table

5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?
------------------------------------------
用户临时表:create table #xx(ID int, IDValues int)
系统临时表:create table ##xx(ID int, IDValues int)

区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
当创建它的进程消失时这个临时表就自动删除.

全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.

6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
------------------------------------------
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL    Server的存储容量是可以扩大的.

SQL Server 2000 数据库有三种类型的文件:

主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。

日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。

7.请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。
如使用存储过程也可以。

table1

月份mon 部门dep 业绩yj
-------------------------------
一月份      01      10
一月份      02      10
一月份      03      5
二月份      02      8
二月份      04      9
三月份      03      8

table2

部门dep      部门名称dname
--------------------------------
      01      国内业务一部
      02      国内业务二部
      03      国内业务三部
      04      国际业务部

table3 (result)

部门dep 一月份      二月份      三月份
--------------------------------------
      01      10        null      null
      02      10         8        null
      03      null       5        8
      04      null      null      9

------------------------------------------
1)
select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'
from table1 a,table2 b,table2 c,table2 d
where a.部门dep = b.部门dep and b.月份mon = '一月份' and
a.部门dep = c.部门dep and c.月份mon = '二月份' and
a.部门dep = d.部门dep and d.月份mon = '三月份' and
2)
select a.dep,
sum(case when b.mon=1 then b.yj else 0 end) as '一月份',
sum(case when b.mon=2 then b.yj else 0 end) as '二月份',
sum(case when b.mon=3 then b.yj else 0 end) as '三月份',
sum(case when b.mon=4 then b.yj else 0 end) as '四月份',
sum(case when b.mon=5 then b.yj else 0 end) as '五月份',
sum(case when b.mon=6 then b.yj else 0 end) as '六月份',
sum(case when b.mon=7 then b.yj else 0 end) as '七月份',
sum(case when b.mon=8 then b.yj else 0 end) as '八月份',
sum(case when b.mon=9 then b.yj else 0 end) as '九月份',
sum(case when b.mon=10 then b.yj else 0 end) as '十月份',
sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',
sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',
from table2 a left join table1 b on a.dep=b.dep

8.华为一道面试题
一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
------------------------------------------
select id, Count(*) from tb group by id having count(*)>1
select * from(select count(ID) as count from table group by ID)T where T.count>1

posted @ 2009-10-27 13:05 spinage 阅读(566) | 评论 (2)编辑 收藏

拼音排序
拼音有好几种方式,其中最主要的是中华人民共和国的汉语拼音 Chinese Phonetic。对汉字的排序有两种:一种是宽松的,能够按拼音排序最常用的汉字,另一种是严格的,能够按拼音排序绝大部分大部分汉字。

宽松的拼音排序法
原理:汉字最早是GB2312编码,收录了六千多个汉字,是按拼音排序的,编码是连续的。 后来出现了GBK编码,对GB2312进行了扩展,到了两万多汉字,并且兼容GB2312,也就是说GB2312中的汉字编码是原封不动搬到GBK中的(在GBK编码中[B0-D7]区中)。

如果我们只关心这6000多个汉字的顺序,就可以用下面的方法实现汉字宽松排序。

/**
* @author shaob
*
* Copyright (c)
*/

package chinese.utility;

import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class PinyinSimpleComparator implements Comparator<String> {
    public int compare(String o1, String o2) {
        return Collator.getInstance(Locale.CHINESE).compare(o1, o2);
    }
}

在对[孙, 孟, 宋, 尹, 廖, 张, 徐, 昆, 曹, 曾,怡]这几个汉字排序,结果是:[曹, 昆, 廖, 孟, 宋, 孙, 徐, 尹, 曾, 张, 怡]。最后一个 怡 有问题,不该排在最后的。

注意:这个程序有两个不足

由于gb2312中的汉字编码是连续的,因此新增加的汉字不可能再按照拼音顺序插入到已有的gb2312编码中,所以新增加的汉字不是按拼音顺序排的。
同音字比较的结果不等于0 。
下面的测试代码可以证明

/**
* @author shaob
*
* Copyright (c)

/**
* 非常用字(怡)
*/
@Test
public void testNoneCommon() {
    Assert.assertTrue(comparator.compare("怡", "张") > 0);
}

/**
* 同音字
*/
@Test
public void testSameSound() {
    Assert.assertTrue(comparator.compare("怕", "帕") != 0);
}

严格的拼音排序法
为了解决宽松的拼音的两点不足,可以通过实现汉语拼音的函数来解决。goolge下看到sf上有个pinyin4j的项目,可以解决这个问题,pinyin4j的项目地址是:http://pinyin4j.sourceforge.net/。

实现代码:

/**
  * @author shaob
  *
  * Copyright (c)
  */
package chinese.utility;

import java.util.Comparator;
import net.sourceforge.pinyin4j.PinyinHelper;

public class PinyinComparator implements Comparator<String> {

    public int compare(String o1, String o2) {

        for (int i = 0; i < o1.length() && i < o2.length(); i++) {

            int codePoint1 = o1.charAt(i);
            int codePoint2 = o2.charAt(i);

            if (Character.isSupplementaryCodePoint(codePoint1)
                    || Character.isSupplementaryCodePoint(codePoint2)) {
                i++;
            }

            if (codePoint1 != codePoint2) {
                if (Character.isSupplementaryCodePoint(codePoint1)
                        || Character.isSupplementaryCodePoint(codePoint2)) {
                    return codePoint1 - codePoint2;
                }

                String pinyin1 = pinyin((char) codePoint1);
                String pinyin2 = pinyin((char) codePoint2);

                if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字
                    if (!pinyin1.equals(pinyin2)) {
                        return pinyin1.compareTo(pinyin2);
                    }
                } else {
                    return codePoint1 - codePoint2;
                }
            }
        }
        return o1.length() - o2.length();
    }

    /**
     * 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。
     */
    private String pinyin(char c) {
        String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
        if (pinyins == null) {
            return null;
        }
        return pinyins[0];
    }
}

 

posted @ 2009-10-15 16:01 spinage 阅读(4979) | 评论 (0)编辑 收藏

在全局数据库ORCL下创建一个用户
首先在开始--》运行——》sqlplus,然后输入 sys/change_on_install as sysdba
以sys权限登陆进去
然后可以进行操作:
创建用户 create user test indentified by test;
这样就创建了一个用户名密码都为test的用户
但这个时候test还是不能登陆成功的,我们需要赋予相应的权限
首先赋予create session的权限
grant create session to test;
这样test用户就能成功登陆进去
但是此时用户还是不能创建表 我们需要赋予用户创建表的权限:
grant create table to test;
但是用户此时还不能创建表 因为需要有使用表空间的权限(相当于 用户有了进房间的钥匙 但是没有进大门的钥匙)
所以也应该赋予相应的权限
grant unlimited tablespace to test;
这个时候用户就拥有了创建表的权限 由于表是用户test的 相应的他就拥有了对创建的表的增删查改的权限了
我们要查看用户拥有什么权限可以通过查询一个系统的视图(数字字典)
select * from user_sys_privs;
这样就可以知道当前用户的权限

撤销权限 revoke create table from test;

场景:
用户test   用户test1
test1的用户创建了个表mytab 并且插入了一些数据
那么 test用户是否可以访问到test1的mytab怎么访问?
答:不可以,必须先授权
test1必须授权给test :grant select on mytab to test;
那么这个时候test可以通过 select * from test1.mytab;来访问mytab中的数据
如果想把某个表(对象)的所有权限都赋予给test那么可以:
grant all on mytab to test;
撤销所有权限
revoke all on mytab to test;


总结
对于系统权限由sys来做
对于对象权限由 谁拥有谁授权
系统权限:
   grant create session to test;
   grant create table to test;
   grant unlimited tablespace to test;

   revoke create session from test;
   revoke create table from test;
   revoke unlimited tablespase from test;

   grant create session to public;  //表示把创建表的权限赋予所有人

   select * from user_sys_privs;  //返回当前用户的所有系统权限

   grant select on mytab to test;
   grant all on mytab to test;

   revoke select on mytab from test;
   revoke all on mytab from test;

   
   对象权限可以控制到列 (更新和插入操作)
   grant update(name) on mytab to test;
   grant insert(id) on mytab to test;

   select * from user_col_privs;
   注意:查询和删除不能控制到列   
   需要有commit的 insert update insert

  权限的传递
  系统权限的传递:
  grant alter table to A with admin option;
  那么A可以通过把该权限传递给B,如果想B也可以传递下去那么可以也带上with admin option
  grant alter table to B;
  对象权限的传递:
  grant select on mytab to A with grant option;
  那么A可以把在表mytab的select权限赋予给B,如果B想也能传递该select权限也可以带上with grant option
  grant select on mytab to B;

----------------------------------------------------------------------------------------------------------

--创建用户
create user keeltest identified by keeltest;
--分配权限
grant create session,create table,create view ,create any index to keeltest;
grant unlimited tablespace to keeltest;

 

posted @ 2009-09-28 09:41 spinage 阅读(625) | 评论 (0)编辑 收藏

1、需要在你本机安装oracle客户端和pl/sql
2、配置你本机的tnsname文件 (E:\oracle\product\10.1.0\db_1\NETWORK\ADMIN)
在该文件中加入:
数据库名=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = IP )(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = 数据库名)
    )
  )
3、pl/sql连接 数据库名,输入 用户名密码

posted @ 2009-09-24 13:25 spinage 阅读(653) | 评论 (0)编辑 收藏

两种办法:

一、将 @author 属性写死 。

通过菜单 Window->Preference 打开参数设置面板,然后选择:
1.Java -> Code Style -> Code Templates
2.在右侧选择Comments,将其中的Types项,然后选右边的"Edit",进入编辑模式,将 @author ${user} 中的${user}改成你自己的名字即可。

二、修改用户名
控制面板-->计算机管理-->本地用户和组-->用户
使用管理员账户登陆 可以任意修改用户名 ,然后重启电脑,OK 。
PS:XP HOME EDITION 不保证其可用。

posted @ 2009-09-22 10:11 spinage 阅读(451) | 评论 (0)编辑 收藏

由于在svn的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想一些办法。

    解决方案如下:

在Eclipse使用SVN的过程中大多数人往往习惯把访问SVN的用户名密码自动保存起来
以便下次自动使用,不要再次手工输入,但是有些时候需要变更密码或者用户名,
这时候怎么办?在网上查找后发现如下方法:

1. 查看你的Eclipse中使用的是什么SVN Interface
windows > preference > Team > SVN #SVN Interface

2. 如果是用的JavaHL, 找到以下目录并删除auth目录下的文件.
C:"Documents and Settings"[YourUserName]"Application Data"Subversion"

3. 如果你用的SVNKit, 找到以下目录并删除.keyring文件.
[eclipse]"configuration"org.eclipse.core.runtime

    主要有两种方法,一种是删除SVN客户端的账号配置文件;另外一种就是去SVN服务端将账号设置成不可用。

    具体步骤:

    1、通过删除SVN客户端的账号配置文件

    (1)找到我们使用的客户端配置文件,在window xp下面他们的位置在系统盘的 Documents and Settings\alex\Application Data\Subversion\auth\文件夹中,把里面的所有文件删除。

    (2)使用SVN更新或提交,使得客户端与服务端进行通讯,这样就会SVN客户端就要求我们输入新的用户名密码,输入我们的用户名密码就可以替换掉旧的用户名密码。

    2、通过修改SVN服务端账号配置文件,这部分需要SVN的管理员配合

    (1)找到服务端账号配置文件,这个文件位于SVN服务器的安装路径 config文件夹,打开并编辑passwd文件,删除或注释需要被替换的账号

    (2)在客户端使用SVN更新或提交,使得客户端与服务端进行通讯,这样就会SVN客户端就要求我们输入新的用户名密码,输入我们的用户名密码就可以替换掉旧的用户名密码。

posted @ 2009-09-22 10:08 spinage 阅读(81745) | 评论 (15)编辑 收藏

1.我所知道的aop 
    初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难。当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不离其宗而已。
2.为什么用aop 
    1就是为了方便,看一个国外很有名的大师说,编程的人都是“懒人”,因为他把自己做的事情都让程序做了。用了aop能让你少写很多代码,这点就够充分了吧
    2就是为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。 
3.那些aop的术语 
    初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂。
    1.通知(Advice)
    就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。
    2.连接点(JoinPoint)
    这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。
    3.切入点(Pointcut)
    上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
    4.切面(Aspect)
    切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
    5.引入(introduction)
    允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
    6.目标(target)
    引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
    7.代理(proxy)
    怎么实现整套aop机制的,都是通过代理,这个一会给细说。
    8.织入(weaving)
    把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。
关键就是:切点定义了哪些连接点会得到通知 

 4.我所理解的aop原理 
    spring用代理类包裹切面,把他们织入到Spring管理的bean中。也就是说代理类伪装成目标类,它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成调用伪装类,伪装类中就先执行了切面,再把调用转发给真正的目标bean。
    现在可以自己想一想,怎么搞出来这个伪装类,才不会被调用者发现(过JVM的检查,JAVA是强类型检查,哪里都要检查类型)。
    1.实现和目标类相同的接口,我也实现和你一样的接口,反正上层都是接口级别的调用,这样我就伪装成了和目标类一样的类(实现了同一接口,咱是兄弟了),也就逃过了类型检查,到java运行期的时候,利用多态的后期绑定(所以spring采用运行时),伪装类(代理类)就变成了接口的真正实现,而他里面包裹了真实的那个目标类,最后实现具体功能的还是目标类,只不过伪装类在之前干了点事情(写日志,安全检查,事物等)。
    这就好比,一个人让你办件事,每次这个时候,你弟弟就会先出来,当然他分不出来了,以为是你,你这个弟弟虽然办不了这事,但是他知道你能办,所以就答应下来了,并且收了点礼物(写日志),收完礼物了,给把事给人家办了啊,所以你弟弟又找你这个哥哥来了,最后把这是办了的还是你自己。但是你自己并不知道你弟弟已经收礼物了,你只是专心把这件事情做好。
   
    顺着这个思路想,要是本身这个类就没实现一个接口呢,你怎么伪装我,我就压根没有机会让你搞出这个双胞胎的弟弟,那么就用第2种代理方式,创建一个目标类的子类,生个儿子,让儿子伪装我

    2.生成子类调用,这次用子类来做为伪装类,当然这样也能逃过JVM的强类型检查,我继承的吗,当然查不出来了,子类重写了目标类的所有方法,当然在这些重写的方法中,不仅实现了目标类的功能,还在这些功能之前,实现了一些其他的(写日志,安全检查,事物等)。
   这次的对比就是,儿子先从爸爸那把本事都学会了,所有人都找儿子办事情,但是儿子每次办和爸爸同样的事之前,都要收点小礼物(写日志),然后才去办真正的事。当然爸爸是不知道儿子这么干的了。 这里就有件事情要说,某些本事是爸爸独有的(final的),儿子学不了,学不了就办不了这件事,办不了这个事情,自然就不能收人家礼了。

   前一种兄弟模式,spring会使用JDK的java.lang.reflect.Proxy类,它允许Spring动态生成一个新类来实现必要的接口,织入通知,并且把对这些接口的任何调用都转发到目标类。

    后一种父子模式,spring使用CGLIB库生成目标类的一个子类,在创建这个子类的时候,spring织入通知,并且把对这个子类的调用委托到目标类。
    相比之下,还是兄弟模式好些,他能更好的实现松耦合,尤其在今天都高喊着面向接口编程的情况下,父子模式只是在没有实现接口的时候,也能织入通知,应当做一种例外。
初学aop对aop术语和原理上的一些总结

posted @ 2009-09-01 10:58 spinage 阅读(134) | 评论 (0)编辑 收藏

 

buffalo-2.0(国人开发的Ajax框架),下载buffalo-2.0-bin就可以了,个人认为也下载buffalo-2.0-src
下载地址:http://sourceforge.net/project/showfiles.php?group_id=178867

1.buffalo-2.0.jar
在buffalo-2.0-bin里,把它加到Web应用程序里的lib

2.buffalo.js和prototype.js
我把这两个文件放到Web应用程序的scripts/目录下,buffalo.js在buffalo-2.0-bin里,prototype.js在buffalo-demo.war里找
4.web.xml内容

<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="2.4"
xmlns
="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>


<servlet>
<servlet-name>bfapp</servlet-name>
<servlet-class>net.buffalo.web.servlet.ApplicationServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bfapp</servlet-name>
<url-pattern>/bfapp/*</url-pattern>
</servlet-mapping>

</web-app>

5.index.jsp文件

<%@pagelanguage="java"pageEncoding="UTF-8"%>


<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>第一个buffalo示例程序</title>
<scriptlanguage="JavaScript"src="scripts/prototype.js"></script>
<scriptlanguage="JavaScript"src="scripts/buffalo.js"></script>
<scripttype="text/javascript">
varendPoint="<%=request.getContextPath()%>/bfapp";

varbuffalo=newBuffalo(endPoint);
functionhello(me){
buffalo.remoteCall(
"demoService.getHello",[me.value],function(reply){
alert(reply.getResult());
})
}
</script>
</head>

<body>
输入你的名字:
<inputtype="text"name="myname">
<inputtype="button"value="Buffao远程调用"onclick="hello($('myname'));"><br>
</body>
</html>


说明:remoteCall是远程调用方法,demoService是buffalo-service.properties文件的键,getHello是被调用java类方法名,me.value是传给getHello方法的参数,reply.getResult()是getHello返回的值。

6.DemoService.java文件

packagedemo.buffalo;

/**
*
*@文件名demo.buffalo.DemoService.java
*@作者chenlb
*@创建时间2007-7-14下午12:42:17
*/
publicclassDemoService{

publicStringgetHello(Stringname){
return"Hello,"+name+"这是第一个buffalo示例程序";
}
}


7.buffalo-service.properties文件放到WEB-INF/classes/目录下

demoService=demo.buffalo.DemoService

说明:框架是通过此文件来查找远程调用的类的。

8.现在可以运行了。

posted @ 2009-08-31 14:45 spinage 阅读(131) | 评论 (0)编辑 收藏

一) 连接MYSQL:
   格式: mysql -h主机地址 -u用户名 -p用户密码

1、例1:连接到本机上的MYSQL
   首先在打开DOS窗口,然后进入mysql安装目录下的bin目录下,例如: D:\mysql\bin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>
2、例2:连接到远程主机上的MYSQL
   假设远程主机的IP为:10.0.0.1,用户名为root,密码为123。则键入以下命令:
   mysql -h10.0.0.1 -uroot -p123
  (注:u与root可以不用加空格,其它也一样)
3、退出MYSQL命令
   exit (回车)

(二) 修改密码:
   格式:mysqladmin -u用户名 -p旧密码 password 新密码
1、例1:给root加个密码123。首先在DOS下进入目录C:\mysql\bin,然后键入以下命令:
   mysqladmin -uroot -password 123
   注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
2、例2:再将root的密码改为456
   mysqladmin -uroot -pab12 password 456
(三) 增加新用户:(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
   格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"
   例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:    grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";   但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。
   例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。    grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
   如果你不想test2有密码,可以再打一个命令将密码消掉。    grant select,insert,update,delete on mydb.* to test2@localhost identified by "";
(四) 显示命令
1、显示数据库列表:
   show databases;    刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2、显示库中的数据表:
   use mysql; //打开库   show tables;
3、显示数据表的结构:
   describe 表名;
4、建库:
   create database 库名;
5、建表:
   use 库名;    create table 表名 (字段设定列表);
6、删库和删表:
   drop database 库名;    drop table 表名;
7、将表中记录清空:
   delete from 表名;
8、显示表中的记录:
   select * from 表名;

posted @ 2009-08-31 12:53 spinage 阅读(82) | 评论 (0)编辑 收藏