如果qq飞车新图bug正式版出了,基本无BUG,有OB位,假设是最优秀的版本吧,...

当前访客身份:游客 [
选择对的方向比低头努力更加重要。
:写的还行,
:貌似记得对象没序列化闹得
:引用来自“12叔”的评论mongodb 不是有么。谢谢...
:mongodb 不是有么。
:楼主: 你好,请问这个问题你是咋解决的啊?求指...
:我这里边有shiro,权限管理报错了,怎么办?
:引用来自“奔跑的小菜鸟”的评论 这个页面我如何...
:这个页面我如何配置呀,在那里配置加载引导页面
:这个页面我如何配置呀,在那里配置加载引导页面
:主从现实情况并不是那么好。个人感觉缓冲表更好点...
今日访问:188
昨日访问:835
本周访问:2756
本月访问:14350
所有访问:77233
列表模式: |
一、OSCache提供的缓存标签&这是OSCache提供的标签库中最重要的一个标签,包括在标签中的内容将应用缓存机制进行处理,处理的方式将取决于编程者对cache标签属性的设置。
第一次请求到达时,标签中的内容被处理并且缓存起来,当下一个请求到达时,缓存系统会检查这部分内容的缓存是否已经失效,主要是以下几项:&1. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间;2. cron属性规定的时间比缓存信息的开始时间更晚;&3. 标签中缓存的内容在缓存后又被重新刷新过;&4. 其他缓存超期设定。
如果符合上面四项中的任何一项,被缓存的内容视为已经失效,这时被缓存的内容将被重新处理并且返回处理过后的信息,如果被缓存的内容没有失效,那么返回给用户的将是缓存中的信息。
cache标签的属性说明:&key - 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。你可以在同一个页面中使用很多cache标签而不指定他的key属性,这种情况下系统使用该页面的URI和后面的请求字符串,另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。
scope - 缓存发生作用的范围,可以是application或者session。
time - 缓存内容的时间段,单位是秒,默认是3600秒,也就是一个小时,如果设定一个负值,那么这部分被缓存的内容将永远不过期。
duration - 指定缓存内容失效的时间,是相对time的另一个选择,可以使用简单日期格式或者符合USO-8601的日期格式。
refresh - false 或者true。如果refresh属性设置为true,不管其他的属性是否符合条件,这部分被缓存的内容都将被更新,这给编程者一种选择,决定什么时候必须刷新。
mode - 如果编程者不希望被缓存的内容增加到给用户的响应中,可以设置mode属性为"silent"。其它可用的属性还包括:cron 、groups、language、refreshpolicyclass、refreshpolicyparam。&上面的这些属性可以单独使用,也可以根据需要组合使用,下面的例子将讲解这些常用属性的使用方式。
二、Cache标签实例分析1. 最简单的cache标签用法&使用默认的关键字来标识cache内容,超时时间是默认的3600秒&&cache:cache&&&% //自己的JSP代码内容 %&&&/cache:cache&
2. 用自己指定的字符串标识缓存内容,并且设定作用范围为session。&&cache:cache key="foobar" scope="session"&&&% //自己的JSP代码内容 %&&&/cache:cache&
3.动态设定key值,使用自己指定的time属性设定缓存内容的超时时间,使用动态refresh值决定是否强制内容刷新。因为OSCache使用key值来标识缓存内容,使用相同的key值将会被认为使用相同的的缓存内容,所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容。&&cache:cache key="&%= product.getId() %&" time="1800" refresh="&%= needRefresh %&"&&&% //自己的JSP代码内容 %&&&/cache:cache&
4. 设置time属性为负数使缓存内容永不过期&&cache:cache time="-1"&&&% //自己的JSP代码内容 %&&&/cache:cache&
5. 使用duration属性设置超期时间&&cache:cache duration=''PT5M''&&&% //自己的JSP代码内容 %&&&/cache:cache&
6. 使用mode属性使被缓存的内容不加入给客户的响应中&&cache:cache mode=''silent''&&&% //自己的JSP代码内容 %&&/cache:cache&案例一
&%@&page&language="java"&import="java.util.*"&pageEncoding="UTF-8"%&
&%@page&import="java.text.SimpleDateFormat"%&
&%@&taglib&uri="/oscache"&prefix="cache"%&
&&&&&body&
&&&&&&&&&&&&没有缓存的日期:&&%=new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss").format(new&Date())%&&p&
&&&&&&&&&&&&&!--自动刷新--&
&&&&&&&&&&&&&cache:cache&time="30"&
&&&&&&&&&&&&&&&&每30秒刷新缓存一次的日期:&&%=new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss").format(new&Date())%&&p&
&&&&&&&&&&&&&/cache:cache&
&&&&&&&&&&&&&!--手动刷新--&
&&&&&&&&&&&&&cache:cache&key="testcache"&
&&&&&&&&&&&&&&&&手动刷新缓存的日期:&&%=new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss").format(new&Date())%&&p&
&&&&&&&&&&&&&/cache:cache&
&&&&&&&&&&&&&a&href="cache2.jsp"&手动刷新&/a&
&&&&&/body&
&%@&page&language="java"&import="java.util.*"&pageEncoding="UTF-8"%&
&%@&taglib&uri="/oscache"&prefix="cache"%&
&&&&&body&
&&&&&&&&缓存已刷新...&
&&&&&&&&&cache:flush&key="testcache"&scope="application"&/&
&&&&&&&&&a&href="cache1.jsp"&返回&/a&
&&&&&/body&
三、缓存过滤器 CacheFilter&你可以在web.xml中定义缓存过滤器,定义特定资源的缓存。
&&&&&filter-name&CacheFilter&/filter-name&
&&&&&&&&&filter-class&com.opensymphony.oscache.web.filter.CacheFilter&/filter-class&
&&&&&init-param&
&&&&&&&&&param-name&time&/param-name&
&&&&&&&&&param-value&60&/param-value&
&&&&&/init-param&
&&&&&init-param&
&&&&&&&&&param-name&scope&/param-name&
&&&&&&&&&param-value&session&/param-value&
&&&&&/init-param&
&filter-mapping&
&&&&&filter-name&CacheFilter&/filter-name&
&&&&&url-pattern&*.jsp&/url-pattern&
&/filter-mapping&
上面定义将缓存所有.jsp页面,缓存刷新时间为60秒,缓存作用域为Session
注意,CacheFilter只捕获Http头为200的页面请求,即只对无错误请求作缓存,而不对其他请求(如500,404,400)作缓存处理。
发布于 7个月前,
阅读(13) | 评论(0) |
投票(0) | 收藏(0)
1、cache.memory是否使用内存缓存;值为:true或false。默认为true;如设置为false,那cache只能缓存到数据库或硬盘中。2、cache.capacity缓存的最大数量。默认是不限制,cache不会移走任何缓存内容。负数被视不限制。3、cache.algorithm运算规则。为了使用规则,cache的size必须是指定的。如果cache的size不指定的话, 将不会限制缓存对象的大小。如果指定了cache的size,但不指定algorithm,那它会默认使用:com.opensymphony.oscache.base.algorithm.LRUCache有下面三种规则:com.opensymphony.oscache.base.algorithm.LRUCache: last in first out(最后插入的最先调用)。默认选项。com.opensymphony.oscache.base.algorithm.FIFOCache: first int first out(最先插入的最先调用)。com.opensymphony.oscache.base.algorithm.UnlimitedCache: cache中的内容将永远不会被丢弃。如果cache.capacity不指定值的话,它将被设为默认选项。4、cache.blocking是否同步。true或者false。一般设为true,避免读取脏数据。5、cache.unlimited.disk指定硬盘缓存是否要作限制。默认值为false。false的状况下,disk cache capacity和cache.capacity的值相同。6、cache.persistence.class指定类是被持久化缓存的类。class必须实现PersistenceListener接口。作为硬盘持久,可以实现com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener接口。它把class的toString()输出的hash值作为文件的名称。如果你要想文件名易读些(自己设定),DiskPersistenceListener的父类也能使用,但其可能有非法字符或者过长的名字。注意:HashDiskPersistenceListener和DiskPersistenceListener需要设定硬盘路径:cache.path7、cache.path指定硬盘缓存的路径。目录如果不存在将被建立。同时注意oscache应该要有权限写文件系统。例:cache.path=c:\\myapp\\cachecache.path=/opt/myapp/cache8、cache.persistence.overflow.only (NEW! Since 2.1)指定是否只有在内存不足的情况下才使用硬盘缓存。默认值false。但推荐是true如果内存cache被允许的话。这个属性彻底的改变了cache的行为,使得persisted cache和memory是完全不同。9、cache.event.listenersclass名列表(用逗号隔开)。每个class必须实现以下接口中的一个或者几个。CacheEntryEventListener:接收cache add/update/flush and remove事件CacheMapAccessEventListener :接收cache访问事件。这个可以让你跟踪cache怎么工作。默认是不配置任何class的。当然你可以使用一下class:com.opensymphony.oscache.plugins.clustersupport.BroadcastingCacheEventListener: 分布式的监听器。可以广播到局域网内的其他cache实例。com.opensymphony.oscache.extra.CacheEntryEventListenerImpl:一个简单的监听器。在cache的生命周期中记录所有entry的事件。com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl: 记录count of cache map events(cache hits,misses and state hits).10、cache.key在application和session的作用域时,用于标识cache对象的,用于ServletCacheA此属性不是指定为"__oscache_cache"格式时为默认值, 如果代码中需要用到默认值时可以通使用com.opensymphony.oscache.base.Const.DEFAULT_CACHE_KEY来取得;11、cache.use.host.domain.in.key当配置多个服务器时,想通过服备器名称自动生成cache key时,可将此属性设为true. 默认值为12、Additional Properties在以上基础选项之上可以加入一些额外的属性到此文件中.例: JavaGroupsBroadcastingListener便是额外的.13、cache.cluster.multicast.ip用于缓存集群. 默认为231.12.21.13214、cache.cluster.properties指集群中的额外配置项.
发布于 7个月前,
阅读(4) | 评论(0) |
投票(0) | 收藏(0)
OSCache是一个基于web应用的组件,他的安装工作主要是对web应用进行配置,大概的步骤如下:
1. 下载、解压缩OSCache下载合适的OSCache版本,解压缩下载的文件到指定目录。
2、新建一个web应用
3、将OSCache集成到web项目中:&(1)从解压缩目录取得oscache.jar文件放到/WEB-INF/lib或相应类库目录中,jar文件名可能含有版本号和该版本的发布日期信息等。(2)将oscache.properties、oscache.tld放入WEB-INF\class目录(确切说是放在项目的src目录下,编译的时候会自动生成在WEB-INF\class目录)。(3)配置项目对应的oscache.properties参数信息。(4)具体使用
4、OSCache使用A、缓存对象:直接调用API的接口即可B、部分页面缓存:使用OSCache提供的taglib修改web.xml文件,在web.xml文件中增加下面的内容,增加对OSCache提供的taglib的支持:
&&&&&taglib-uri&oscache&/taglib-uri&&
&&&&&taglib-location&/WEB-INF/classes/oscache.tld&/taglib-location&
或者在jsp页面使用以下标签(2种引入方式)
&%@&taglib&uri="/WEB-INF/classes/oscache.tld"&prefix="cache"&%&&&%@&taglib&uri="/oscache"&prefix="cache"&%&
C、整个页面的缓存:用CashFilter实现页面级缓存,可缓存单个文件、缓存URL pattern和自己设定缓存属性的缓存。
&&&&&filter-name&CacheFilter&/filter-name&
&&&&&filter-class&com.opensymphony.oscache.web.filter.CacheFilter&/filter-class&
&&&&&init-param&
&&&&&&&&&param-name&time&/param-name&
&&&&&&&&&param-value&600&/param-value&
&&&&&/init-param&
&&&&&init-param&
&&&&&&&&&param-name&scope&/param-name&
&&&&&&&&&param-value&session&/param-value&
&&&&&/init-param&
&filter-mapping&
&&&&&filter-name&CacheFilter&/filter-name&
&&&&&!-对所有jsp页面内容进行缓存--&
&&&&&url-pattern&*.jsp&/url-pattern&
&/filter-mapping&
[注]只有客户访问时返回http头信息中代码为200(也就是访问已经成功)的页面信息才能够被缓存
4、配置日志输出信息。
发布于 7个月前,
阅读(8) | 评论(0) |
投票(0) | 收藏(0)
一、简介Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的输出结果,可以很显著的改善系统运行性能。OSCache标记库由OpenSymphony设计,它是一种开创性的缓存方案,它提供了在现有JSP页面之内实现内存缓存的功能。OSCache是个一个被广泛采用的高性能的J2EE缓存框架,OSCache还能应用于任何Java应用程序的普通的缓存解决方案。OSCache是当前运用最广的缓存方案,JBoss,Hibernate,Spring等都对其有支持。Oscache的使用非常方便,特别是jsp cache用的非常广泛。Oscache的文档中也对jsp cache tag的配置有详细说明。相关内容请参考 OSCache 的 在线文档对使用Cache的测试结论:使用cache,随着循环的增多,用时增长较缓慢,而不使用cache基本是等比例增长。在循环次数较多时,使用cache cpu利用率显著提高,能达到90%以上。不使用cache则只能上到50%左右,更多是在等待数据库返回结果。所以使用cache能大大减轻数据库的压力,提高应用服务器的利用率,符合我们对应用服务器进行水平扩展的要求。二、OSCache的特点和主要特征(1)、OSCache有以下特点1、缓存任何对象:你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。2、拥有全面的API:OSCache API允许你通过编程的方式来控制所有的OSCache特性。3、永久缓存:缓存能被配置写入硬盘,因此允许在应用服务器的多次生命周期间缓存创建开销昂贵的数据。4、支持集群:集群缓存数据能被单个的进行参数配置,不需要修改代码。5、缓存过期:你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不能满足需要时)。(2)、主要特征&1.兼容多种支持JSP的web服务器&已经通过兼容测试的web服务器包括OrionServer (1.4.0或者以上版本) 、Macromedia JRun (3.0或者以上版本) 、BEA Weblogic (7.x或者以上版本) 、IBM Websphere (5.0版本)、Silverstream (3.7.4版本)、Caucho Resin (1.2.3或者以上版本)、Tomcat (4.0或者以上版本) ,其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼容OSCache的。2.可选的缓存区&你可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源(需要自己提供适配器)作为缓存区。使用内存作为缓存区将可以提供更好的性能使用硬盘作为缓存区可以在服务器重起后迅速恢复缓存内容同时使用内存和硬盘作为缓存区则可以减少对内存的占用3.灵活的缓存系统&OSCache支持对部分页面内容或者对页面级的响应内容进行缓存,编程者可以根据不同的需求、不同的环境选择不同的缓存级别。4.容错在一般的web应用中,如果某个页面需要和数据库打交道,而当客户请求到达时,web应用和数据库之间无法进行交互,那么将返回给用户"系统出错"或者类似的提示信息,如果使用了OSCache的话,你可以使用缓存提供给用户,给自己赢得维护系统或者采取其他补救的时间。其它特性还包括对集群的支持、缓存主动刷新等特性,大家可以参考OpenSymphony网站上的其他资源获取更多的信息。
发布于 7个月前,
阅读(12) | 评论(0) |
投票(0) | 收藏(0)
//如果object为null,则设置为defaultValue
ObjectUtils.defaultIfNull(object,&defaultValue);
//判断集合是否为null
List&String&&list=new&ArrayList&String&();
System.out.println(list.isEmpty());&//true
System.out.println(list.size());&//0
Set&String&&set=new&HashSet&String&();
System.out.println(set.isEmpty());&//true
System.out.println(set.size());&//0
Map&String,&String&&map=new&HashMap&String,&String&();
System.out.println(map.isEmpty());&//true
System.out.println(map.size());&//0
方法一(数据量大,效率低):
if(list!=null&&&&list.size()&0){
方法二(数据量大,效率高):
if(list!=null&&&&!list.isEmpty()){
发布于 7个月前,
阅读(21) | 评论(0) |
投票(0) | 收藏(0)
//产生5位长度的随机字符串,中文环境下是乱码
RandomStringUtils.random(5);
//使用指定的字符生成5位长度的随机字符串
RandomStringUtils.random(5,&new&char[]{'a','b','c','d','e','f',&'1',&'2',&'3'});
//生成指定长度的字母和数字的随机组合字符串
RandomStringUtils.randomAlphanumeric(5);
//生成随机数字字符串
RandomStringUtils.randomNumeric(5);
//生成随机[a-z]字符串,包含大小写
RandomStringUtils.randomAlphabetic(5);
//生成从ASCII&32到126组成的随机字符串&
RandomStringUtils.randomAscii(4)
发布于 7个月前,
阅读(8) | 评论(0) |
投票(0) | 收藏(0)
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
自定义注解及其应用
1)、定义一个最简单的注解
MyAnnotation {
&&& //......
2)、把注解加在某个类上:
@MyAnnotation
public class AnnotationTest{
&&& //......
以下为模拟案例
自定义注解@MyAnnotation
package&com.ljq.
&import&java.lang.annotation.ElementT
&import&java.lang.annotation.R
&import&java.lang.annotation.RetentionP
&import&java.lang.annotation.T
&*&定义一个注解
&*&@author&jiqinlin
&//Java中提供了四种元注解,专门负责注解其他的注解,分别如下
&//@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
&//RetentionPolicy.SOURCE:&停留在java源文件,编译器被丢掉
&//RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
&//RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
&//@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
&//ElementType.CONSTRUCTOR:&构造器声明
&//ElementType.FIELD:&成员变量、对象、属性(包括enum实例)
&//ElementType.LOCAL_VARIABLE:&局部变量声明
&//ElementType.METHOD:&方法声明
&//ElementType.PACKAGE:&包声明
&//ElementType.PARAMETER:&参数声明
&//ElementType.TYPE:&类、接口(包括注解类型)或enum声明
&//@Documented将注解包含在JavaDoc中
&//@Inheried允许子类继承父类中的注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,&ElementType.TYPE})
&public&@interface&MyAnnotation&{
&&&&//为注解添加属性
&&&&&String&color();
&&&&String&value()&default&"我是林计钦";&//为属性提供默认值
&&&&&int[]&array()&default&{1,&2,&3};&
&&&&Gender&gender()&default&Gender.MAN;&//添加一个枚举
&&&&&MetaAnnotation&metaAnnotation()&default&@MetaAnnotation(birthday="我的出身日期为");
&&&&//添加枚举属性
注解测试类AnnotationTest
package&com.ljq.
&*&注解测试类
&*&@author&jiqinlin
&//调用注解并赋值
&@MyAnnotation(metaAnnotation=@MetaAnnotation(birthday&=&"我的出身日期为"),color="red",&array={23,&26})
&public&class&AnnotationTest&{
&&&&public&static&void&main(String[]&args)&{
&&&&&&&&//检查类AnnotationTest是否含有@MyAnnotation注解
&&&&&&&&&if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
&&&&&&&&&&&&//若存在就获取注解
&&&&&&&&&&&&&MyAnnotation&annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
&&&&&&&&&&&&System.out.println(annotation);
&&&&&&&&&&&&//获取注解属性
&&&&&&&&&&&&&System.out.println(annotation.color());&
&&&&&&&&&&&&System.out.println(annotation.value());
&&&&&&&&&&&&//数组
&&&&&&&&&&&&&int[]&arrs=annotation.array();
&&&&&&&&&&&&for(int&arr:arrs){
&&&&&&&&&&&&&&&&System.out.println(arr);
&&&&&&&&&&&&}
&&&&&&&&&&&&//枚举
&&&&&&&&&&&&&Gender&gender=annotation.gender();
&&&&&&&&&&&&System.out.println("性别为:"+gender);
&&&&&&&&&&&&//获取注解属性
&&&&&&&&&&&&&MetaAnnotation&meta=annotation.metaAnnotation();
&&&&&&&&&&&&System.out.println(meta.birthday());
枚举类Gender,模拟注解中添加枚举属性
package&com.ljq.
&*&枚举,模拟注解中添加枚举属性
&*&@author&jiqinlin
&public&enum&Gender&{
&&&&&&&&public&String&getName(){return&"男";}
&&&&WOMEN{
&&&&&&&&public&String&getName(){return&"女";}
&&&&};&//记得有“;”
&&&&&public&abstract&String&getName();
注解类MetaAnnotation,模拟注解中添加注解属性
package&com.ljq.
&*&定义一个注解,模拟注解中添加注解属性
&*&@author&jiqinlin
&public&@interface&MetaAnnotation&{
&&&&String&birthday();
发布于 7个月前,
阅读(19) | 评论(0) |
投票(0) | 收藏(0)
1. OverviewJava在java.lang.reflect包下,定义了自己的代理。利用这个包下的类,我们可以在运行时动态地创建一个代理类,实现一个或多个接口。并将方法的调用转发到你所指定的类。因为实际代理是在运行时创建的,所以称为:动态代理。Proxy:完全由java产生的,而且实现了完整的subject接口。InvocationHandler:Proxy上的任何方法调用都会被传入此类,InvocationHandler控制对RealSubject的访问。因为Java已经帮助我们创建了Proxy类,我们需要有办法告诉Proxy类你要做什么,我们不能像以前一样把代码写入到Proxy类中,因为Proxy类不是我们实现的。那么我们应该放在哪里?放在InvocationHandler类中,InvocationHandler类是响应代理的任何调用。我们可以吧InvocationHandler想成是代理收到方法调用后,请求做实际工作的对象。2. java.lang.reflect.InvocationHandler被代理实例所实现的一个接口,内部只有一个invoke()方法,签名如下;Java代码public&Object&invoke(Object&proxy,&Method&method,&Object[]&args)当代理的方法被调用的时候,代理就会把这个调用转发给InvocationHandler,也就会调用它的invoke()方法。3. java.lang.reflect.Proxy提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类,我们经常使用的静态方式是:Java代码newProxyInstance(ClassLoader&loader,&Class[]&interfaces,&InvocationHandler&h)4. 示例:情形:自己可以查看修改姓名性别,但是不能修改rate。他人可以查看姓名,性别以及修改rate,但是不能修改姓名性别。4.1 定义一个接口:Java代码public&interface&Person&{&&&&&
&&&&String&getName();&&&&&
&&&&String&getGender();&&&&&
&&&&void&setName(String&name);&&&&&
&&&&void&setGender(String&gender);&&&&&
&&&&void&setRate(int&rate);&&&&&
&&&&int&getRate();&&&&&
}4.2 定义实现Person接口类Java代码public&class&PersonImpl&implements&Person&{&&&&&
String&&&&&&
String&&&&&&
String&&&&&&
public&String&getName()&{&&&&&
&&&&return&&&&&&
public&void&setName(String&name)&{&&&&&
&&&&this.name&=&&&&&&
public&String&getGender()&{&&&&&
&&&&return&&&&&&
public&void&setGender(String&gender)&{&&&&&
&&&&this.gender&=&&&&&&
public&String&getInterests()&{&&&&&
&&&&return&&&&&&
public&void&setInterests(String&interests)&{&&&&&
&&&&this.interests&=&&&&&&
public&int&getRate()&{&&&&&
&&&&return&&&&&&
public&void&setRate(int&rate)&{&&&&&
&&&&this.rate&=&&&&&&
}4.3 定义OwnerInvocationHandler类,表示如果为本人,则可以进行修改查看姓名性别。Java代码public&class&OwnerInvocationHandler&implements&InvocationHandler{&&&&&
&&&&private&Person&personB&&&&&
&&&&public&OwnerInvocationHandler(Person&personBean){&&&&&
&&&&&&&&this.personBean&=&personB&&&&&
&&&&}&&&&&
&&&&@Override&&&&
&&&&public&Object&invoke(Object&proxy,&Method&method,&Object[]&args)&&&&&
&&&&&&&&&&&&throws&IllegalAccessException&{&&&&&
&&&&&&&&&&&&&
&&&&&&&&try&{&&&&&
&&&&&&&&&&&&if(method.getName().startsWith("get")){//如果方法名为get,就调用person类内的get相应方法&&&&&
&&&&&&&&&&&&&&&&return&method.invoke(personBean,&args);&&&&&
&&&&&&&&&&&&}else&if(method.getName().equals("setRate")){&//&如果方法是setRate,则抛出异常&&&&&
&&&&&&&&&&&&&&&&throw&new&IllegalAccessException("access&deny");&&&&&
&&&&&&&&&&&&}else&if(method.getName().startsWith("set")){&&//如果为set,就调用person类内的set相应方法&&&&&
&&&&&&&&&&&&&&&&return&method.invoke(personBean,&args);&&&&&
&&&&&&&&&&&&}else&{&&&&&
&&&&&&&&&&&&&&&&System.out.println("non&method&invoke");&&&&&
&&&&&&&&&&&&}&&&&&
&&&&&&&&}&catch&(InvocationTargetException&e)&{&&&&&
&&&&&&&&&&&&e.printStackTrace();&&&&&
&&&&&&&&}&&&&&
&&&&&&&&return&&&&&&&
&&&&&&&&&&&&&
&&&&}&&&&&
}4.4 定义NonInvocationHandler类,表示如果不为本人,则可以进行查看姓名性别和修改rate。Java代码public&class&NonInvocationHandler&implements&InvocationHandler{&&&&&
&&&&//&&&&&
&&&&private&Person&&&&&&
&&&&public&NonInvocationHandler(Person&person){&&&&&
&&&&&&&&this.person&=&&&&&&
&&&&}&&&&&
&&&&@Override&&&&
&&&&public&Object&invoke(Object&proxy,&Method&method,&Object[]&args)&&&&&
&&&&&&&&&&&&throws&Throwable&{&&&&&
&&&&&&&&if(method.getName().startsWith("setRate")){&&&&&
&&&&&&&&&&&&return&method.invoke(person,&args);&&&&&
&&&&&&&&}else&if&(method.getName().startsWith("get")){&&&&&
&&&&&&&&&&&&return&method.invoke(person,&args);&&&&&
&&&&&&&&}&else&{&&&&&
&&&&&&&&&&&&System.out.println("non&method&invoke");&&&&&
&&&&&&&&&&&&return&&&&&&
&&&&&&&&}&&&&&
&&&&}&&&&&
}4.5 测试类MyDynamicProxyJava代码public&class&MyDynamicProxy&{&&&&&
public&Person&getOwnerPersonBeanProxy(Person&person){&&&&&
&&&&return&(Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),&&&&&&
&&&&&&&&&&&&person.getClass().getInterfaces(),&new&OwnerInvocationHandler(person));&&&&&
public&Person&getNonPersonBeanProxy(Person&person){&&&&&
&&&&return&(Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),&&&&&&
&&&&&&&&&&&&person.getClass().getInterfaces(),&new&NonInvocationHandler(person));&&&&&
public&static&void&main(String[]&args)&{&&&&&
&&&&MyDynamicProxy&mdp&=&new&MyDynamicProxy();&&&&&
&&&&mdp.test();&&&&&
public&void&test(){&&&&&
&&&&&&&&&&&&&&&&//&&&&&
&&&&Person&person&=&getPersonBeanFromDB1();&&&&&
&&&&Person&personProxy&=&getOwnerPersonBeanProxy(person);&&&&&
&&&&System.out.println(personProxy.getName());&&&&&&
&&&&try&{&&&&&
&&&&&&&&personProxy.setRate(2);&&&&&
&&&&}&catch&(Exception&e)&{&&&&&
&&&&&&&&System.out.println("can&not&setRate");&&&&&
&&&&}&&&&&
&&&&&&&&&&&&&&&&&//&&&&&
&&&&Person&person1&=&getPersonBeanFromDB1();&&&&&
&&&&Person&personProxy2&=&getNonPersonBeanProxy(person1);&&&&&
&&&&System.out.println(personProxy2.getName());&&&&&
&&&&personProxy2.setRate(2);&&&&&
&&&&System.out.println(personProxy2.getRate());&&&&&
private&Person&getPersonBeanFromDB1(){&&&&&
&&&&Person&pb&=&new&PersonImpl();&&&&&
&&&&pb.setName("remy");&&&&&
&&&&pb.setGender("girl");&&&&&
&&&&pb.setRate(1);&&&&&
&&&&return&&&&&&
}输出结果:Java代码remy&&&&&
can&not&setRate&&&&&
发布于 7个月前,
阅读(11) | 评论(0) |
投票(0) | 收藏(0)
&%@&page&contentType="text/charset=UTF-8"&language="java"&%&
&&&&String&path&=&request.getContextPath();
&&&&String&basePath&=&request.getScheme()&+&"://"&+&request.getServerName()&+&":"&+&request.getServerPort()&+&path&+&"/";
&!DOCTYPE&HTML&
&&&&&meta&name="viewport"&content="width=device-width,&initial-scale=1.0,&maximum-scale=1.0,&user-scalable=0;"&/&
&&&&&title&HTML5测试&/title&
&&&&&script&src="&%=basePath%&js/jquery-1.11.0.min.js"&type="text/javascript"&&/script&
&&&&&script&type="text/javascript"&
&&&&&&&&$(function()&{
&&&&&&&&&&&&var&startX,&startY,&endX,&endY;
&&&&&&&&&&&&var&showADID&=&1;
&&&&&&&&&&&&document.getElementById("divADBox").addEventListener("touchstart",&touchStart,&false);
&&&&&&&&&&&&document.getElementById("divADBox").addEventListener("touchmove",&touchMove,&false);
&&&&&&&&&&&&document.getElementById("divADBox").addEventListener("touchend",&touchEnd,&false);
&&&&&&&&&&&&function&touchStart(event)&{
&&&&&&&&&&&&&&&&var&touch&=&event.touches[0];
&&&&&&&&&&&&&&&&startY&=&touch.pageY;
&&&&&&&&&&&&&&&&startX&=&touch.pageX;
&&&&&&&&&&&&}
&&&&&&&&&&&&function&touchMove(event)&{
&&&&&&&&&&&&&&&&var&touch&=&event.touches[0];
&&&&&&&&&&&&&&&&endX&=&touch.pageX;
&&&&&&&&&&&&}
&&&&&&&&&&&&function&touchEnd(event)&{
&&&&&&&&&&&&&&&&$("#img0"&+&showADID).hide();
&&&&&&&&&&&&&&&&showADID++;
&&&&&&&&&&&&&&&&if&(showADID&&&4)&{
&&&&&&&&&&&&&&&&&&&&showADID&=&1;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&$("#img0"&+&showADID).show();
&&&&&&&&&&&&&&&&$("#spText").html("X轴移动大小:"&+&(startX&-&endX));
&&&&&&&&&&&&}
&&&&&&&&})
&&&&&/script&
&&&&&form&id="form1"&
&&&&&span&id="spText"&&/span&
&&&&&div&style="border:solid&1px&R"&id="divADBox"&
&&&&&&&&&img&id="img01"&height="450px"&src="&%=basePath%&resources/tcode/t1.png"&&/&
&&&&&&&&&img&id="img02"&height="450px"&src="&%=basePath%&resources/tcode/t2.png"&style="display:"&/&
&&&&&&&&&img&id="img03"&height="450px"&src="&%=basePath%&resources/tcode/t3.png"&style="display:"&/&
&&&&&&&&&img&id="img04"&height="450px"&src="&%=basePath%&resources/tcode/t4.png"&style="display:"&/&
&&&&&/div&
&&&&&/form&
发布于 7个月前,
阅读(5564) | 评论(0) |
投票(0) | 收藏(7)
数据库:SqlServer2005,表结构:
/*==============================================================*/
/*&Table:&Dic_City&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
/*==============================================================*/
create&table&Dic_City&(
&&&ID&&&&&&&&&&&&&&&&&&&int&&&&&&&&&&&&&&&&&&identity,
&&&City_Code&&&&&&&&&&&&varchar(10)&&&&&&&&&&not&null,
&&&Provinces_Code&&&&&&&varchar(20)&&&&&&&&&&not&null,
&&&State_Code&&&&&&&&&&&varchar(10)&&&&&&&&&&not&null,
&&&City_Name&&&&&&&&&&&&varchar(50)&&&&&&&&&&null,
&&&PY_Code&&&&&&&&&&&&&&varchar(50)&&&&&&&&&&null,
&&&PY_Code_Short&&&&&&&&varchar(10)&&&&&&&&&&null,
&&&Ext1&&&&&&&&&&&&&&&&&varchar(20)&&&&&&&&&&null,
&&&Ext2&&&&&&&&&&&&&&&&&varchar(20)&&&&&&&&&&null,
&&&Ext3&&&&&&&&&&&&&&&&&varchar(20)&&&&&&&&&&null,
&&&Ext4&&&&&&&&&&&&&&&&&varchar(20)&&&&&&&&&&null,
&&&Ext5&&&&&&&&&&&&&&&&&varchar(20)&&&&&&&&&&null,
&&&constraint&PK_DIC_CITY&primary&key&(ID)
MyBatisXML配置,下面两种方式都行
&insert&id="insert"&parameterType="cn.softsea.model.DicCity"&&
&&&selectKey&resultType="java.lang.Integer"&keyProperty="id"&order="AFTER"&&
&&&&SELECT&@@IDENTITY
&&&/selectKey&
&&insert&into&Dic_City&(City_Code,&Provinces_Code,&
&&&&State_Code,&City_Name,&PY_Code,&
&&&&PY_Code_Short,&Ext1,&Ext2,&
&&&&Ext3,&Ext4,&Ext5)
&&values&(#{cityCode,jdbcType=VARCHAR},&#{provincesCode,jdbcType=VARCHAR},&
&&&&#{stateCode,jdbcType=VARCHAR},&#{cityName,jdbcType=VARCHAR},&#{pyCode,jdbcType=VARCHAR},&
&&&&#{pyCodeShort,jdbcType=VARCHAR},&#{ext1,jdbcType=VARCHAR},&#{ext2,jdbcType=VARCHAR},&
&&&&#{ext3,jdbcType=VARCHAR},&#{ext4,jdbcType=VARCHAR},&#{ext5,jdbcType=VARCHAR})
&insert&id="insert"&parameterType="cn.softsea.model.DicCity"&useGeneratedKeys="true"&keyProperty="id"&
&&insert&into&Dic_City&(City_Code,&Provinces_Code,&
&&&&State_Code,&City_Name,&PY_Code,&
&&&&PY_Code_Short,&Ext1,&Ext2,&
&&&&Ext3,&Ext4,&Ext5)
&&values&(#{cityCode,jdbcType=VARCHAR},&#{provincesCode,jdbcType=VARCHAR},&
&&&&#{stateCode,jdbcType=VARCHAR},&#{cityName,jdbcType=VARCHAR},&#{pyCode,jdbcType=VARCHAR},&
&&&&#{pyCodeShort,jdbcType=VARCHAR},&#{ext1,jdbcType=VARCHAR},&#{ext2,jdbcType=VARCHAR},&
&&&&#{ext3,jdbcType=VARCHAR},&#{ext4,jdbcType=VARCHAR},&#{ext5,jdbcType=VARCHAR})
调用Mapper返回主键:
//生成新对象用于插入
DicCity&city&=&new&DicCity();
city.setCityCode("330100");
city.setCityName("杭州市");&
//获取mapper对象
DicCityMapper&cityMapper&=&(DicCityMapper)&SpringContextUtil.getBean("dicCityMapper");
int&row&=&cityMapper.insert(city);&&&&//insrt不再返回主键,只返回响应行数,这点和ibatis不同了
System.out.println("响应的行数:"+row);
//取得自增的标识列&ID的值
System.out.println("新插入的数据的ID:"+city.getId());
如果使用mybatis.generator来生成DAO层的话,generatorConfig.xml中要使用:
&generatedKeycolumn="id"sqlStatement="MySql"identity="true"/&
发布于 7个月前,
阅读(51) | 评论(0) |
投票(0) | 收藏(1)

我要回帖

更多关于 qq飞车新图bug 的文章

 

随机推荐