Joan's javaworld - Struts2+Spring2.5+Hibernat...

来源:百度文库 编辑:神马文学网 时间:2024/04/29 01:47:40
一、Struts2+Spring2.5+Hibernate3搭建过程:
1. Eclipse->New->Danamic Web Project
2. 加入核心jar包:
Struts2核心包:
struts2-core-2.0.11.2.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
xwork-2.0.5.jar
struts2-spring-plugin-2.0.11.2.jar
Spring核心包:
spring.jar
Hibernate核心包:
hibernate3.jar
antlr-2.7.6.jar
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ehcache-1.2.jar
jta.jar
log4j-1.2.11.jar
其他包:ojdbc14.jar、dwr.jar等

3. 提供相关配置文件,修改web.xml
Web.xml配置:


struts2
org.apache.struts2.dispatcher.FilterDispatcher


struts2
/*




contextConfigLocation
/WEB-INF/applicationContext-*.xml



org.springframework.web.context.ContextLoaderListener




Spring character encoding filter
org.springframework.web.filter.CharacterEncodingFilter

encoding
UTF-8




Spring character encoding filter
/*



java.lang.Throwable
/error.jsp




http://java.sun.com/jsp/jstl/core
/WEB-INF/tld/c.tld


http://java.sun.com/jsp/jstl/fmt
/WEB-INF/tld/fmt.tld




login.jsp



在src/java下添加struts.xml配置文件:
Struts配置文件:

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">





























在src下添加hibernate配置文件及其log4j.properties.(日志记录配置文件,在hibernate包中可以找到)
Hibernate配置文件:
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">



jdbc:oracle:thin:@localhost:1521:orcl
oracle.jdbc.driver.OracleDriver
demo
demo

org.hibernate.dialect.OracleDialect
true

update






在webroot/WEB-INF下添加spring核心配置文件,提供对hibernate的支持,配置数据源及SessionFactory:
applicationContext-core.xml配置文件:

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-2.5.xsd">




oracle.jdbc.driver.OracleDriver


jdbc:oracle:thin:@localhost:1521:orcl


demo


demo











org.hibernate.dialect.OracleDialect
true
update



classpath:hibernate.cfg.xml




文件目录结构:

图一、src目录结构



图二、webroot目录结构

测试:配置相关的数据库连接,部署启动项目,看能否正常启动。

二、demo示例程序开发过程:

1. 创建实体类及其hibernate映射文件,创建数据库表。
在com.isoftstone.ssh.demo.entity下创建实体类:User
public class User extends BaseEntity {

private long userId;
private String username;
private String password;
//getters和setters方法省略
}
//BaseEntity为实现Serializable接口的实体类

在entity包下,提供hibernate实体类映射文件如下:
User.hbm.xml










在hibernate.cfg.xml中添加资源配置:


使用hibernate提供的类实现数据库表的创建:
在com.isoftstone.ssh.common.util中,执行ExportDB的main()方法,生成实体类对应的数据库表(注:在hibernate.cfg.xml中需要暂时提供数据库连接等属性,后期可以采用Ant和xDoclet的方式,自动生成实体类的配置文件及创建数据库表)


2.编写DAO层及其实现类:
编写UserDAO接口,
package com.isoftstone.ssh.demo.integration.dao;

import java.util.List;

import com.isoftstone.ssh.common.core.BaseDAO;
import com.isoftstone.ssh.demo.entity.User;

public interface UserDAO extends BaseDAO {

public void createUser(User user);
public void deleteUser(long userId);
public List searchAllUser();

public User loginUser(String username, String password);
}

编写UserDAO类的实现类UserHiberanteDAO,继承HibernateDaoSupport实现UserDAO
package com.isoftstone.ssh.demo.integration.dao.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.isoftstone.ssh.common.core.ProjectException;
import com.isoftstone.ssh.demo.entity.User;
import com.isoftstone.ssh.demo.integration.dao.UserDAO;

public class UserHibernateDAO extends HibernateDaoSupport implements UserDAO {
@Override
public void createUser(User user) {}

@Override
public void deleteUser(long userId) {}

@Override
public List searchAllUser() {
return getSession().createQuery("from User").list();
}

@Override
public User loginUser(String username, String password) {
User user = findUserByUsername(username);
if(user == null)
throw new ProjectException("用户名不存在:" + username);
if(!user.getPassword().equals(password))
throw new ProjectException("密码不正确!");

return user;
}


private User findUserByUsername(String username){
return (User)
this.getSession().createQuery("select u from
com.isoftstone.ssh.demo.entity.User u where u.username=?")
.setParameter(0, username)
.uniqueResult();
}

}

在applicationContext-demo.xml中配置DAO,纳入spring的IOC容器管理,







(注意:HibernateDaoSupport由Spring框架提供,对hibernate提供了支持,其使用和hibernate的session基本一致;配置DAO类时,注意设置scope属性为“prototype”类型)


3.编写Service层及其实现类
编写UserService接口:
package com.isoftstone.ssh.demo.biz.service;

import java.util.List;
import com.isoftstone.ssh.demo.entity.User;

public interface UserService {
public void createUser(User user);
public void deleteUser(long userId);
public List searchAllUser();
public User loginUser(String username, String password);
}

编写service实现类:UserPojoService
package com.isoftstone.ssh.demo.biz.service.impl;

import java.util.List;

import com.isoftstone.ssh.common.core.BaseService;
import com.isoftstone.ssh.demo.biz.service.UserService;
import com.isoftstone.ssh.demo.entity.User;
import com.isoftstone.ssh.demo.integration.dao.UserDAO;

public class UserPojoService extends BaseService implements UserService {

@Override
public void createUser(User user) {}
@Override
public void deleteUser(long userId) {}
@Override
public List searchAllUser() {
UserDAO userDAO = (UserDAO) context.getBean("userDAO");
return userDAO.searchAllUser();
}

@Override
public User loginUser(String username, String password) {

UserDAO userDAO = (UserDAO) context.getBean("userDAO");
return userDAO.loginUser(username, password);
}
}

在applicationContext-demo.xml中配置Service,纳入spring的IOC容器管理,



(注意:UserPojoService实现类继承了BaseService类,BaseService实现类Service接口及其 BeanNameAware, DisposableBean,InitializingBean, BeanFactoryAware等spring提供的工具类,在spring启动的时候会自动注入相关的属性,这样在其实现类中可是直接通过配置的beanName使用spring容器中的相关bean等,如context.getBean(“beanName”);)


4. 编写Struts2的Action控制器
在com.isoftstone.ssh.demo.web.action包中创建LoginAction
package com.isoftstone.ssh.demo.web.action;

import com.isoftstone.ssh.common.core.AbstractAction;
import com.isoftstone.ssh.demo.biz.service.UserService;
import com.isoftstone.ssh.demo.entity.User;

public class LoginAction extends AbstractAction {

private UserService userService;
private User user = new User();


@Override
public String execute() throws Exception {
user = userService.loginUser(user.getUsername(), user.getPassword());
getSession().put("user", user);
logger.debug("logger信息 : " + user.getUsername() + " : " + user.getPassword() + ": " + user.getUserId());
return SUCCESS;
}


@Override
public User getViewModel() {
return user;
}

public void setUserService(UserService userService) {
this.userService = userService;
}
}

在spring配置文件中添加action类的配置:
class="com.isoftstone.ssh.demo.web.action.LoginAction"
scope="prototype">



配置Struts配置文件,在struts-demo.xml添加配置文件:



/welcome.jsp
/login.jsp






在struts.xml中添加子文件:


注意:(1. LoginAction 继承于抽象类AbstractAction,AbstractAction继承了Struts2的ActionSupport类,及其实现了ModelDriven, SessionAware, ParameterAware等接口,提供getRequest(),getSession()以及日志记录logger等,在common/util包中可以查看其代码;2. struts2对spring提供了支持,通过struts2-spring-plugin-2.0.11.2.jar包,Action类是交给spring的ioc容器管理,且scope属性为prototype,spring默认为singleton,Struts2不同于Struts1的单实例,不需要考虑线程安全问题;3. Struts配置文件中,action的class属性为spring配置的Action Bean的名字)


5. 页面显示,配置Struts2的验证器
在login.jsp中使用sturts的标签做显示,如:
//struts2标签






实现struts2的验证器,在LoginAction的包下添加配置文件(可从struts2的jar包中找到资源文件)
package.properties:(用于定义国际化消息文本)
HelloWorld.message= Struts is up and running ...
requiredstring = ${getText(fieldName)} is required.
password = Password
username = Username

LoginAction-validation.xml:
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">














注意:(sturts2的验证功能是通过interception拦截器实现的,在struts-default.xml文件中,默认是开启验证功能)

6. 其他:在common/core包中提供了自定义异常等类,在sturts.xml中配置了全局异常处理等




/common/error.jsp

/login.jsp