SSH架构

 

说说项目架构整个变化过程吧web

 

拿用户注册来举例:spring

      数据库里面有一张User表数据库

      须要把注册信息存储到User表中apache

 

 

1.   最开始是两层架构网络

 

      就是cliect   +  jsp    +   DB架构

 

     

 

       就是在view里面直接操做数据库,就是在视图上创建数据库链接,而后把每一个字段存储到数据库中app

 

 

2.    加入Domain Modeljsp

     构造一个Entity类测试

      cliect   +  jsp    +  Entity + DBui

      对Entity的管理交给Jsp

       

         创建一个User类,view中先对User进行实例化,而后再进行存储

         这一步没有什么意义

 

3.   加入管理层

      cliect +  jsp  +  Entity + Service + DB

      把对User的管理交给Service层

 

      管理层,也就是业务逻辑层

 

     

 

    

4.    加入Hibernate

       使用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在,返回结果

 

        M是由两层构成的,bussinuiss layer和DAO layer

 

     

 

 

7.       加入spring

 

     

 

          spring实际上是贯穿于整个过程的

          在抽象须要实例化的地方用spring的IOC

          在各个业务处理的时候能够用spring的AOP

 

 

         在这里面,UserManage拿userDAO的时候使用的是注入(必须给他一个实现类)

          Action用UserManage的时候也是注入

 

         因此

 

          spring和struct2结合的主要地方是Action

 

          实际上,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的关系能够有两种方式

    

       1. Action交给spring容器管理

 

   

 

       把Action配到spring中去

       加入struct2-spring-plugin.jar包

       而后找到相应的Action,加上@Compont和@Resource,这样就交给了spring管理

 

@Component("u")
@Scope("prototype")
public class UserAction extends ActionSupport implements ModelDriven {

private UserManager userManager;
......

       @Resource
       public void setUserManager(UserManager userManager) {
           this.userManager = userManager;
       }

   <package name="registration" extends="struts-default">
        <action name="u" class="u">
            <result name="success">/registerSuccess.jsp</result>
            <result name="fail">/registerFail.jsp</result>
        </action>
    </package>

 

 

     这里面Action上的component值必须和struct.xml中的action的class相同

     同时还加上@Scope("prototype") 非单例模式

 

    action交给spring管理,spring的bean默认是单例模式,

    可是strct每次收到一个请求,都要创建一个ActionContext,ValueStack,Action,而后把action放进valuestack

    若是定义成单例显示不符

    可是若是在action中不涉及成员变量的读写操做,能够用单例,稍微提升点效率

 

 

   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顺序

  • 1.Structs-default.xml
  • 2.Structs-plugh.xml
  • 3.structs.xml
  • 4.struct.properties
  • 5.web.xml

 

而spring启动是在web.xml中,也就是说应用启动时,spring容器就已经初始化了,当struct须要时,直接去容器中拿。

  

 

        2.Action由struct容器管理

 

        这种作法是Action上什么也不用加,action对象的产生是放在struct容器中的,不禁spring管理

 

public class UserAction extends ActionSupport implements ModelDriven {    
    

    private UserManager userManager;
        .........
    public void setUserManager(UserManager userManager) {
             this.userManager = userManager;
    }
}

 

 

 

<struts>
    <package name="registration" extends="struts-default">
        <action name="u" class="com.bjsxt.registration.action.UserAction">
            <result name="success">/registerSuccess.jsp</result>
            <result name="fail">/registerFail.jsp</result>
        </action>
    </package>
</struts>

 

 

       就是在Action上什么标记也不加,那么Action就会在struct容器里

       可是service和DAO改加仍是要加,仍是要放在spring容器里面

 

        那么在struct容器里产生的时候,会自动到spring容器里找须要注入的东西,固然因为什么标记都没加,就是ByName找的

       那若是想匹配指定的name怎么办呢,就不须要写set方法了,直接在Action的属性上加

public class UserAction extends ActionSupport implements ModelDriven {
    
    
    @Resource(“u”);    
    private UserManager userManager;
        .........
}

 

 

 

          固然,第一种方法比较好测试

相关文章
相关标签/搜索