zoukankan      html  css  js  c++  java
  • SSH架构

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

    拿用户注册来举例:

          数据库里面有一张User表

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

    1.   最开始是两层架构

          就是cliect   +  jsp    +   DB

         

           就是在view里面直接操作数据库,就是在视图上建立数据库连接,然后把每个字段存储到数据库中

    2.    加入Domain Model

         构造一个Entity类

          cliect   +  jsp    +  Entity + DB

          对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;
            .........
    }

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

  • 相关阅读:
    线性结构(二)--- 双链表
    线性结构(二)----单链表
    线性结构(二)---队列
    线性结构(二)--- 栈
    谁才是真正的资深开发者?
    在Tiled Map中使用碰撞检测
    Android横屏竖屏切换的问题
    android activity横竖屏切换,Activity重新创建问题解决!
    2D中如何判断一点在另一个点的那个方位
    浅析android应用增量升级
  • 原文地址:https://www.cnblogs.com/tech-bird/p/4174571.html
Copyright © 2011-2022 走看看