Struts+Spring+Hibernate 本次配置环境:Myeclipse5.5、MySQL5.0、Struts1.2、Spring2.0、Hibernate3.1 一、建工程 略。。。。。。 二、要使用Struts、Spring、Hibernate必须导入必需的包 1、Struts(和之前没区别) 2、Spring 分别导入Spring 2.0 Core Libraries、Spring 2.0 Web Libraries 选择把*.jar Copy到工程/WebRoot/WEB-INF/lib下; 点击NEXT 选择applicationContext.xml的目录,/WebRoot/WEB-INF;点击finish 3、Hibernate 在导入Hibernate时,当然先要配置DataSource咯,这里就不再说了 选择导入Hibernate全选上 选上复选框:Hibernate 3.1 Core......、Hibernate 3.1 Advanced......、Spring 2.0 ORM/DAO....... 同样选择把*.jar Copy到工程/WebRoot/WEB-INF/lib下; 点击NEXT 这里我们选择把hibernate交给spring去管理 选中单选按钮 Spring configuration file...... 点击NEXT 选择已存在的applicationContext.xml文件, 填写SessionFactory ID :sessionFactory 点击NEXT 这里我们需要填写Bean Id :dataSource 选择 DB Driver :选择刚才配置的DataSource 点击NEXT 这里不需要创建 SessionFactory Class 点击Finish 注意:查看applicationContext.xml的变化 三、映射VO、数据操作 首先工程的结构建好,比较简单的结构: org.chenwj.dao org.chenwj.struts org.chenwj.struts.action org.chenwj.struts.form org.chenwj.vo 映射表userinfo创建持久类到org.chenwj.vo目录 在dao下创建数据库操作类 UserDAO 这里只是对数据库进去插入,代码如下: private SessionFactory sessionFactory; public SessionFactory getSessionFactory() ...{ return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) ...{ this.sessionFactory = sessionFactory; } /**//* 用户注册 */ public boolean regist(Userinfo user) ...{ try ...{ Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.save(user); tx.commit(); session.close(); return true; } catch (Exception ex) ...{ ex.printStackTrace(); return false; } } 使用依赖注入,setter设值 sessionFactory 到此数据层已经完成 四、配置struts-config.xml 添加action、form、jsp 略…… 首先在struts-config.xml添加一个插件 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in> 为什么要添回这个插件呢? 因为在后面会在applicationContext.xml下配置action,让action交给spring 去管理,实现了struts的依赖注入机制 接下来添加cuntroller,这里你可以使用DelegatingActionProxy代理 <controller processorClass= "org.springframework.web.struts.DelegatingRequestProcessor"/> Controller取代了struts的RequestProcessor,在定义action里,我们可以省略 type属性。(我个人比较喜欢用这个)下面让我们看配置好的struts-config.xml: <struts-config> <data-sources /> <form-beans> <form-bean name="userForm" type="org.chenwj.struts.form.UserForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings> <action attribute="userForm" input="/index.jsp" name="userForm" path="/user" scope="request"> <forward name="success" path="/success.jsp" /> <forward name="error" path="/index.jsp" /> </action><!--type属性可不写--> </action-mappings> <controller processorClass= "org.springframework.web.struts.DelegatingRequestProcessor"/> <message-resources parameter="org.chenwj.struts.ApplicationResources" /> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in> </struts-config> 五、在applicationContext.xml配置action 这里我们先在 action类里添加一些业务逻辑,代码如下: public class UserAction extends Action ...{ private UserDAO userDao; private Userinfo user; public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) ...{ UserForm userForm = (UserForm) form; //封装数据 user.setName(userForm.getName()); user.setPassword(userForm.getPassword()); if(userDao.regist(user))...{ return mapping.findForward("success"); } return mapping.findForward("error"); } public Userinfo getUser() ...{ return user; } public void setUser(Userinfo user) ...{ this.user = user; } public UserDAO getUserDao() ...{ return userDao; } public void setUserDao(UserDAO userDao) ...{ this.userDao = userDao; }} 这里使用setter实现依赖注入了两个bean,接下来配置applicationContext.xml <beans xmlns="略……"> <!—- 数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/demo"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!-- sessionFactory --> <bean id="sessionFactory" class= "org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> </props> </property> <property name="mappingResources"> <list> <value>org/chenwj/vo/Userinfo.hbm.xml</value> </list> </property> </bean> <!-- 数据库操作类 --> <bean id="userDao" class="org.chenwj.dao.UserDAO"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <!-- action需要注意:这里是name属性不是ID,同时要和struts-config.xml 对应的 action path属性值相同,斜线也是必需的,通过这个属性scope= "prototype" 每次获取bean实例时都会产生新的实例,默认是单例--> <bean name="/user" class="org.chenwj.struts.action.UserAction" abstract="false" lazy-init="default" autowire="default" scope="prototype" dependency-check="default"> <property name="userDao" ref="userDao" /> <property name="user" ref="user" /> </bean> <bean id="user" class="org.chenwj.vo.Userinfo" abstract="false" lazy-init="default" autowire="default" dependency-check="default"> </bean> </beans> 到此所有的配置已经完成,测试: HTTP Status 404 - Servlet action is not available The requested resource (Servlet action is not available) is not available 这个错误是大部初学者整合 SSH 时都会遇到的问题 首先建议你使用测试类进行测试,这样我们可以很快找到错误所在的地方 public static void main(String[] args) ...{ ApplicationContext context = new FileSystemXmlApplicationContext( "/WebRoot/WEB-INF/applicationContext.xml"); UserDAO dao = (UserDAO)context.getBean("userDao"); Userinfo user = new Userinfo(); user.setName("aaa"); user.setPassword("bbb"); boolean a = dao.regist(user); if(a)...{ System.out.println("OK"); } } 如果这里没出错,那么请你好好检查你的配置文件,是否写错或少了些什么东东了 这里出的错误也跟使用的版本有关系,这里报的错一般都是说找不到XX类所报的异常 那么请检查lib下有没commons-pool-1.2.jar包,如没请导入,这个问题也有可能是包 之间的****,删除这个包hibernate-annotations.jar 六、.sql文件、.jsp文件 create table userinfo( id int(10) not null auto_increment, name varchar(20), password varchar(20), PRIMARY KEY (id)) <body> <html:form action="/user"> name : <html:text property="name"/><br/> password : <html:password property="password"/><br/> <html:submit/><html:cancel/> </html:form> </body>