BaseAction的抽取

项目中的每个实体类都对应一个action  每个action都都要继承ActionSupport类 已以及实现ModelDriver接口  并且需要注入service 虽然每个action注入的service不同

但是也有可能另外一个action需要使用到其他action中的service  那么就存在大量的重复注入代码  尽管service是单例的不影响性能  但是我们需要做的是尽量少些重复代码

例如

此时BaseAction诞生了

package org.base;
import java.lang.reflect.ParameterizedType;
import javax.annotation.Resource;
import org.service.DepartmentService;
import org.service.RoleService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{ //通过反射获得T的真实类型 然后 实例化model对象
public BaseAction(){
//得到泛型的父类
ParameterizedType pz=(ParameterizedType) this.getClass().getGenericSuperclass();
//得到第一个类型参数的真实类型
Class<T> clazz=(Class<T>) pz.getActualTypeArguments()[0];
//创建实例对象 异常 抛出
try {
model=clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
protected T model;
public T getModel() {
return model;
} //因为子类(继承该action)action已经在spring容器中 所以 baseAction不需要注入进容器
//就可以注入容器中的对象 否则 注入容器中的对象 必须自己先注入进容器
@Resource
protected RoleService roleService;
@Resource
protected DepartmentService departmentService;
}

上边的代码蓝色阴影中

protected设置为受保护的  子类可以继承并访问

abstract的作用:BaseAction不需要实例  所以声明为抽象的

<T> 泛型:每个子类action在实现modelDriver时都需要指定对应的model类型  子类action在实例化自己的时候 先调用父类的构造方法  实例化model  然后才能在自己的类中得到该model (访问权限为propected) 所以在继承BaseAction的时候 给该父类传递明确的类型T(例如 Department  或者Role)

----

如此  子类action中就可以只写具体操作service的代码了 其他代码全部又BaseAction来完成

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

项目简单,serivce业务层没有业务代码  只是纯粹的调用dao时   删除dao层  采用两层架构 

service中不在使用dao进行调用  而是service中直接继承数据库操作的类  在action中调用serivce时  直接调用了数据库操作的类

传统结构:

action调用service  serivce调用dao

dao继承了baseDao   所以最终service调用的其实是basedao中的方法

现在进行两层设计   删去dao以及daoimpl实现类  service直接继承basedao

最终的代码实现还是在basedaoimpl中  不过需要注意的是 需要在basedaoimpl上加入事务管理   只要存在对数据的增删改查  都加入事务处理  因为事务提交之后 才会对数据做更改

之前service中加入了事务 是因为在service中是先调用了dao   现在如果直接继承basedaoimpl  那么action在调用service的时候  父类是daosupportImpl 对其无效  没有经过事务管理

所以当子类继承父类中的方法后 ,调用父类中的方法执行增删改查的时候,即使子类service上标记的有事务注解   也不管用,需要在父类的上边开启事务注解

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

模型封装时

前端页面XX.id 提交给 自动封装进某个对象的XX属性(对象属性)的id属性中

在action中也不用进行关联操作(前提是id不能为null 如果为空 查到的对象自然也是nul 所以直接给该对象中的这个对象属性关联null) 直接保存或修改就行

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

action中执行添加之前model.getId()没有值,这个值是在添加记录之后,由数据库自动生成的,不过需要注意的是,当调用方法保存之后,在action的model模型中  再通过model.getId()是可以得到刚才保存的那条记录的id的

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

方法返回值为集合的时候,如果查找之后的内容为空  返回空集合

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

多对多关系  拆分为两个一对多关系

用户和角色是多对多关系,一个用户可以有多个角色(岗位) 

一个岗位可一个存在多个用户

用户:user表

角色:role表

中间表:user_role

他们对应的映射文件我这里就不在截图了  关于他们的配置在之前的ssh整合总结中有详细的配置说明

这里做总结的原因是  当时在做添加的时候  有点小迷惑  不知道怎么去完成添加(当时是这样想的  用户提交给后台action的属性中  id是在插入数据库后自动创建的

但是这里的中间表需要的是user对象  以及role对象啊   没有id属性值  我怎么做关联  或者说没有id的对象  关联之后 能够进行级联添加吗  即在做用户添加的时候 关联之后 只保存用户对象 相关联的数据 会保存吗(中间表的数据能否添加成功))

所以我最早采用的是 :先不关联role  然后保存model对象  保存之后 数据库可以返回刚插入的记录对应的id 然后有了用户id  role对象  创建中间表对象  设置中间表对象的值  另外写了中间表操作类  然后遍历保存(有几个role对象  就遍历几次  保存几次  完成了向中间表插入数据的效果  最后也完成了项目的需求   这种方式不推荐使用  )

不推荐方式对应代码:

下面说说  我看了看之前写的博客总结(hibernate一对多总结  hibernate多对多总结  ssh总结一 二) 迷惑散去之后   改进之后的代码吧

前台页面:

action中可以得到用户选择的所有岗位对应的id值

然后重点来了

这样就完成了级联保存操作(前提 :1.配置级联保存操作 save-update  2.上面红线前边的代码不可以缺少  两者缺一不可  少其中任何一个  中间表数据都不会保存  造成只向用户表插入记录  )

另外需要思考的是:配置级联是在哪方配置的?是一方还是多方  答案:一方配置  我们通常情况下都是通过保存一的同时来级联保存中间表的数据  所以级联操作是保存在一方的配置文件set表签内的

但是 会不会出现通过保存中间表的数据 来级联保存一方表的数据呢 答案我这里可以肯定的告诉你不会   说说原因吧 ,这里我举一个前边做过的项目的例子:

还记得这个项目吗(不记得 去前边的 ssh项目总结中找)  这个项目中 客户customer  用户user 就是多对多的关系  然后拆分 引出中间表(拜访表)visit

这个项目中操作的对象就正好是我上边说的那种情况  直接保存中间表对象(所以一方表对应的配置文件中当然就不用配置级联属性)    没有级联保存一方表(customer,user)  所以在多方visit映射配置文件中也没有配置级联属性

 为啥呢 ?  说到这里大家看图也应该明白了吧  一方数据已经在页面上显示了   等于说一方数据已经存在于数据库中了  那还保存个毛线啊   这里只是让用户选择   然后 提交给后台   最终做的操作只是向中间表中插入数据  表示某个用户拜访了某个客户  当然后台对应的有中间表操作类  提交给的action也是中间表对应的action  这种方式只能单独写一个中间表操作类  因为不可能在通过一方表来进行关联  配置级联  然后通过保存一方 级联保存中间表数据   那样不就转了一大圈 然后又转回来了  何不直接使用我刚才在最上边 迷惑之后使用的那种改进的代码呢。

看下面截图:

提交给action 调用的操作类也是中间表的操作类

所以说到这里大家都对这两种方式清楚了吧 

第一种方式:配置级联  通过保存一方  级联保存多方

第二种:直接操作的就是中间表对象  不用配置级联属性  直接提交给中间表action 调用中间表操作类 直接对中间表进行插入数据

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

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

OA项目知识总结2的更多相关文章

  1. OA项目知识总结

    struts文件配置 --------------------------------------------------------- 配置c3po链接池 --------------------- ...

  2. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  3. [deviceone开发]-企业OA项目开源分享

    一.简介 是一个真实的企业OA项目改造的开源项目,几乎涵盖了所有常用的组件,包括环信实现在线聊天等功能,类似微信的朋友圈功能,自定义的智能搜索等,而且这个是真实的通过Http链接后台web服务,里面很 ...

  4. 01传智_jbpm与OA项目_整体项目架构

    oA项目: 项目结构如下:

  5. 基于SSH2的OA项目1.0_20161206_需求分析与框架搭建

    1. SSH项目 OA项目,办公自动化,将公司的数据,文档,流程实现在系统中的管理. 降低人员交流过程中的成本.提高办公的效率. 2 .系统管理 主要实现系统权限的管理,不同的用户登陆后看到菜单项不一 ...

  6. OA项目实战(二) 开发准备

    上次的博文OA系统实践(一) 概述中,我们已经了解了OA的相关概念.从本次博文开始,我们做一个简单的OA实例. 在OA开发之前,有几个工作们需要提前做.一个是对需求进行分析,另一个是对开发环境进行选择 ...

  7. 第一周博客之二---OA项目环境搭建及开发包部署

    OA项目环境搭建 一个项目想要能够在开发人员打包好项目包之后进行测试,就必须进行项目测试环境的搭建,要根据开发工程师的开发环境采用不同的测试环境,以下只是浅谈下Java项目OA(办公自动化平台)的环境 ...

  8. OA项目_环境搭建

    OA项目现在要做成微服务,用的框架是springboot,所用的编程工具是idea,maven,做为一个程序员最关心的就是我需要在那个架包中编写代码,我们只需关注domain,repository,s ...

  9. 修改struts2自定义标签的源代码,在原有基础上增加功能(用于OA项目权限判断,是否显示某个权限)

    OA项目在做权限判断时  原始方式: 现在完成的功能 :通过改变struts2自定标签源代码   在原有的基础上  增加判断权限的功能  而页面上使用标签的方式 还是下图 步骤: 打开文件 搜索< ...

随机推荐

  1. swift 声明特性 类型特性

    原文地址:http://www.cocoachina.com/newbie/basic/2014/0612/8801.html 特性提供了关于声明和类型的很多其它信息.在Swift中有两类特性,用于修 ...

  2. 支持中文的基于词为基本粒度的前缀树(prefix trie)python实现

    Trie树,也叫字典树.前缀树.可用于"predictive text"和"autocompletion".亦可用于统计词频(边插入Trie树边更新或加入词频) ...

  3. BZOJ 3037 创世纪 树形DP

    题目大意:给定一张有向图,每一个点有且仅有一条出边,要求若一个点x扔下去,至少存在一个保留的点y,y的出边指向x,求最多扔下去多少个点 首先原题的意思就是支配关系 我们反向考虑 求最少保留的点 要求一 ...

  4. PHP获取数组长度的方法 函数参数的比较

    在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧.php如何获取数组的长度,使用php函数c ...

  5. luogu1072 Hankson的趣味题

    题目大意 给出数a0, a1, b0, b1,求满足gcd(a0, x)=a1, lcm(b0, x)=b1的x的个数 解法一 枚举b1的因数,看看是否满足上述条件. 怎样枚举因数 试除法.对于1~s ...

  6. bzoj1081: [SCOI2005]超级格雷码(dfs)

    1081: [SCOI2005]超级格雷码 题目:传送门 题解: 又是一道水题... 因为之前做过所以知道规律: 如n=2 B=3: 00 10 20    21 11 01    02 12 22 ...

  7. 【BZOJ3218】【UOJ#77】a + b Problem

    题目 题目在这里 思路&做法 明显的最小割(其实是之前做过一道类似的题) S向每一个格子连容量为\(b_i\)的边 每一个格子向T连容量为\(w_i\)的边 对于格子\(i\)向满足条件的格子 ...

  8. BZOJ 1537 cdq分治

    思路: 我只是想写一下cdq-- 二维偏序 一维排序 一维cdq分治 (我忘了归并排序怎么写了,,,) 写了个sort- 复杂度是O(nlog^2n) //By SiriusRen #include ...

  9. VirtualBox里如何正确安装增强工具(图文详解)

    不多说,直接上干货! 找到 复制到

  10. HBase编程 API入门系列之工具Bytes类(7)

    这是从程度开发层面来说,为了方便和提高开发人员. 这个工具Bytes类,有很多很多方法,帮助我们HBase编程开发人员,提高开发. 这里,我只赘述,很常用的! package zhouls.bigda ...