项目构建
新建web项目ssh2,建好后添加struts功能
添加spring功能:(注意选择的spring版本,并且取消掉MyEclipse自带的jar包,我们之后手动加入相应的jar包)
完成之后添加hibernate功能:
这里的数据库驱动连接加不加都是可以的,因为后面我们要有一个dbconfig.properties文件手动配置数据库驱动。
完成之后,我们手动加入struts2+spring+hibernate需要的jar包:
spring整合hibernate和struts,只要在配好了applicationContext.xml,在struts的action中直接调用就可以了。hibernate访问数据库的操作都在spring中实现了,spring的调用又在stuts的action中实现了。所以我们删掉了无用的hibernate配置文件hibernate.cfg.xml。
之后就可以在相应的层里实现需要的功能了。以下实现一个简单的注册用户功能:
完成之后我们的项目文件就是下面这样的:
实现代码
User.java
package com.lmb.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private Long id;
private String loginname;
private String password;
private Integer age;
private Date birthday;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result
+ ((birthday == null) ? 0 : birthday.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result
+ ((loginname == null) ? 0 : loginname.hashCode());
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (birthday == null) {
if (other.birthday != null)
return false;
} else if (!birthday.equals(other.birthday))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (loginname == null) {
if (other.loginname != null)
return false;
} else if (!loginname.equals(other.loginname))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
return true;
}
}
User实体类配置文件:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<!-- xml文件配置Hibernate实体映射 -->
<hibernate-mapping package="com.lmb.hibernate.domain"><!--实体类所在的包 -->
<!-- 实体类 -->
<class name="User" table="user"><!-- name=""用来指定实体类, table=""用来指定数据库表格 -->
<id name="id" column="id" type="java.lang.Long"><!-- id主键 -->
<generator class="native"/><!--数据库自动增长 -->
</id>
<property name="loginname" type="java.lang.String"></property><!-- 配置实体类变量-->
<property name="password" type="java.lang.String"></property><!-- 配置实体类变量-->
<property name="age" type="java.lang.Integer"></property><!-- 配置实体类变量-->
<property name="birthday" type="java.util.Date"></property><!-- 配置实体类变量-->
</class>
</hibernate-mapping>
UserManagerImpl.java
package com.lmb.manager;
import com.lmb.dao.UserDao;
import com.lmb.domain.User;
public class UserManagerImpl implements UserManager{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(User user) {
userDao.insertObject(user);
}
}
UserAction.java
package com.lmb.web.action;
import com.lmb.domain.User;
import com.lmb.manager.UserManager;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private User user;
private UserManager userManager;
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute(){
userManager.saveUser(user);
return SUCCESS;
}
}
application-user.xml把有关User的操作的配置从applicationContext.xml分离出来,单独配置;
application-user.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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="userDao" class="com.lmb.dao.UserDaoImpl" parent="baseDao"></bean>
<bean id="userManager" class="com.lmb.manager.UserManagerImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userAction" class="com.lmb.web.action.UserAction" scope="prototype">
<property name="userManager" ref="userManager"></property>
</bean>
</beans>
本例中的applicationContext.xml实现了以下作用:
1、配置数据源;
2、配置SessionFactory;
3、配置事务管理;
4、导入分离出的配置文件application-user.xml;
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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 读取属性文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:dbconfig.properties"></property>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${URL}"></property>
<property name="driverClassName" value="${DRIVER_CLASS}"></property>
<property name="username" value="${USER_NAME}"></property>
<property name="password" value="${PASSWORD}"></property>
</bean>
<!-- 配置SessionFactoryBean -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 加载映射配置文件 -->
<property name="mappingResources">
<list>
<value>com/lmb/domain/User.hbm.xml</value>
</list>
</property>
<!-- -如果使用的是@注解的形式,映射的实体类应该以下面这种形式加载->
<property name="annotatedClasses">
<list>
<value>实体类全路径</value>
</list>
</property>
<!-- 关于hibernate属性的配置 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<bean id="baseDao" class="com.lmb.dao.BaseDaoImpl" abstract="true">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<import resource="application-user.xml" />
</beans>
数据库驱动属性文件:
dbconfig.properties
struts.xml中配置控制层的action,因为SSH整合之后struts是由spring来管理的,所以这里的class属性只需要给出spring配置文件中相应action具体实现的id即可;
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="ssh" extends="struts-default" >
<action name="userAction" class="userAction">
<result>/ok.jsp</result>
</action>
</package>
</struts>
在web.xml中配置struts的分发器和spring的上下文对象applicationcontext的构建监听器,所有的请求都被映射到struts2上,项目启动时构建applicationcontext对象,并保存到servletContext对象中,在运行时就可以使用spring的上下文对象,这个对象永远不会消失。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 该监听器的作用:项目启动时构建applicationcontext对象,并保存到servletContext对象中,在运行时就可以使用spring的上下文对象,这个对象永远不会消失 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 通过该节点告诉servletContext对象到哪里去读取applicationcontext的配置文件,如果配置文件读取失败applicationcontext对象就会构建失败 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath: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></web-app>
index.jsp
<form action="userAction.action">
用户名:<input type="text" name="user.loginname" /><br/>
密码:<input type="password" name="user.password"/><br/>
年龄:<input type="text" name="user.age"/><br/>
出生日期:<input type="text" name="user.birth"/><br/>
<input type="submit" value="submit"/><br/>
</form>
有关几个配置文件的总结:
1、web.xml
web.xml中要配置struts的分发器,所有的请求都被映射到struts2上。还要配置一个spring的监听器用于构建spring的上下文对象applicationcontext,以便项目启动时构建就applicationcontext对象,并保存到servletContext对象中,在运行时就可以使用spring的上下文对象;
2、struts.xml
struts.xml中只需要配置控制层action的相关信息,要注意因为SSH整合之后spring整合hibernate和struts,所以struts的配置文件struts.xml要依赖于spring的配置文件applicationContext.xml.
以上配置也充分体现了struts的功能: struts 负责 web 层 .ActionFormBean 接收网页中表单提交的数据,然后通过 Action 进行处理,再 Forward 到对应的网页。在 struts.xml 中定义 <action>
, 相应的Action就 会加载。
3、applicationContext.xml
spring配置文件applicationContext.xml的作用:
1)、配置数据源;
2)、配置SessionFactory;
3)、配置事务管理;
4)、配置数据持久层;xxxDao
5)、配置业务逻辑层; xxxService(xxxManager)
6)、配置控制层; xxxAction
7)、配置POJO;xxx
在实际的业务应用中,实体会有很多,如果都配置在applicationContext.xml中,管理起来非常麻烦,所以,我们可以把有关实体的配置抽取出来,单独写到一个文件中去application-xxx.xml,该配置文件实现的功能就是:
4)、配置数据持久层;xxxDao
5)、配置业务逻辑层; xxxService(xxxManager)
6)、配置控制层; xxxAction
7)、配置POJO;xxx
而applicationContext.xml只需要将抽取出的配置文件引入并实现以下功能:
1)、配置数据源;
2)、配置SessionFactory;
3)、配置事务管理;
以上配置也充分体现了spring的功能:
spring 负责业务层管理,即 Service (或 Manager).
1) . service (或 Manager)为 action 提供统一的调用接口,封装持久层的 DAO.
2 ).可以写一些自己的业务方法。
3 ).统一的 javabean 管理方法
4 ).声明式事务管理:集成 Hiberante
4、xxx.hbm.xml
配置Hibernate实体映射 ,该实体映射也可以用@注解的形式配置。
Hibernate的配置文件hibernate.cfg.xml的作用是配置数据库驱动,并声明用XML文件或者@注解配置的实体类,但SSH整合之后spring整合hibernate和struts,有关数据库驱动和声明用XML文件或者@注解配置的实体类的配置被放到applicationContext.xml下的SessionFactoryBean配置中,所以该配置文件不需要再用到。