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 >