标签:
说说项目架构整个变化过程吧
拿用户注册来举例:
数据库里面有一张User表
需要把注册信息存储到User表中
1. 最开始是两层架构
就是cliect + jsp + DB
就是在view里面直接操作数据库,就是在视图上建立数据库连接,然后把每个字段存储到数据库中
2. 构造一个Entity类
cliect + jsp + Entity + DB
对Entity的管理交给Jsp
建立一个User类,view中先对User进行实例化,然后再进行存储
这一步没有什么意义
3. 加入管理层
cliect + jsp + Entity + Service + DB
把对User的管理交给Service层
管理层,也就是业务逻辑层
4. 使用Hibernate对数据库进行操作
这种做法是在项目中引入了Hibernate
Hibernate的作用是把数据插入到数据库中。
但是,
如果要跨数据库呢
如果要把数据存储到Xml文件中或者网络上呢而不需要数据库呢
所以UserManage对User的存储就不能写死成了Hibernate或者JDBC或者xml
所以要引入DAO层
5. 加入DAO层
cliect + jsp + UserManage + UserManageImpl+ User+ +UserDAO + UserDAOimpl + DB
把对数据的存储操作抽象成一个接口,这个接口里面定义增删改查的方法,然后有不同的实现类,实现不同的存储方式
可以把业务逻辑类也抽象出来,不过这种做法并不多
6. 引入Struct,也就是引入MVC
Controller就是Struct的filter
Action先执行业务逻辑,然后根据配置的view在,返回结果
7. 引入spring
spring其实是贯穿于整个过程的
在抽象需要实例化的地方用spring的IOC
在各个业务处理的时候可以用spring的AOP
在这里面,UserManage拿userDAO的时候使用的是注入(必须给他一个实现类)
Action用UserManage的时候也是注入
所以
spring和struct2结合的主要地方是Action
Action本来是属于struct的,但是要想利用spring,必须把它交给spring容器才行。
实际上,spring是struct的一个插件
在struct的文档插件一节可以看到spring插件
所以,spring才是主导,struct向spring要需要的Action。(即要的时候向插件来要)
8. 配置
要加入spring
web.xml中要有监听器,在application启动的时候,找到bean所对应的xml的文件,并初始化所有的bean
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <!-- default: /WEB-INF/applicationContext.xml --> </listener>
默认寻找的路径是 WEB-INF/applicationContext.xml
如果改了路径或者改了名称,需要配置
<context-param> <param-name>contextConfigLocation</param-name> <!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> --> <param-value>classpath:beans.xml</param-value> </context-param>
classpath 表示是在src文件夹下
*的意思是可能配置文件有多个,比如不同的业务配置不同的文件,这里一下子读进来
这样,在启动的时候就启动了spring容器
下一步,把Action配到spring中去
加入struct2-spring-plugin.jar包
然后找到相应的Action,加上@Compont和@Resource,这样就交给了spring管理
struct2-spring-plugin.jar这个jar包里有一个文件struct-plugin.xml:
<struts> <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" /> <!-- Make the Spring object factory the automatic default --> <constant name="struts.objectFactory" value="spring" /> ....... </structs>
有一个name=spring的bean是一个springFactory
一般情况下,Struct需要一个Action的时候,会去找自己的StructFactory,但是在执行上面后,会去找spring拿,而springFactory会自动找到配置文件
比如struct中Action的name为User
它会根据这个名称到spring容器中找到name为User的bean
Struct启动时,读取文件de顺序
而spring启动是在web.xml中,也就是说应用启动时,spring容器就已经初始化了,当struct需要时,直接去容器中拿。
标签:
原文地址:http://www.cnblogs.com/tech-bird/p/4174571.html