转:S2H构架搭建个人小结

    技术2022-05-19  17

    Struts技术 2010-07-15 10:33:50 阅读59 评论0   字 号:   订阅

    看过了两三个SSH搭建的视频(浪曦风中叶老师、尚学堂李勇老师的两个视频),也跟着视频把这个框 架搭了两遍,有点迷迷糊糊的,为了加深印象,我决定不依靠视频再来搭一遍,经过一天的调试与处理,终于能够独立自主地把SSH框架给搭建起来了,不容易 啊。其中出现的错误以及各种各样的BUG不计其数,通过查阅文档以及Google得到了解决。这里,我就来做一个总结:

    SSH框架的基本配置: 1.相关jar包的引入,这里我采用的是spring2 + struts2 + hibernate3的组合,搭完了之后才发现Spring已经到3了,不知道在Spring3上面的配置是否相同,有待尝试。

    Sql代码 -----核心 jar包-----    # spring.jar     # struts2-core.jar    # xwork-core.jar    # mysql-connector-java.jar    # hibernate3.jar    # struts2-spring-plugin.jar    -----在默认配置下核心jar所依赖的jar包---    # commons-collections.jar ---|    # commons-fileupload.jar-----|------------这三个jar包是在jakarta-commons 项目中一些    # commons-logging.jar--------|            基于JDK上扩展的工具包。    # freemarker.jar    # log4j.jar    # ognl.jar    # dom4j.jar    # jta.jar    # cglib-nodep.jar    # antlr.jar ------------ 这个jar包是spring AOP 采用 动态代理 时需要的jar包。

    -----核心jar包----- # spring.jar # struts2-core.jar # xwork-core.jar # mysql-connector-java.jar # hibernate3.jar # struts2-spring-plugin.jar -----在默认配置下核心jar所依赖的jar包--- # commons-collections.jar ---| # commons-fileupload.jar-----|------------这三个jar包是在jakarta-commons项目中一些 # commons-logging.jar--------| 基于JDK上扩展的工具包。 # freemarker.jar # log4j.jar # ognl.jar # dom4j.jar # jta.jar # cglib-nodep.jar # antlr.jar ------------ 这个jar包是spring AOP 采用 动态代理 时需要的jar包。

     

    2.相关的配置  i)/WEB-INF/web.xml  a.需要配置一个 Struts2的Filter:

    Xml代码 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>    </filter>    <filter-mapping>     <filter-name>struts2</filter-name>     <url-pattern>/*</url-pattern>    </filter-mapping>

    <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

     

     b.由于从struts2.1.3之后的版 本不再建议采用org.apache.struts2.dispatcher.FilterDispatcher,所以,我们最好配置成 StrutsPrepareAndExecuteFilter或者StrutsExecuteFilter以及StrutsPrepareFilter, 需要注意的是:如配置成StrutsExecuteFilter需要将StrutsPrepareFilter也配置上,否则将会报错。所以建议就只直接 采用StrutsPrepareAndExecuteFilter。

     c.此外还需要配置一个ContextListener:

    Xml代码 <listener>      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   </listener>

    <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

     如果你的applicationContext.xml没有配置在/WEB-INF/目录 或者采用的不是默认的文件名,则还需要配context-param,让Spring找到对应的配置文件,如下(注意:param-name的内容一定是 contextConfigLocation,Spring将根据该名称注入到相应的对象中):

    Xml代码 <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath*:application-Context.xml</param-value>   </context-param>

    <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:application-Context.xml</param-value> </context-param>

      ii)applicationContext.xml,这个文件是比较核心的文件:

     a)配置sessionFactory,有两种配置方式:  (1)采用传统的 Hibernate配置文件,将其映射到sessionFactory中:

    Xml代码 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    <property name="configLocation" >     <value>classpath:hibernate.cfg.xml</value>    </property>   </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" > <value>classpath:hibernate.cfg.xml</value> </property> </bean>

      采用这种方式时,需要在hibernate.cfg.xml文件中配置数据连接相关信 息,这里与一般的hibernate配置文件一样:

    Xml代码 <hibernate-configuration>     <session-factory>      <!-- connection configuration -->      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>      <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ssh_test</property>      <property name="hibernate.connection.username">root</property>      <property name="hibernate.connection.password">orange</property>      <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>      <!-- the following configuration just for  programming and debug -->      <property name="hibernate.show_sql">true</property>             <!-- mapping resource -->      <mapping resource="com/ssh/bean/User.hbm.xml"/>     </session-factory>    </hibernate-configuration>    (2) 采用sessionFactory属性的方式配置数据源相关信息,如下:          <!-- 配置数据源 -->    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">     <property name="driverClassName" value="com.mysql.jdbc.Driver" />     <property name="url" value="jdbc:mysql://localhost:3306/mytest" />     <property name="username" value="root" />     <property name="password" value="orange" />     <property name="maxActive" value="100" />     <property name="maxIdle" value="30" />     <property name="maxWait" value="500" />     <property name="defaultAutoCommit" value="true" />    </bean>         <!-- 将数据源映射到sessionFactory中 -->    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">     <property name="dataSource" ref="dataSource" />     <property name="hibernateProperties">      <props>       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>       <prop key="hibernate.show_sql">true</prop>      </props>     </property>     <property name="mappingResources">      <list>       <value>com/test/bean/User.hbm.xml</value>      </list>     </property>    </bean>

    <hibernate-configuration> <session-factory> <!-- connection configuration --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ssh_test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">orange</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- the following configuration just for programming and debug --> <property name="hibernate.show_sql">true</property> <!-- mapping resource --> <mapping resource="com/ssh/bean/User.hbm.xml"/> </session-factory> </hibernate-configuration> (2)采用sessionFactory属性的方式配置数据源相关信息,如下: <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mytest" /> <property name="username" value="root" /> <property name="password" value="orange" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="500" /> <property name="defaultAutoCommit" value="true" /> </bean> <!-- 将数据源映射到sessionFactory中 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/test/bean/User.hbm.xml</value> </list> </property> </bean>

     

      b)配置完sessionFactory后,还可以根据需要配置以下三方面的内容,也可 以不配置选择采用默认的方式:

    Xml代码 <!-- 配 置事务管理器 -->   <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">    <property name="sessionFactory">     <ref bean="sessionFactory"/>    </property>     </bean>      <!-- 配置事务的传播特性 -->   <tx:advice id="txAdvice" transaction-manager="transactionManager">    <tx:attributes>     <tx:method name="add*" propagation="REQUIRED"/>     <tx:method name="del*" propagation="REQUIRED"/>     <tx:method name="modify*" propagation="REQUIRED"/>     <tx:method name="*" read-only="true"/>    </tx:attributes>   </tx:advice>      <!-- 那 些类的哪些方法参与事务 -->   <aop:config>    <aop:pointcut id="allManagerMethod" expression="execution(* xxx.xxx.*.*(..))"/>    <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>   </aop:config>

    <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <!-- 配置事务的传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="modify*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 那些类的哪些方法参与事务 --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* xxx.xxx.*.*(..))"/> <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/> </aop:config>

     这样就基本完成了我们的ssh的相关配置。

    3.SSH的基本使用:  具体分工:  # 在applicationContext.xml中配置相关的bean信息

    Xml代码  <bean id="userService" class="com.ssh.service.impl.UserServiceImpl">    <property name="userDao" ref="userDao"/>   </bean>      <bean id="loginAction" class="com.ssh.action.LoginAction">    <property name="service" ref="userService" />   </bean>

    <bean id="userService" class="com.ssh.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean> <bean id="loginAction" class="com.ssh.action.LoginAction"> <property name="service" ref="userService" /> </bean>

      这里的property属性中name值对应的是相应处理类生成时需要IoC容器注入的 属性,比如说id为loginAction的处理类为com.ssh.action.LoginAction(它其中应当设置一个 setService(UserService service)方法),这样在需要使用该bean时,IoC容器会调用这个setService方法来将生成的userService对象传入。

    需要注意的是,如果想让IoC容器注入相应属性,则必须要实现相应属性的set方法。

     # 在struts.xml中配置action的相关信息  相关注意事项:  由 于所有的bean都由Spring来管理,那么在struts.xml中一个action的class属性就不能写成具体的类,而是要使用该类在 applicationContext.xml文件中配置的Bean的id,如:

    Xml代码 <action name="login" class="loginAction">     <result name="success">/result.jsp</result>     <result name="input">/index.jsp</result>    </action>

    <action name="login" class="loginAction"> <result name="success">/result.jsp</result> <result name="input">/index.jsp</result> </action>

      这个loginAction对应的就是上面的id为loginAction的bean, 而这个bean的class属性中设置的才是真正的对应的Action的处理类。

     # 对于每个模型,都要有一*.hbm.xml

    3.其它一些注意点: Spring中一些的概念很重要:AOP,IOC。

    struts2.0 与struts2.1.x 的区别

    每次struts的更新,都会发现它的基础jar包不同,下面我就列举最新版的 struts2的基础jar包.

    struts2.0.14:它们为commons-logging- 1.0.4,freemarker-2.3.8,ognl-2.6.11,struts2-core-2.0.14,xwork-2.07.

    struts2.1.6:它们为commons-fileupload- 1.2.1,commons-io-1.3.2,commons- logging-1.0.4,freemarker-2.3.13,ognl-2.6.11,struts2-core-2.1.6,xwork-2.1.2.

    struts2.1.8:它们为commons-fileupload- 1.2.1,commons- logging-1.0.4,freemarker-2.3.15,ognl-2.7.3,struts2-core-2.1.8,xwork-2.1.6.

    web.xml 考虑到以后兼容以后的版本,原来的FilterDispatcher 和ActionContextCleanUp将在以后的版本中去掉,官方推荐使用 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter


    最新回复(0)