当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪ognl.OgnlException: target is null for setProperty(null, "y", [Ljava.lang.St      罪魁祸首是在表单里设置的name属性,因为设置了name属性,便要在struts中进行接收相应的值,而action里面是没有这个name值的,所以会出错,但是不影响运行的。 后来把<INPUT class=IbtnEn.........
    ▪Spring攻略学习笔记(3.07)------为Bean引入行为        一、知识点         有时候,你可能有一组共享公共行为的类。在OOP中,它们必须扩展相同的基类或者实现相同的接口。这确实是可以用AOP模块化的一个横切关.........
    ▪Spring攻略学习笔记(3.08)------为Bean引入状态       一、知识点              有时候,你可能希望为一组现有的对象添加新的状态,跟踪它们的使用情况,如调用次数、最后修改日期等。如果所有对.........

[1]ognl.OgnlException: target is null for setProperty(null, "y", [Ljava.lang.St
    来源: 互联网  发布时间: 2013-11-19

罪魁祸首是在表单里设置的name属性,因为设置了name属性,便要在struts中进行接收相应的值,而action里面是没有这个name值的,所以会出错,但是不影响运行的。

后来把<INPUT class=IbtnEnterCssClass id=IbtnEnter 
    style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" 
    onclick="this.form.submit();" type=image src=/blog_article/"images/user_botton.gif </LI></UL>里的红字去掉就可以了

作者:zhujiaxing666666 发表于2013-5-9 11:12:47 原文链接
阅读:80 评论:0 查看评论

    
[2]Spring攻略学习笔记(3.07)------为Bean引入行为
    来源: 互联网  发布时间: 2013-11-19

  一、知识点 

       有时候,你可能有一组共享公共行为的类。在OOP中,它们必须扩展相同的基类或者实现相同的接口。这确实是可以用AOP模块化的一个横切关注点。此外,Java的单继承机制仅允许一个类最多继承一个基类。所以,你不能同时从多个实现类中继承行为。

        引入(Introduction)是AOP中一种特殊类型的通知。通过为一个接口提供实现类,它允许对象动态地实现该接口。这看上去就像是对象在运行时继承了实现类。而且,你可以用多个实现类将多个接口同时引入对象。这可以实现与多重继承相同的效果。

二、代码示例

       MaxCalculator和MinCalculator接口,用于定义max()和min()运算。

package com.codeproject.jackie.springrecipesnote.springaop;

/**
 * @author jackie
 * 
 */
public interface MaxCalculator {
	public double max(double a, double b);
}
 
package com.codeproject.jackie.springrecipesnote.springaop;

/**
 * @author jackie
 * 
 */
public interface MinCalculator {
    public double min(double a, double b);
}
        相应的实现类

package com.codeproject.jackie.springrecipesnote.springaop;

/**
 * @author jackie
 * 
 */
public class MaxCalculatorImpl implements MaxCalculator {
	public double max(double a, double b) {
		double result = (a >= b) ? a : b;
		System.out.println("max(" + a + ", " + b + ") = " + result);
		return result;
	}
}
package com.codeproject.jackie.springrecipesnote.springaop;

/**
 * @author jackie
 * 
 */
public class MinCalculatorImpl implements MinCalculator {
	public double min(double a, double b) {
		double result = (a <= b) ? a : b;
		System.out.println("min(" + a + ", " + b + ") = " + result);
		return result;
	}
}
           如果希望ArithmeticCalculatorlmpl也执行max()和min()计算。由于Java语言仅支持单继承,让 ArithmeticCalculatorlmpl 类同时扩展 MaxCalculatorlmpl 和 MinCalculatorlmpl 是不可能的。唯一可能的方法是通过复制实现代码或者将处理委派给实际的实现类,扩展某个类 (例如MaxCalculatorlmpl)并实现另一个接口(例如MinCalculator)。在两种情况下,你都必须重复方法的声明。
        有了引入,通过使用实现类MaxCalculatorlmpl和MinCalculatorlmpl,可以使ArithmeticCalculatorlmpl动态地实现MaxCalculator和MinCalculator接口。这和从 MaxCalculatorlmpl 和 MinCalculatorlmpl多重继承有相同的效果。引入的非凡之处在于不需要修改ArithmeticCalculatorlmpl类引入新的方法。

       引入是通过动态代理在Spring AOP中实现这一切的。因为可以为动态代理指定一组需要实现的接口。引入就是通过向动态代理添加一个接口(例 如MaxCalculator)来工作的。当这个接口中声明的方法在代理对象上调用时,代理将把调用委派给后端实现类(例如MaxCalculatorlmpl)。
       引入和通知类似,必须在一个aspect中声明。可以创建一个新的aspect或者重用现有的aspect。在下面这个aspect中,可以使用@DeclareParents注解任意一个字段来声明引入。

package com.codeproject.jackie.springrecipesnote.springaop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;

/**
 * @author jackie
 * 
 */
@Aspect
public class CalculatorIntroduction {
	@DeclareParents(value = "com.codeproject.jackie.springrecipesnote.springaop.ArithmeticCalculatorlmpl", defaultImpl = MaxCaculatorImpl.class)
	public MaxCalculator maxCalculator;

	@DeclareParents(value = "com.codeproject.jackie.springrecipesnote.springaop.ArithmeticCalculatorlmpl", defaultImpl = MinCaculatorImpl.class)
	public MinCalculator minCalculator;
}

            @DeclareParents注解的value属性表示引入的目标类。引入的接口由被注解的字段类型确定。最后,用于新接口的实现类在defaultlmpl属性中指定。

         通过这两个引入,你可以动态地为ArithmeticCalculatorlmpl类引入两个接口。实际上,可以在@DeclareParents注解的value属性中指定一个AspectJ类型匹配表达式,将一个接口引入多个类。最后需要在应用上下文中声明这个aspect的一个实例。

<bean class="com.codeproject.jackie.springrecipesnote.springaop.CalculatorIntroduction" />
        测试类
package com.codeproject.jackie.springrecipesnote.springaop;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author jackie
 * 
 */
public class IntroductionTest {
	
	@Test
	public void testIntroduction() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator)applicationContext.getBean("arithmeticCalculator");
		arithmeticCalculator.add(1, 2);
		arithmeticCalculator.sub(1, 2);
		arithmeticCalculator.mul(1, 2);
		arithmeticCalculator.div(1, 2);
		
		MaxCalculator maxCalculator = (MaxCalculator) arithmeticCalculator;
		maxCalculator.max(1, 2);
		MinCalculator minCalculator = (MinCalculator) arithmeticCalculator;
		minCalculator.min(1, 2);
	}
}







 

作者:jackiehff 发表于2013-5-9 13:43:15 原文链接
阅读:55 评论:1 查看评论

    
[3]Spring攻略学习笔记(3.08)------为Bean引入状态
    来源: 互联网  发布时间: 2013-11-19

 一、知识点      

       有时候,你可能希望为一组现有的对象添加新的状态,跟踪它们的使用情况,如调用次数、最后修改日期等。如果所有对象都有相同的基类,这就不成问题。但是,如果不同的类不在相同的类层次结构中,添加这样的状态就很难。

       可以为对象引入一个新的接口,它有一个带有状态字段的实现类。然后,编写另一个通知来根据特定的条件改变状态。

二、代码示例

       假定你希望跟踪每个计算器对象的调用次数。由于在原来的计算器类当中没有保存计数器的字段,你需要使用Spring AOP引入一个。首先,为计算器的操作创建一个接口。

package com.codeproject.jackie.springrecipesnote.springaop;

/**
 * @author jackie
 * 
 */
public interface Counter {
	public void increase();
	public int getCount();
}
       实现类Counterlmpl
package com.codeproject.jackie.springrecipesnote.springaop;

public class CounterImpl implements Counter {
	// 存储计数器值
	private int count;

	@Override
	public void increase() {
		count++;
	}

	@Override
	public int getCount() {
		return count;
	}
}
           为了将以Counterlmpl为实现的Counter接口引入所有的计算器对象,可以编写如下的带有一个匹配所有计算器实现的类型匹配表达式的引入。

package com.codeproject.jackie.springrecipesnote.springaop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;

/**
 * @author jackie
 * 
 */
@Aspect
public class CalculatorIntroduction {	
	@DeclareParents(value = "com.codeproject.jackie.springrecipesnote.springaop.*CalculatorImpl", defaultImpl = CounterImpl.class)
	public Counter counter;	
}
      这个引入为每个计算器类引入Counterlmpl。但是,它仍然不能够跟踪调用次数。必须在每次调用一个计算器方法时增加计数器值。为此,可以编写一个最终(After)通知。注意,必须取得this对象,而不是target对象,因为只有代理对象实现了Counter接口。

package com.codeproject.jackie.springrecipesnote.springaop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;

/**
 * @author jackie
 * 
 */
@Aspect
public class CalculatorIntroduction {	
	。。。。。
	
	@After("execution(* com.codeproject.jackie.springrecipesnote.springaop.*Calculator.*(..)) && this(counter)")
	public void increaseCount(Counter counter) {
			counter.increase();
	}		
}
       测试类如下

package com.codeproject.jackie.springrecipesnote.springaop;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author jackie
 * 
 */
public class IntroduceStateTest {
	
	@Test
	public void testIntroduceState() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator)applicationContext.getBean("arithmeticCalculator");
		arithmeticCalculator.add(1, 2);
		arithmeticCalculator.sub(1, 2);
		arithmeticCalculator.mul(1, 2);
		arithmeticCalculator.div(1, 2);
		
		UnitCalculator unitCalculator = (UnitCalculator) applicationContext.getBean("unitCalculator");
		unitCalculator.kilogramToPound(100);
		unitCalculator.kilometerToMile(100);	
		
		Counter arithmeticCounter = (Counter) arithmeticCalculator;
		System.out.println(arithmeticCounter.getCount());
		Counter unitCounter = (Counter) unitCalculator;
		System.out.println(unitCounter.getCount());
	}
}



作者:jackiehff 发表于2013-5-9 17:28:47 原文链接
阅读:46 评论:0 查看评论

    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3