Struts2的配置文件是struts.xml和web.xml
Spring的配置文件是applicationContext.xml和web.xml
Hibernate的配置文件是实体映射配置文件和hibernate.cfg.xml和jdbc.properties
总的流程大致是web层调用Service层,Service层调用DAO层,然后返回
详细流程就是:
1.jsp页面提交表单,通过web.xml里配置的过滤器找到struts.xml里对应的action和方法
2.web层通过applicationContext.xml注入了Service层的对象,从而调用Service层的方法
3.Service层通过applicationContext.xml注入了DAO层的对象,从而调用DAO层的方法
4.DAO层数据库连接的配置在applicationContext.xml中(或hibernate.cfg.xml),连接到数据库后,使用模板执行sql
文件结构图
配置内容:
实体映射配置文件
代码语言:javascript复制<?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>
<!--建立类与表的映射-->
<!--如果类中的属性名和表中的字段名一直,column可以省略-->
<class name="com.jinke.ssh.domain.Customer" table="customer">
<!--建立类中的属性与表中的主键对应-->
<id name="id" column="id">
<generator class="native"/>
</id>
<!--建立类中的普通属性和标的字段的对应-->
<property name="name" column="name"/>
<property name="source" column="source"/>
<property name="industry" column="industry"/>
<property name="level" column="level"/>
<property name="phone" column="phone"/>
<property name="mobile" column="mobile"/>
</class>
<query name="queryAll">from Customer</query>
</hibernate-mapping>
applicationContext.xml
代码语言:javascript复制<?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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置C3P0连接池-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--Spring整合hibernate-->
<!--引入hibernate的配置信息-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--引入hibernate的配置文件-->
<!--<property name="configLocation" value="classpath:hibernate.cfg.xml"/>-->
<!--注入连接池-->
<property name="dataSource" ref="dataSource"/>
<!--配置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>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!--设置映射文件-->
<property name="mappingResources">
<list>
<value>com/jinke/ssh/domain/Customer.hbm.xml</value>
</list>
</property>
</bean>
<!--配置Action 方法二-->
<bean id="customerAction" class="com.jinke.ssh.web.action.CustomerAction" scope="prototype">
<property name="customerService" ref="customerService"/>
</bean>
<!--配置service-->
<bean id="customerService" class="com.jinke.ssh.service.impl.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"/>
</bean>
<!--配置DAO-->
<bean id="customerDao" class="com.jinke.ssh.dao.impl.CustomerDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--开启注解事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
hibernate.cfg.xml(如果DAO层是由Spring配置的话,此文件可不写)
代码语言:javascript复制<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--必须配置===============-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!--配置Hibernate的方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--可选配置===============-->
<!--打印sql-->
<property name="hibernate.show_sql">true</property>
<!--格式化sql-->
<property name="hibernate.format_sql">true</property>
<!--自动创建表-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--配置C3P0连接池-->
<property name="connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目-->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库的最大数目-->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除-->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
<!--映射文件的引用===============-->
<mapping resource="com/jinke/ssh/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
jdbc.properties
代码语言:javascript复制jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=1234
struts2.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.action.extension" value="action"/>
<!--配置Action 方法一-->
<!-- <package name="ssh1" extends="struts-default" namespace="/">
<action name="customer_*" class="com.jinke.ssh.web.action.CustomerAction" method="{1}">
<allowed-methods>save</allowed-methods>
</action>
</package>-->
<!--配置action 方法二-->
<package name="ssh1" extends="struts-default" namespace="/">
<action name="customer_*" class="customerAction" method="{1}">
<allowed-methods>save,findById</allowed-methods>
</action>
</package>
</struts>
web.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--Spring核心监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--加载Spring配置文件的路径,默认加载WEB-INF/applicationContext.xml-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--用来解决延迟加载问题的过滤器-->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<!--Struts2核心过滤器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
下面是java文件
代码语言:javascript复制import com.jinke.ssh.dao.CustomerDao;
import com.jinke.ssh.domain.Customer;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import java.util.List;
/**
* DAO层的实现类
*/
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
@Override
public void save(Customer customer) {
System.out.println("DAO中的save方法被执行了");
this.getHibernateTemplate().save(customer);
}
@Override
public void update(Customer customer) {
this.getHibernateTemplate().update(customer);
}
@Override
public void delete(Customer customer) {
this.getHibernateTemplate().delete(customer);
}
@Override
public Customer findById(int id) {
Customer customer = this.getHibernateTemplate().load(Customer.class, id);
return customer;
}
@Override
public List<Customer> findAllByHQL() {
List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from Customer");
return list;
}
@Override
public List<Customer> findAllByQBC() {
//自带分页
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
return list;
}
@Override
public List<Customer> findAllByName() {
return (List<Customer>) this.getHibernateTemplate().findByNamedQuery("queryAll");
}
}
代码语言:javascript复制import com.jinke.ssh.domain.Customer;
import java.util.List;
/**
* DAO层的接口
*/
public interface CustomerDao {
void save(Customer customer);
void update(Customer customer);
void delete(Customer customer);
Customer findById(int id);
List<Customer> findAllByHQL();
List<Customer> findAllByQBC();
List<Customer> findAllByName();
}
public class Customer {
private int id;
private String name;
private String source;
private String industry;
private String level;
private String phone;
private String mobile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getIndustry() {
return industry;
}
public void setIndustry(String industry) {
this.industry = industry;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
@Override
public String toString() {
return "Customer{"
"id=" id
", name='" name '''
", source='" source '''
", industry='" industry '''
", level='" level '''
", phone='" phone '''
", mobile='" mobile '''
'}';
}
}
代码语言:javascript复制import com.jinke.ssh.dao.CustomerDao;
import com.jinke.ssh.domain.Customer;
import com.jinke.ssh.service.CustomerService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 业务层的实现类
*/
@Transactional
public class CustomerServiceImpl implements CustomerService {
//注入DAO
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
@Override
public void save(Customer customer) {
System.out.println("Service中的save方法执行了");
customerDao.save(customer);
}
@Override
public void update(Customer customer) {
System.out.println("Service中的update方法执行了");
customerDao.update(customer);
}
@Override
public void delete(Customer customer) {
System.out.println("Service中的delete方法执行了");
customerDao.delete(customer);
}
@Override
public Customer findById(int id) {
System.out.println("Service中的findById方法执行了");
return customerDao.findById(id);
}
@Override
public List<Customer> findAllByHQL() {
System.out.println("Service中的findAllByHQL方法执行了");
return customerDao.findAllByHQL();
}
@Override
public List<Customer> findAllByQBC() {
System.out.println("Service中的方法执行了");
return customerDao.findAllByQBC();
}
@Override
public List<Customer> findAllByName() {
return customerDao.findAllByName();
}
}
代码语言:javascript复制import com.jinke.ssh.domain.Customer;
import java.util.List;
/**
* 客户管理的业务层的接口
*/
public interface CustomerService {
void save(Customer customer);
void update(Customer customer);
void delete(Customer customer);
Customer findById(int id);
List<Customer> findAllByHQL();
List<Customer> findAllByQBC();
List<Customer> findAllByName();
}
代码语言:javascript复制import com.jinke.ssh.domain.Customer;
import com.jinke.ssh.service.CustomerService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SSHdemo {
@Resource
private CustomerService customerService;
@Test
public void update() {
Customer customer = customerService.findById(3);
customer.setName("三石");
customerService.update(customer);
}
@Test
public void delete() {
Customer customer = customerService.findById(1);
customerService.delete(customer);
}
@Test
public void findAllByHQL() {
List<Customer> customerList = customerService.findAllByHQL();
for (Customer customer : customerList) {
System.out.println(customer);
}
}
@Test
public void findAllByQBC() {
List<Customer> customerList = customerService.findAllByQBC();
for (Customer customer : customerList) {
System.out.println(customer);
}
}
@Test
public void findAllByName() {
List<Customer> customerList = customerService.findAllByName();
for (Customer customer : customerList) {
System.out.println(customer);
}
}
}
代码语言:javascript复制import com.jinke.ssh.domain.Customer;
import com.jinke.ssh.service.CustomerService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 客户管理的Action的类
*/
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
//模型驱动使用的对象
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
//注入customerService
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
/**
* 报错客户的方法
*/
public String save() {
System.out.println("Action中的save方法执行了...");
customerService.save(customer);
return NONE;
}
public String findById() {
Customer customer = customerService.findById(2);
customer.setName("延迟");
return NONE;
}
}
demo地址:https://github.com/king1039/SSH