密码保护:[Notice]Spring3 AOP
strtok 用法和实现
库: #include <string.h>
原型:extern char *strtok(char *s, char *delim);
用法:
1. 仅调用一次时, strtok会根据delim 将 s中的所有delim替换成NULL。
例如 “ab::cd::ef” => “abNULLcdNULLefNULL”
2. 循环多次调用时, 首次调用后返回一个用null 替换delim的 新字符串。 再次调用时,需要将s参数变成NULL(strtok 里将 定义了一个 static 成员变量来储存s, 如果s为NULL,则不进行复制)效果是,第二次将返回 在第一次出现NULL位置下一个位置的指针)
例如 “ab::cd::ef” => “abNULLcdNULLefNULL“ => cdNULLefNULL
1 2 3 4 5 6 7 8 9 | int main(int argc, char *argv[]) { char s[] = "ab::cd::ef"; char *s1 = strtok(s, "::"); s1 = strtok(NULL, "::"); cout << s1 << endl; // cd system("PAUSE"); return EXIT_SUCCESS; } |
实现:
from csdn , demo1
继续阅读 »
[Notice]Struts2 Interceptor
1.interceptor-stack相关
作用: 将一系列的interceptor装载到一个stack中, 方便引用,例如defaultStack.或自定义的InterceptorStack.
通常在Action中加入Interceptor时,需要interceptor-ref “defaultStack” , 尤其是需要传递参数时, 原因是普通的拦截器不会处理url请求参数,而defaltStack包含有paramInterceptor 这个拦截器一个最重要的动作是将拦截到的参数Onto Action.
当然还包括一些handing Exception等框架提供的拦截器实现, 当你发现加入Interceptor时,Exception无法被捕获处理,请检查,Interceptor chain中是否有Exception Interceptor!
以下是DefaultStack内含有的interceptors
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
2.自定义的方法拦截器 MethodFilterInterceptor 继续阅读 »
关于java IO “流”的理解
很偶然的机会接触到一些编码的东西,就对java IO产生了兴趣. 一直以来对IO流一知半解的.会利用些简单的连自己都说不出为什么的IO接口而已. 在网上查找了些资料, 基本上都是马士兵老师的理解方式,即 IO流比作一个管道, 一个插入文件,插入在内存中的管道…起初也觉得这种理解很恰当,至少字面上管道和水流很搭. 后来接触到ByteArrayOutputStream时, 对其中的toByteArray()很困惑, 如果是是管道的理解,为什么管道可以转换成内存空间呢(缓冲区,数组)?
当然,在有了管道的对象,获取源还是很容易的,但是总觉得应该不至于使用使用toByteArray的名字,至少getByteArray会更合适吧. 呵呵.
下面说说我对IO流概念的理解, 并不为了介绍IO api,也不是介绍java IO原理(水平不够嘛)等. 所以请大神以及连javaIO都没接触过的小鸟绕道吧.
1. 流: 流可以理解成水流,这点基本上是公认的,不过流和管道就没啥关系了,流应该是对源的抽象,比方说对文件的抽象,对内存区域的抽象,或者说是资源的另一种形式. 总是流就是目标,就是源.
我们可以把一堆的字节,或者是结构体,抽象成叫做”文件”的说法,为什么不能抽象成一个流呢.虽然在抽象的”文件”的基础上进一步抽象.
2. 各种各样的流: 这个有点类似现实之中继承的关系, 子孙继承祖先, 也许祖先的基因得到了优化,又或者一些特性消失,以及获得新的特性(和extends不一样哦)
所以,各类型的流应该说是不同级别或者是不同状态对资源(文件,内存等)的抽象.好比冰山,我们搬不动,可以让它融化成水,水可以一滴一滴的拿,也可以一桶一桶的取. 水就是冰的一种抽象状态.(如果水是不存在的概念的话).
那么简单介绍下各类流
流简单的分可以是输入,输出流. 虽然是对资源的区分,不过按照我这种理解方式, 这种资源的抽象体是有分”进”和”出”的.
稍微难一点点的分,可以分为字节流和字符流.
其他区分方式一律忽略吧.这两种够用了.
1. InputStream OutputStream 输入输出的字节流,简单的说就是读写都是以字节为单位的. (这里的读与写比做管道就很形象了,毕竟水流不流动,拿管道有个P用呀)
2. Reader Writer 输入输出的字符流 , 读写以字符为单位, 这里的字符没有限定,可以通过构造函数告诉IO,一次性读写的字符是什么样的字符, 有可能是2字节,也有可能是3字节.
3. 该说说”转换流”的概念了, 转换流其实在我看来是一个比上不足,比下严重有余的流, 首先转换流从名字上说,肯定是一种流, 但是这种流存在的意义似乎就是为了转换. 这点我很搞不懂,sun为什么不把这种流作为字符流的一个静态方法对外提供(它除了转换,估计都没其他机会登场了) 当然,也许由于原理上的考虑这就不是我这样的新手可以理解的啦.
InputStreamReader OutputStreaWriter 存在的意义很简单,将普通的字节流,inputstream或者outputstream转换成Reader or Writer, 字节流是不带编码信息的.如果说前3字节标示一个编码,我写了个demo测试过,似乎不太灵验. 就暂时这么理解吧. 而字符流是肯定带字符编码信息的.所以转换的过程中,必须传入一个能让jvm知道的编码信息.可以是编码名.也可以是其他.
为什么说转换流比上不足呢? 因为Reader提供有更多的方法,可以操作.虽然大部分都不会用到.转换流本身已经够用了.常用方法是一样的,比方说read() write()
比下严重有余的原因只有一个,就是它提供转换的功能…这里的有点用词不当了..
其实”转换流”更多的是作为一种方法,工具来使用的.
相比它的另外一个兄弟BufferedReader or BufferedWriter(也是继承来至Reader和Writer) 后者就不会那么食之无味了.
带缓冲功能的流: BufferedReader BufferedWriter 没其他特点,唯一一点就是带缓冲功能了…意义就不多说了
同样只是为了一个功能而加入的新型流Buffer流的抽象有意义的多,至少,ReadLine()方法,很方便!
ByteArrayInputStream and ByteArrayOutputStream …后者不是并不需要像以上流那样提供有资源对象的位置信息, 因为它是在操作内存的… 它会开辟 一个指定大小,或者是默认jvm指定大小的内存区域. 这个区域是内存资源抽象成流. 所以它的toByteArray 很容易理解. 将抽象的流还原成内存资源本身. 如果说流理解成管道就不好理解了. 管道怎么可以还原成资源呢..它只是管道而已!
所以将流理解成对文件,内存等实质存在的对象的抽象,比较恰当. 而他们对应的read write方法才是管道!
流本来就是不存在的东西, 理解无分对错. 怎么理解是自己的事, 希望本篇很帮助到一些对流是在理解不来的朋友.

