`
ttitfly
  • 浏览: 623944 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

springside笔记二

阅读更多

1.web层(action)

StrutsAction类:

java 代码
  1. public class StrutsAction extends DispatchAction  

继承了分发Action类,在StrutsAction里还做了几个重要处理

A:设置Struts 中数字<->字符串转换

B:Object和Form之间的copyProperties

C:Save出错的Message

StrutsEntityAction类:这个类是供具体的实体Action来继承的

java 代码
  1. public abstract class StrutsEntityAction < T, M extends EntityDao < T > >   
  2.  extends StrutsAction implements InitializingBean  

 

因为implements了InitializingBean类,所以需要实现方法:afterPropertiesSet

java 代码
  1. /**  
  2.      * Init回调函数,初始化一系列泛型参数.  
  3.      */  
  4.     public void afterPropertiesSet() {   
  5.         // 根据T,反射获得entityClass   
  6.         entityClass = GenericsUtils.getSuperClassGenricType(getClass());   
  7.   
  8.         // 根据M,反射获得符合M类型的manager   
  9.         List < Field > fields = BeanUtils.getFieldsByType(this, GenericsUtils.getSuperClassGenricType(getClass(), 1));   
  10.         Assert.isTrue(fields.size() == 1"subclass's has not only one entity manager property.");   
  11.         try {   
  12.             entityManager = (M) BeanUtils.forceGetProperty(this, fields.get(0).getName());   
  13.             Assert.notNull(entityManager, "subclass not inject manager to action sucessful.");   
  14.         } catch (Exception e) {   
  15.             ReflectionUtils.handleReflectionException(e);   
  16.         }   
  17.   
  18.         // 反射获得entity的主键类型   
  19.         try {   
  20.             idName = entityManager.getIdName(entityClass);   
  21.             idClass = BeanUtils.getPropertyType(entityClass, idName);   
  22.         } catch (Exception e) {   
  23.             ReflectionUtils.handleReflectionException(e);   
  24.         }   
  25.     }   

具体看下上面这段代码:

java 代码
  1. entityClass = GenericsUtils.getSuperClassGenricType(getClass());  

这个和HibernateEntityDao里根据T,运用反射获得实际绑定entityClass(实体类)是一样的。

java 代码
  1. List < Field > fields = BeanUtils.getFieldsByType(this, GenericsUtils.getSuperClassGenricType(getClass(), 1));  

 这句代码里GenericsUtils.getSuperClassGenricType(getClass(), 1)获得实体Action传递过来的第2个泛型参数.比如:UserManager.class

然后又调用BeanUtils里的getFieldsByType方法。该方法具体为:

java 代码
  1. /**  
  2.      * 按Filed变量的类型取得Field变量列表.  
  3.      */  
  4.     public static List< Field > getFieldsByType(Object object, Class type) {   
  5.         List< Field > list = new ArrayList< Field >();   
  6.         Field[] fields = object.getClass().getDeclaredFields();   
  7.         for (Field field : fields) {   
  8.             System.out.println(field.getType() + ":" + field.getName());   
  9.             if (field.getType().isAssignableFrom(type)) {   
  10.                 list.add(field);   
  11.             }   
  12.         }   
  13.         return list;   
  14.     }  

 这段代码也就是根据传递进来的Class类型,获得用该类型定义的变量的列表List,也就是在具体的某个实体Action里,用该实体Manager定义的具体实例变量的一个List,比如:UserAction里用UserManager定义的实例变量的列表

继续看StrutsEntityAction里的afterPropertiesSet方法

java 代码
  1. entityManager = ( M ) BeanUtils.forceGetProperty(this, fields.get(0).getName());  

 

java 代码
  1. /**  
  2.      * 暴力获取对象变量值,忽略private,protected修饰符的限制.  
  3.      *  
  4.      * @throws NoSuchFieldException 如果没有该Field时抛出.  
  5.      */  
  6.     public static Object forceGetProperty(Object object, String propertyName) throws NoSuchFieldException {   
  7.         Assert.notNull(object);   
  8.         Assert.hasText(propertyName);   
  9.   
  10.         Field field = getDeclaredField(object, propertyName);   
  11.   
  12.         boolean accessible = field.isAccessible();   
  13.         field.setAccessible(true);   
  14.   
  15.         Object result = null;   
  16.         try {   
  17.             result = field.get(object);   
  18.         } catch (IllegalAccessException e) {   
  19.             logger.info("error wont' happen");   
  20.         }   
  21.         field.setAccessible(accessible);   
  22.         return result;   
  23.     }  
暴力获得某个实体Action里定义的实体Manager的 实例变量,并把该变量赋值给StrutsEntityAction里的entityManager
分享到:
评论
1 楼 kenbli 2007-10-31  
写得很好,希望继续~~

相关推荐

    springside-3.2.2源码

    二、Spring 集成与配置 SpringSide 使用了 Spring Framework 进行应用构建,通过 XML 和注解的方式进行配置。源码中可以看到 Spring 的依赖注入(DI)和面向切面编程(AOP)的广泛应用,以及对 SpringMVC、Spring ...

    SpringSide4 参考手册

    这些部分讲述了如何进行动态组合查询条件、使用Hibernate二级缓存、以及如何配置数据源和事务管理。 为了提升性能,文档介绍了各种缓存技术,包括Ehcache、Guava Cache以及分布式缓存的实现。还提到了如何在Ehcache...

    Springside-core-4.1.0/Springside-core-4.1.0

    二、SpringSide-core-4.1.0关键组件 1. **依赖管理**:SpringSide-core-4.1.0对常用的第三方库进行了严格的版本控制,确保了项目的一致性和稳定性。这包括Spring框架、Hibernate ORM、MyBatis等,这些依赖的版本都...

    springside开发全面讲解

    2. **依赖管理**:springside使用Maven进行依赖管理,通过预定义的配置文件,开发者可以快速导入所需的库,避免了手动管理jar包的繁琐过程。 3. **代码规范**:springside遵循Java编码最佳实践,如使用Checkstyle和...

    springside3.0.zip

    2. **Maven集成**:SpringSide 3.0 使用Maven作为构建工具,提供了标准的项目结构和配置,使得项目的构建、依赖管理和部署变得更加简单。通过Maven的POM.xml文件,开发者可以轻松管理项目的所有依赖库。 3. **...

    springside

    2. **最佳实践**:SpringSide定义了一套开发规范,包括命名规则、代码风格、测试策略等,有助于提升团队间的协作效率和代码质量。 3. **示例代码**:SpringSide提供了丰富的示例代码,涵盖了Spring Framework的各种...

    有springside4.2.3-GA.jar 包

    2. **Demo**:示例模块,提供了各种应用场景的实例,帮助开发者快速理解和使用SpringSide的各项功能,包括数据库操作、RESTful API开发、Maven构建等。 3. **Module**:模块化设计,SpringSide提供了多个可复用的子...

    springside3.3.4 使用方法

    #### 二、环境配置与准备 1. **安装Java JDK**: - 首先确保已经安装了Java环境,并且设置好`JAVA_HOME`环境变量。 - 推荐使用JDK 1.6以上版本,因为Springside 3.3.4支持Java 1.6及更高版本。 2. **安装Apache ...

    springside-core-4.2.2.GA(含关联的test.jar)

    pom.xml配置 ...mvn install:install-file -DgroupId=org.springside -DartifactId=springside-core -Dversion=4.2.2.GA -Dfile=./springside-core-4.2.2.GA.jar -Dpackaging=jar -DgeneratePom=true

    springside框架

    《SpringSide框架详解:整合Spring、Hibernate与Struts2的高效解决方案》 SpringSide框架,作为一款基于Java的开源企业级应用开发框架,是开发者们为了简化开发流程、提高开发效率而精心设计的。它巧妙地融合了...

    SpringSide3.3.4安装部署

    二、生成 mini-web 项目模板 在 SpringSide3.3.4 安装部署的过程中,我们需要生成 mini-web 项目模板。这个模板将作为我们后续开发的基础。我们可以使用 Maven 的 archetype 机制来生成这个模板。首先,我们需要在...

    springside.jar

    二、springside-parent:父项目配置 springside-parent作为项目的父POM,包含了项目构建的基础配置,如Maven插件、依赖管理等。它统一了项目的编码规范和构建流程,使得团队成员能更高效地协同开发。 三、...

    springside3.3完整版

    "ssh3.3"这个文件名暗示了SpringSide 3.3可能集成了Struts2、Hibernate和Spring,也就是常说的SSH框架。这三个框架的整合能够实现高效的MVC开发,Struts2处理请求和展示视图,Hibernate负责持久化操作,Spring则...

    SpringSide文档.chm

    SpringSide文档.chm。

    springside-4.0.0.GA.zip

    2. **配置文件**:包括Spring的XML配置文件和基于Java的配置,展示了如何灵活地配置Spring应用,以及如何利用 Profiles 实现环境的切换。 3. **文档**:SpringSide通常会附带详细的文档,解释每个示例的意图、工作...

    springside的jar包

    2. **配置管理**:Springside提供了一套统一的配置管理方案,使得Spring的配置更加简洁和清晰,减少了配置文件的冗余和错误。 3. **代码生成器**:通过内置的代码生成器,可以快速生成基于DAO、Service、Controller...

    springside3源码及jar

    二、springside3源码分析 1. **源码结构**:源码主要分布在src/main/java和src/test/java目录下。前者包含业务逻辑和组件实现,后者则包含单元测试代码。每个模块都有清晰的包结构,遵循单一职责原则,使得代码...

    springside4(showcase)

    《SpringSide 4:Spring MVC 实战展示》 在IT领域,SpringSide 4是一个备受推崇的开源项目,它是一个全面展示Spring框架及其生态系统的实战示例。标题"Springside4 (showcase)"暗示了这是一个以展示SpringSide 4...

    springside4-4.1.0.GA

    2. Spring配置优化:此版本进一步优化了Spring的配置,引入了更多的自动配置和Java配置,降低了XML配置的复杂性。 3. AOP增强:对AspectJ的深度集成,使得切面编程更为便捷,提高了代码的可维护性和模块化。 4. ...

    springside3文档资料收录

    二、依赖注入 依赖注入是Spring框架的核心,它解决了对象之间的耦合问题,降低了代码的复杂度。在SpringSide3中,你会了解到如何通过XML配置或注解方式实现依赖注入,以及如何使用ApplicationContext管理bean。 三...

Global site tag (gtag.js) - Google Analytics