Spring+Struts初体会

来源:互联网 发布:手机解码软件下载 编辑:程序博客网 时间:2024/05/17 03:07

要加载Spring应用,首先要在web.xml里声明如下:

 

       <context-param>

              <param-name>contextConfigLocation</param-name>

       <param-value>

/WEB-INF/applicationContext-hibernate.xml

</param-value> 

       </context-param>

 

       <servlet>

         <servlet-name>SpringContextServlet</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>   

         <load-on-startup>1</load-on-startup>

       </servlet>

 

以上声明是使web应用在一开始就加载SpringapplicationContext-hibernate.xml配置文件。

 

spring里可以使用jndiDataSource,在applicationContext-hibernate.xml里声明如下:

 

       <bean id="dataSource"

class="org.springframework.jndi.JndiObjectFactoryBean">

              <property name="jndiName">

<value>java:comp/env/jdbc/mydc</value>

</property>

       </bean>

 

Spring也可以使用比较常用的apachedbcp,声明如下:

 

       <bean id="dataSource"

 class="org.apache.commons.dbcp.BasicDataSource">

              <property name="driverClassName">

<value> net.sourceforge.jtds.jdbc.Driver </value>

</property>

              <property name="url">

<value> jdbc:jtds:sqlserver://localhost:1433/forum </value>

</property>

              <property name="username"><value>sa</value></property>

              <property name="password"><value>123456</value></property>

       </bean>

 

 

spring也可以使用自己的DataSource,在applicationContext-hibernate.xml里如下声明:

 

       <bean id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

              <property name="driverClassName">

<value>net.sourceforge.jtds.jdbc.Driver</value>

</property>

              <property name="url">

<value>jdbc:jtds:sqlserver://localhost:1433/forum</value>

</property>

              <property name="username">

<value>sa</value>

</property>

              <property name="password">

<value>123456</value>

</property>

       </bean>

 

下面是关于hibernate的使用:

 

首先Spring使用一个自己的类LocalSessionFactoryBean来控制hibernateSessionFactory的加载(同时可以摈弃原来hibernate带的hibernate.properties或者hibernate.cfg.xml,那些原有的配置在hibernateProperties节点下声明),声明如下:

 

       <bean id="mySessionFactory"

class="org.springframework.orm.hibernate.LocalSessionFactoryBean">

              <property name="dataSource">

<ref local="dataSource"/><!-- 指向上面声明的DataSource -->

</property>       

              <property name="mappingResources"><!--加载hibernate映射文件 -->

                     <list>

                            <value>com/meagle/bo/Order.hbm.xml</value>

                            <value>com/meagle/bo/OrderLineItem.hbm.xml</value>

                     </list>

              </property>       

             

              <!--下面是加载原来hibernate.propertieshibernate.cfg.xml里的内容-->

              <property name="hibernateProperties">

                     <props>

                            <prop key="hibernate.dialect">

net.sf.hibernate.dialect.SQLServerDialect

</prop>

                            <prop key="hibernate.show_sql">true</prop>

                            <prop key="hibernate.cglib.use_reflection_optimizer">

true

</prop>

                     </props>

              </property>

       </bean>

 

Spring声明事务的加载,如下:

 

       <bean id="myTransactionManager"

class="org.springframework.orm.hibernate.HibernateTransactionManager">

              <property name="sessionFactory">

<ref local="mySessionFactory"/>

</property>

       </bean>

 

为了使用springhibernate支持,编写一个自己的DAO类来继承HibernateDaoSupport类,在这个DAO里使用Spring提供的hibernate支持来编写对数据库里的表的各个操作。一个DAO的例子里可以使用hibernateTemplate里的一些直接的方法,例如:

 

       public Role findRoleByName(String name) {

              return

(Role) getHibernateTemplate().find("from Role r where r.name=?",name).get(0);

       }

 

也可以使用一些从hibernate映射文件里定义的Query语句,一般使用于比较复杂的hql语句,这些hql语句可以使用hibernate8ide来调试,例如:

 

       public List getUsersWithoutContactInfo(){

              return

getHibernateTemplate().findByNamedQuery("UsersWithoutContactInfo");

       }

 

还可以自定义执行一个匿名的HibernateCallback对象,用来自己控制hibernate里的session等的操作,例如:

 

      

public List findOrdersPlaceByUser(final String placedBy) {

 

              return getHibernateTemplate().executeFind(

new HibernateCallback() {

                            public Object doInHibernate(Session session)

                                   throws HibernateException, SQLException {

 

                                   StringBuffer sb = new StringBuffer(100);

                                          sb.append("select distinct order ");

                            sb.append("from Order order ");

                                          sb.append("join order.lineItems lineItems ");

                            sb.append("where order.placedBy = :placedBy");

                                          sb.append("order by order.id");

 

                            Query query = session.createQuery(sb.toString());

                            query.setString("placedBy", placedBy);

 

                            List list = query.list();

 

                            return list;

 

                                   }  // end doInHibernate()

              }); // end executeFind()

       }

 

 

然后再定义一个service类,这个类里持有一个内部field为对应的DAO,这个类存放的是具体的业务操作。

 

最后在spring的配置文件里声明如下:

 

       <!-- ***** 定义供struts查找的service,通过插入事务对象使这个service类具有事务处理的能力 *****-->

       <bean id="orderService"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

              <property name="transactionManager">

<ref local="myTransactionManager"/>

</property>

              <property name="target"><ref local="orderTarget"/></property>

              <property name="transactionAttributes">

                     <props>

                            <prop key="find*">

PROPAGATION_REQUIRED,readOnly,-OrderException

</prop>

                            <prop key="save*">

PROPAGATION_REQUIRED,-OrderException,-OrderMinimumAmountException

</prop>

                     </props>

              </property>

       </bean>

 

      

       <!—我们写的实现具体商业逻辑的service对象-->

       <bean id="orderTarget"

class="edu.cqu.rdc.service.spring.OrderServiceSpringImpl">

              <property name="orderDAO"><ref local="orderDAO"/></property>

       </bean>

 

       <!—我们写的DAO对象 -->

       <bean id="orderDAO"

class="edu.cqu.rdc.service.dao.hibernate.OrderHibernateDAO">

              <property name="sessionFactory">

<ref local="mySessionFactory"/></property>

       </bean>

 

要在Struts里对这个service进行引用。可以使用以下方法:

 

       public void setServlet(ActionServlet actionServlet) {

              super.setServlet(actionServlet);

              ServletContext servletContext = actionServlet.getServletContext();

              WebApplicationContext wac =

                     WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);

              this.orderService = (IOrderService) wac.getBean("orderService");

       }

 

 

 

 

原创粉丝点击