现在的位置: 首页 > 综合 > 正文

转:S2H构架搭建个人小结

2013年09月01日 ⁄ 综合 ⁄ 共 10201字 ⁄ 字号 评论关闭


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

抱歉!评论已关闭.