SSH为struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。
【框架介绍】
Spring:
单单说Spring在SSH中的作用。①管理Struts:在xml配置文件中为struts的action进行注入。②管理hibernate:在xml配置文件中配置hibernate的配置信息(dataSource,sessionFactory),为hibernate的dao操作注入sessionFactory属性值。
Struts:
用来响应用户的action,对应到相应的类进行处理。
Hibernate:
用来把实体类对应到数据库。提供增删改查的基本底层操作。
【搭建开发环境--jar包】
Spring、Struts、Hibernate相关的jar包,spring和struts整合的包,以及mysql的jdbc驱动包。
Struts:
jar包:
struts-2.3.15.3\apps\struts2-blank.war\WEB-INF\lib\*.jar
struts-2.3.15.3\lib\struts2-json-plugin-2.3.15.3.jar
struts-2.3.15.3\lib\struts2-spring-plugin-2.3.15.3.jar
Spring:
<Spring3.2开发最基本jar包>
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
<AOP开发>
spring-aop-3.2.0.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
<Spring Jdbc开发>
spring-jdbc-3.2.0.RELEASE.jar
spring-tx-3.2.0.RELEASE.jar
<Spring事务管理>
spring-tx-3.2.0.RELEASE.jar
<Spring整合其他ORM框架>
spring-orm-3.2.0.RELEASE.jar
<Spring在web中使用>
spring-web-3.2.0.RELEASE.jar
<Spring整合Junit测试>
spring-test-3.2.0.RELEASE.jar
Hibernate:
jar包:
hibernate-distribution-3.6.10.Final\hibernate3.jar
hibernate-distribution-3.6.10.Final\lib\required\*.jar
hibernate-distribution-3.6.10.Final\lib\jpa\*.jar
【搭建开发环境--配置文件】
1、Web.xml:
<!-- 配置Spring的核心监听器:监听器在创建时自动查找WEB-INF下的applicationContext.xml文件,从而创建spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置Struts2的核心过滤器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!--下面的配置表示对于所有的请求都交给struts来处理 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、struts.xml:
<struts>
<constantname="struts.devMode" value="false" />
<packagename="shop" extends="struts-default"namespace="/">
<!-- 配置首页访问的Action -->
<actionname="index" class="indexAction">
<resultname="index">/WEB-INF/jsp/index.jsp</result>
</action>
</package>
</struts>
3、applicationContext.xml:
<!-- 配置连接池:-->
<!-- 引入外部属性文件-->
<context:property-placeholderlocation="classpath:jdbc.properties" />
<!-- 配置C3P0连接池: -->
<beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">
<propertyname="driverClass" value="${jdbc.driver}" />
<propertyname="jdbcUrl" value="${jdbc.url}" />
<propertyname="user" value="${jdbc.user}" />
<propertyname="password" value="${jdbc.password}" />
</bean>
<!-- Hibernate的相关信息 -->
<beanid="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入连接池-->
<propertyname="dataSource" ref="dataSource" />
<!-- 配置Hibernate的其他的属性 -->
<propertyname="hibernateProperties">
<props>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<propkey="hibernate.show_sql">true</prop>
<propkey="hibernate.format_sql">true</prop>
<propkey="hibernate.connection.autocommit">false</prop>
<propkey="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 配置Hibernate的映射文件 -->
<propertyname="mappingResources">
<list>
<value>cn/itcast/shop/user/vo/User.hbm.xml</value>
</list>
</property>
</bean>
<!-- 事务管理:-->
<!-- 事务管理器-->
<beanid="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<propertyname="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 开启注解事务-->
<tx:annotation-driventransaction-manager="transactionManager" />
<!-- ********************Action的配置******************** -->
<!-- 首页访问的Action-->
<beanid="indexAction"class="cn.itcast.shop.index.action.IndexAction"
scope="prototype"></bean>
<!-- 用户模块的Action-->
<beanid="userAction"class="cn.itcast.shop.user.action.UserAction"
scope="prototype">
<!-- 注入Service-->
<propertyname="userService" ref="userService" />
</bean>
<!-- ********************Service的配置******************** -->
<beanid="userService"class="cn.itcast.shop.user.service.UserService">
<propertyname="userDao" ref="userDao" />
</bean>
<!-- ********************Dao的配置******************** -->
<beanid="userDao" class="cn.itcast.shop.user.dao.UserDao">
<propertyname="sessionFactory"ref="sessionFactory"></property>
</bean>
</beans>
【业务逻辑部分-以用户注册为例】
1.首先完成hibernate的操作部分。设计一个User实体类,该类中包含数据库中User表的所有字段。
package cn.itcast.shop.user.vo;
/**
* 用户模块实体类
* @author happy
*
*/
public class User {
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
private Integer uid;
private String username;
private String password;
private String name;
private String email;
private String phone;
private String addr;
private Integer state;
private String code;
}
2.新建一个User.hbm.xml文件,实现实体类与数据库的关联。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.shop.user.vo.User" table="user">
<id name="uid">
<generator class="native"/>
</id>
<property name="username"/>
<property name="password"/>
<property name="name"/>
<property name="email"/>
<property name="phone"/>
<property name="addr"/>
<property name="state"/>
<property name="code"/>
</class>
</hibernate-mapping>
3.接下来实现Dao层的操作。设计一个类UserDao,继承了HibernateDaoSupport类。
package cn.itcast.shop.user.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.itcast.shop.user.vo.User;
/**
* 用户模块持久层代码
*
* @author happy
*
*/
public class UserDao extends HibernateDaoSupport {
// 按名称查询是否有该用户:
public User findByUsername(String username) {
String hql = "from User where username = ?";
List<User> list = this.getHibernateTemplate().find(hql, username);
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
// 注册用户存入数据库代码实现
public void save(User user) {
this.getHibernateTemplate().save(user);
}
}
4.接下来Service层的操作。
package cn.itcast.shop.user.service;
import org.springframework.transaction.annotation.Transactional;
import cn.itcast.shop.user.dao.UserDao;
import cn.itcast.shop.user.vo.User;
import cn.itcast.shop.utils.MailUitls;
import cn.itcast.shop.utils.UUIDUtils;
/**
* 用户模块业务层代码
*
* @author happy
*
*/
@Transactional
public class UserService {
// 注入UserDao
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
// 按用户名查询用户的方法:
public User findByUsername(String username) {
return userDao.findByUsername(username);
}
//业务层完成用户注册代码:
public void save(User user) {
//将数据存入到数据库
user.setState(0);//0代表用户未激活,1代表用户已经激活
String code=UUIDUtils.getUUID()+UUIDUtils.getUUID();
user.setCode(code);
userDao.save(user);
}
}
5.定义UserAction类。
package cn.itcast.shop.user.action;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import cn.itcast.shop.user.service.UserService;
import cn.itcast.shop.user.vo.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 用户模块Action的类
*
* @author happy
*
*/
public class UserAction extends ActionSupport implements ModelDriven<User> {
// 模型驱动使用的对象
private User user = new User();
// 注入UserService
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public User getModel() {
return user;
}
/**
* 跳转到注册页面的执行方法
*/
public String registPage() {
return "registPage";
}
/**
* AJAX进行一步校验用户名的执行方法
*
* @throws IOException
*/
public String findByName() throws IOException {
// 调用Service进行查询
User existUser = userService.findByUsername(user.getUsername());
// 获得response对象,向叶面输出:
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=UTF-8");
// 判断
if (existUser != null) {
// 查询到该用户:用户名已经存在
response.getWriter().println("<font color='red'>用户名已经存在</font>");
} else {
// 没查询到该用户:用户名可以使用
response.getWriter().println("<font color='green'>用户名可以使用</font>");
}
return NONE;
}
/**
* 用户注册的方法:
*/
public String regist() {
userService.save(user);
this.addActionMessage("注册成功,情趣邮箱激活!");
return "msg";
}
}
6.前台的jsp
首先引用struts2的标签
<!-- 引用struts2的标签 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
然后,在页面设计中调用user_regist.action方法即可
<form id="registerForm"
action="${pageContext.request.contextPath}/user_regist.action "
method="post" novalidate="novalidate"
οnsubmit="return checkForm()">
其他一些边边角角的基础代码没有贴出来,大致框架就是这样。