Struts2+Spring+Hibernate整合 SSH入门 idea

引言

    之前一直做的是php开发,在我的认知里,我认为php在小项目中能起到很大的作用,因为他的门槛很低,随手都能echo两句,还能即时显示。但是如果到了数据量很大的情况下,php的并发性能大家可以搜一搜,所在在业务数据处理等一方面,我认为java还是略胜一筹。我对Servlet也不是很熟悉,这里只是入门,帮助大家能够快速进入到java web开发当中。


一 新建工程

    我使用的是idea,版本是14.1.1,打开idea,新建工程。左侧选择spring项目,在右侧勾选MVC,security,struts2,hibernate,在勾选完hibernate后选择创建默认配置文件。然后点击下一步,为工程起名,完成后等待idea默认下载依赖包。


二 修改文件

    在第二步中我们勾选了创建默认配置,同时它会在主目录下创建Main.java,我们将Main.class改名为HibernateUtils.java。


三 Spring测试

    接下来我们对Spring这个容器进行ioc测试,我在src目录下新建一个test包,然后在test包中创建一个TestService。

代码如下:

package test;

/**
 * Created by gavin on 15-6-18.
 */
public class TestService {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {

        return name;
    }

    public void hello()
    {
        System.out.println("hello "+ getName());
    }
}

    接下来,我们在web/WEB-INF目录下的applicationContext.xml文件中写入以下内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

       <bean class="test.TestService" id="testService">
              <property name="name" value="spring"></property>
       </bean>
</beans>

    接着,我们再在test包下创建一个Test.java文件,内容为:

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

/**
 * Created by gavin on 15-6-18.
 */
public class Test {
    public static void main(String[] args)
    {
        ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");
        TestService ts = (TestService)ac.getBean("testService");
        ts.hello();
    }
}

   运行test,如果输出为 hello spring 则配置正确。


四 HIbernate测试

    接下来,我们让spring接管HIbernate的配置文件,在applicationContext中配置以下内容

<!-- data connection -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
       <property name="url" value="jdbc:mysql://localhost:3306/nwu"></property>
       <property name="username" value="root"/>
       <property name="password" value="xxxx"/>
</bean>


<!-- session factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
       <property name="dataSource" ref="dataSource"></property>
       <property name="hibernateProperties">
              <props>
                     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                     <prop key="hibernate.show_sql">true</prop>
                     <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/xxx</prop>
                     <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
              </props>
       </property>

</bean>

   可能会缺少commons-dbcp2-2.1.jar和mysql-connector-java-5.1.26-bin.jar和commons-pool2-2.4.1.jar包,我们在网上下载一个jar包加入到工程中,怎么加呢?点击FIle,打开Project structure,点击Libraries,加入jar包。

    在src下创建bean包。

    这时候,在左下方有一个类似电影胶片的小框,点击小框,选择Persistence,打开后右击sessionFactory,选择最下面的generate persistence mapping。

    Struts2+Spring+Hibernate整合 SSH入门 idea

    关于database方面我就不讲l,网上教程很多,也很简单。这时候按照我上面的配置,点击OK。

    这时候idea就会在bean包下创建对应的bean和配置文件,同时在applicationContext.xml中添加对应配置。

    接下来,我们新建一个service包,在service包中新建一个接口,名为Address.java,内容为:

package Service;

import bean.Addresslist;

/**
 * Created by gavin on 15-6-18.
 */
public interface Address {
    public void add(Addresslist al);
}

    之后我们service包中新建一个Address的实现类AddressImpl,内容为:

    

package Service;


import bean.Addresslist;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

/**
 * Created by gavin on 15-6-18.
 */
public class AddressImpl implements Address{

    @Qualifier("sessionFactory")
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void add(Addresslist al) {
        Session s = sessionFactory.openSession();
        Transaction tx= s.beginTransaction();
        s.save(al);
        tx.commit();
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}

    其中sessionFactory和set方法是依靠spring自动加入的,快捷键是alt+insert

    我们在刚才的test文件中写入以下代码:

package test;

import Service.Address;
import Service.AddressImpl;
import bean.Addresslist;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

/**
 * Created by gavin on 15-6-18.
 */
public class Test {
    public static void main(String[] args)
    {
        ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");
        Address ail = (AddressImpl)ac.getBean("address");
        Addresslist al = new Addresslist();
        al.setName("xiaozhang");
        al.setPhone("123456");
        ail.add(al);
    }
}

    运行main函数,打开mysql看是否存入相应数据,存入就表示成功。


五 加入struts2

    在web/WEB-INF文件夹下的web.xml文件中加入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!--context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <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>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping-->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <!--old function-->
        <!--filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class-->
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 以下3项参数与log4j的配置相关 -->

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.properties</param-value>
    </context-param>

    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
    </listener>
    <!-- end -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext.xml</param-value>
    </context-param>
</web-app>

        在src目录下新建action包,添加AddressAction.java,内容为:

package action;

import Service.AddressImpl;
import bean.Addresslist;
import com.opensymphony.xwork2.ActionSupport;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by gavin on 15-6-18.
 */
public class AddressAction extends ActionSupport{

    private String name;
    private String phone;
    @Autowired
    private AddressImpl address;


    public void setName(String name) {
        this.name = name;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {

        return name;
    }

    public String getPhone() {
        return phone;
    }

    public String add()
    {
        Addresslist al = new Addresslist();
        al.setName(getName());
        al.setPhone(getPhone());
        address.add(al);
        return SUCCESS;
    }

    public void setAddress(AddressImpl address) {
        this.address = address;
    }
}

   接着,在src目录下的struts.xml中写入以下内容

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
        <!-- struts的action配置文件 -->
        <!-- 将action托管给spring -->
        <constant name="struts.objectFactory" value="spring" />

        <!-- 所有的action都应该放在对应的package下 -->

        <package name="addresslist" namespace="/addresslist" extends="struts-default">
                <action name="add" class="addressAction" method="add">
                        <result name="success">/index.jsp</result>
                </action>
        </package>
</struts>

    我们在index.jsp中随便写点什么,接下来配置tomcat服务器,这里不做详细介绍。

    应该会缺少org.springframework.web-3.0.5.RELEASE.jar和struts2-spring-plugin-2.3.24.jar包,我们下载这两个包并导入项目,这时候启动debug,如果报错则打开project struture ,在Artifacts中点击fix将额外添加的那几个包导入到lib中。

    这时候应该会正常启动tomcat,我们输入http://localhost:8080/addresslist/add?name=test&phone=test ,如果显示我们在index.jsp中写的内容,再查看数据库是否录入成功,如果成功,则整个整合过程完毕


六 总结

    整个配置流程还算比较简单,我在测试的时候也报了很多错误,一步一步整合过来的。总结以上,首先先把spring环境搭建起来,测试一下spring 的IOC是否工作。接下来,整合hibernate,将hibenrnate配置信息写入applicationContext中,从数据库中导出一个bean进行测试。最后,加入struts2,在web.xml中配置好拦截器,在struts.xml中设置让spring来接管action的调用。做完这一切,这才是java web的开始,spring容器是一个很好的工具,其中还有很多要去学习的内容。



你可能感兴趣的:(Struts2+Spring+Hibernate整合 SSH入门 idea)