在实际项目的开发中,为了充分利用各个框架的优点,通常都会把 Spring 与其他框架整合在一起使用。
整合就是将不同的框架放在一个项目中,共同使用它们的技术,发挥它们的优点,并形成互补。一般而言,在进行整合之前都要准备整合环境。
由于整合 SSH 框架时,需要连接数据库进行测试,因此需要准备数据库环境。在 MySQL 数据库中创建一个名称为 ssh 的数据库,并在数据库中创建一个名称为 person 的表,该表中包含 2 个字段,分别是 id 和 name,其中 id 是表的主键,name 表示名称。创建数据库和表的 SQL 语句如下所示:
CREATE DATABASE ssh;
USE ssh;
CREATE TABLE person(
id VARCHAR(32) NOT NULL,
NAME VARCHAR(50) NOT NULL,
PRIMARY KEY(id)
);
2. 配置 Struts2 环境
1)创建项目并导入 Struts2 框架所需的 JAR 包
在 MyEclipse 中创建一个名称为 ssh 的 Web 项目,在项目的 lib 目录中添加 Struts2 框架所需的 JAR 包,并发布到类路径下。
使用的 struts-2.3.37 版本需要导入 13 个 JAR 包,具体如下。
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.4.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
freemarker-2.3.28.jar
javassist-3.11.0.GA.jar
log4j-api-2.3.jar
log4j-core-2.3.jar
ognl-3.0.21.jar
struts2-core-2.3.37.jar
xwork-core-2.3.37.jar
2)添加 log4j.properties 文件
在实际项目开发时,通常需要记录项目日志信息。这时可以在项目中添加一个名称为 log4j.properties 的文件,用于打印日志信息。
在添加 log4j.properties 文件之前,首先在项目中创建一个名为 config 的源文件夹(Source Folder),该文件夹专门用于存放各种配置文件。然后在 Hibernate 解压包中的 project\etc 路径下找到 log4j.properties 的文件,并复制到 config 源文件夹中。打开并编辑后,如下所示。
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=info, stdout 在上述配置代码中,两个 ### 之间的内容是文件的注释信息,第 2~5 行内容表示输出信息到控制台,第 7~10 行内容表示输出日志文件 mylog.log 到 D 盘,第 12 行内容表示设置日志级别为 info,并输出到控制台显示。
3)配置 Struts2 的核心过滤器
在项目的 web.xml 文件中配置 Struts2 的核心过滤器,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- 配置Struts2核心过滤器 -->
<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>
4)添加 struts.xml 配置文件
在 config 文件夹下添加 Struts2 的配置文件 struts.xml,并在文件中将 Struts2 框架配置为开发模式和 simple 主题,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.decMode" value="true" />
<!-- 把主题配置成simple -->
<constant name="struts.ui.theme" value="simple" />
<package name="common" namespace="/" extends="struts-default">
</package>
</struts>
3. 配置 Spring 环境
1)导入 Spring 依赖的 JAR 包
从 Spring 文件的 libs 目录和第三方依赖包中选取所需的 JAR 包,添加到项目的 lib 目录中,并发布到类路径下。Spring 3.2.13 版本依赖的基础 JAR 包共有 15 个,具体如下。
spring-aop-3.2.13.RELEASE.jar
spring-aspects-3.2.13.RELEASE.jar
spring-beans-3.2.13.RELEASE.jar
spring-context-3.2.13.RELEASE.jar
spring-core-3.2.13.RELEASE.jar
spring-expression-3.2.13.RELEASE.jar
spring-jdbc-3.2.13.RELEASE.jar
spring-test-3.2.13.RELEASE.jar
spring-tx-3.2.13.RELEASE.jar
spring-web-3.2.13.RELEASE.jar
spring-orm-3.2.13.RELEASE.jar 第三方依赖包:
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.2.jar 在上述 15 个 JAR 包中,Spring 自带的 JAR 包可以在下载的 Spring 文件的 libs 目录中查找到,而 4 个第三方依赖包可以在网址 https://repo.spring.io/webapp/#/search/quick/ 中搜索并下载。
2)添加 Spring 的核心配置文件
在项目的 config 文件夹中创建一个名称为 spring 的包,并在包中创建 Spring 的核心配置文件 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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
</beans>
3)配置 Spring 的监听器和过滤器
在 web.xml 文件中配置 Spring 的监听器信息,其代码如下所示:
<!-- 监听器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 添加过滤器,延迟session关闭 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在上述配置信息代码中,ContextLoaderListener 是由 Spring 提供的一个监听器类,它在创建时会自动查找名为 contextConfigLocation 的初始化参数,并使用该参数所指定的配置文件,此处表示类路径下 spring 目录中的 applicationContext.xml 文件。
OpenSessionInViewFilter 过滤器的主要功能是延迟 Session 的关闭时间,从而保证延迟加载操作的顺利进行。
4. 配置 Hibernate 环境
1)导入 Hibernate 所需的 JAR 包
Hibernate 3.6.10 版本,此版本的 Hibernate 所依赖的 JAR 包共 12 个,具体如下。
antlr-2.7.6.jar
c3p0-0.9.1.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate3.jar
javassist-3.12.0.GA.jar(不需要添加)
jta-1.1.jar
log4j-1.2.17.jar
mysql-connector-java-5.1.0-bin.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar 选取上述 JAR 包,添加到 ssh 项目的 WEB-INF/lib 目录中,并发布到类路径下。需要注意的是,在上述 JAR 包中,javassist-3.12.0.GA.jar 在配置 Struts 2 环境时已经添加过,所以这里不需要重复添加。
2)添加核心配置文件 hibernate.cfg.xml
在项目的 config 文件夹中创建一个名称为 hibernate 的包,并在该包中添加配置文件 hibernate.cfg.xml,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 1. 基本4项 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=utf-8]]>
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1128</property>
<!-- 2.指定方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<!-- 3.sql语句 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 4.取消验证 -->
<property name="javax.persistence.validation.mode">none</property>
<!-- 5.本地线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 6.整合C3P0 -->
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5 </property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_sizen">20 </property>
<!--设定数据库连接的过期时间,以ms为单位,如果连接池中的某个数据库连接空闲状态的时间 超过timeout时间,则会从连接池中清除 -->
<property name="c3p0.timeout">120 </property>
<!--每3000s检查所有连接池中的空闲连接以s为单位 -->
<property name="c3p0.idle_test_period">3000 </property>
<!-- 配置所有的hbm.xml,交予Spring管理映射文件 -->
</session-factory>
</hibernate-configuration>
在上述配置中,分别配置了连接数据库的四项基本信息、方言等内容。至此,Strut2、Spring 和 Hibernate 的环境均准备完成,完成后的项目环境结构如图

三大框架的配置文件和日志文件都在 config 源文件夹中统一管理,此时如果查看 lib 目录,会发现该目录中共有 39 个 JAR 包。
Spring 与 Hibernate 整合
Spring 对 Hibernate 提供的支持主要包括:将 Hibernate 需要用到的数据源 DataSource(如 BasicDataSource 数据源或 C3P0 数据源)、Hibernate 的 SessionFactory 实例(如 LocalSessionFactoryBean)及其事务管理器 HibernateTransactionManager 移交给 Spring 容器管理,同时,Spring 框架还对 Hibernate 进行了封装,提供了统一的模板化操作。
Spring 整合 Hibernate 时,需要添加一个支持整合的 JAR 包 spring-orm-3.2.13.RELEASE.jar,该 JAR 包可以在 Spring 解压目录的 libs 目录中找到。添加后,即可进行整合工作。
下面通过案例演示整合过程。
1. 创建实体类
在项目的 src 下创建一个名称为 com.mengma.ssh.domain 的包,在该包中创建一个名称为 Person 的类,编辑后如下所示。
package com.mengma.ssh.domain;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -3541561917509006050L;
private String id;
private String name;
public Person() {
}
public Person(String name) {
super();
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. 创建映射文件
在 com.mengma.ssh.domain 包中编写 Person 类的映射文件 Person.hbm.xml,编辑后如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.mengma.ssh.domain.Person" table="person">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<!-- 采用uuid.hex作为主键生成机制 -->
<generator class="uuid.hex" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" not-null="true" />
</property>
</class>
</hibernate-mapping>
3. 编写 Spring 的配置信息
在 applicationContext.xml 中添加 Spring 加载 Hibernate 配置文件的信息,其代码如下所示:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 1.1确定文件位置 -->
<property name="configLocation" value="classpath:hibernate/hibernate.cfg.xml"/>
<!-- 1.2配置hbm.xml映射文件,mappingDirectoryLocationd表示本地映射文件的目录 -->
<property name="mappingDirectoryLocations" value="classpath:com/mengma/*/domain"/>
</bean>
4. 编写测试类
在 src 下创建一个名称为 com.mengma.test 的包,并在包中创建测试类文件 TestMerge.java,编辑后如下所示。
package com.mengma.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mengma.ssh.domain.Person;
/**
* 整合测试类
*
*/
public class TestMerge {
ClassPathXmlApplicationContext ctx;
@Before
public void loadCtx() {
// 加载配置文件
ctx = new ClassPathXmlApplicationContext(
"spring/applicationContext.xml");
}
@Test
public void testHibernate() {
SessionFactory sf = (SessionFactory) ctx.getBean("sessionFactory");
Session session = sf.openSession();
Transaction transaction = session.beginTransaction();
session.save(new Person("用户1"));
transaction.commit();
session.close();
sf.close();
}
}
在上述代码中,创建了两个方法,即 loadCtx() 和 testHibernate()。loadCtx() 方法的主要作用是加载 Spring 的配置文件信息,由于在该方法上使用了 JUnit 注解 @Before,所以该方法会在运行其他方法之前运行。 testHibernate() 方法的主要作用是使用 Hibernate 向数据库的 person 表中插入一条用户名为“用户1”的信息。
Spring 与 Struts2 整合
在 Struts2 与 Spring 整合时,需要导入一个名称为 struts2-spring-plugin-2.3.37 的 JAR 包,该 JAR 包可以在 Struts2 解压包的 lib 目录中找到。
如果可以在 Action 中正确调用 Service 中的执行方法并返回到一个页面中,那么就可以认定 Struts2 和 Spring 的整合是成功的。
1. 实现 Service 的配置
1)创建接口
在 src 下创建一个名称为 com.mengma.ssh.service 的包,在包中创建一个名称为 PersonService 的接口,该接口中声明了一个 say() 方法,其代码如下所示。
package com.mengma.ssh.service;
public interface PersonService {
public void say();
}
2)创建接口实现类
在 src 下创建一个名称为 com.mengma.ssh.service.impl 的包,在该包中创建 PersonService 接口的实现类 PersonServiceImpl,编辑后如下所示。
package com.mengma.ssh.service.impl;
import com.mengma.ssh.service.PersonService;
public class PersonServiceImpl implements PersonService {
@Override
public void say() {
System.out.println("Service say hello");
}
}
在上述代码中,实现了 PersonService 接口中的 say() 方法,并使用输出语句输出一行信息。
3)配置 Spring
在 spring 包中创建一个名称为 applicationContext_person.xml 的 Spring 配置文件,在文件中添加 PersonServiceImpl 类的 Bean 信息,添加代码如下所示:
<bean id="personService" class="com.mengma.ssh.service.impl.PersonServiceImpl"/> 创建并编写完配置文件后,还需要在 applicationContext.xml 中引入 applicationContext_person.xml。其引入方式非常简单,只需在 applicationContext.xml 中添加如下代码即可:
<import resource="classpath:spring/applicationContext_person.xml"/>
4)验证配置
为了验证 Spring 的加载是否正确,可以在测试类 TestMerge.java 中创建一个名称为 testSpring 的方法进行测试。该方法代码如下所示:
/**
* 测试Spring加载是否正确
*/
@Test
public void testSpring(){
PersonService ts = (PersonService)ctx.getBean("personService");
ts.say();
}
2. 实现 Action 的配置
1)创建 Action
在 src 下创建一个名称为 com.mengma.ssh.action 的包,在该包下创建一个名称为 PersonAction 的类,并在类中使用 execute() 方法调用 PersonService 对象的 say() 方法,其代码如下所示。
package com.mengma.ssh.action;
import com.mengma.ssh.service.PersonService;
import com.opensymphony.xwork2.ActionSupport;
public class PersonAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private PersonService personService;
public PersonService getPersonService() {
return personService;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
public String execute() {
personService.say();
return SUCCESS;
}
}
2)创建和引入 Struts2 的配置文件
在 config 源文件夹下创建一个名称为 struts 的包,在该包中创建一个名为 struts-person.xml 的配置文件,编辑后如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="test-package" namespace="/" extends="struts-default">
<action name="person_*" class="com.mengma.ssh.action.PersonAction"
method="{1}">
<result name="success">test.jsp</result>
</action>
</package>
</struts>
将 struts-person.xml 导入到 struts.xml 文件中,其导入代码如下所示:
<include file="struts/struts-*.xml"/> 在上述代码中,使用了通配符*将所有以 struts -开头的文件都引入到 struts.xml 中,这样,以后在增加配置文件时,就不再需要在 struts.xml 中增加 include 语句。
3)配置 Action 的 Bean 信息
在 applicationContext_person.xml 中添加 PersonAction 的 Bean 信息,添加后的主要代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="test-package" namespace="/" extends="struts-default">
<action name="person_*" class="com.mengma.ssh.action.PersonAction"
method="{1}">
<result name="success">test.jsp</result>
</action>
</package>
</struts>
3. 创建测试页面,查看测试结果
在 WebContent 目录下创建一个名称为 test.jsp 的页面文件,在页面的 <body> 元素中编写一个“Hello”。启动项目后,在浏览器的地址栏中输入地址http://localhost:8080/ssh/person.action 后,浏览器的显示结果如图

吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSH框架(Struts2+Spring+Hibernate)搭建整合详细步骤的更多相关文章

  1. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:继承的应用

    class Array{ // 表示数组 private int temp[] ; // 整型数组 private int foot ; // 定义添加位置 public Array(int len) ...

  2. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:匿名内部类

    interface A{ public void printInfo() ; // } class B implements A{ // 实现接口 public void printInfo(){ S ...

  3. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类

    public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...

  4. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:Object类

    class Demo{ // 定义Demo类,实际上就是继承了Object类 }; public class ObjectDemo01{ public static void main(String ...

  5. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:宠物商店实例分析

    interface Pet{ // 定义宠物接口 public String getName() ; public String getColor() ; public int getAge() ; ...

  6. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:抽象类与接口的应用

    abstract class A{ // 定义抽象类A public abstract void print() ; // 定义抽象方法print() }; class B extends A { / ...

  7. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:instanceof关键字

    class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun ...

  8. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:对象的多态性

    class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun ...

  9. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:接口的基本实现

    interface A{ // 定义接口A public static final String AUTHOR = "李兴华" ; // 全局常量 public abstract ...

  10. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:final关键字

    final class A{ // 使用final定义类,不能有子类 }; class B extends A{ // 错误,不能被继承 }; class A{ public final void p ...

随机推荐

  1. ubuntu18.04调整终端字体大小

    一.在终端内右键->Preferences. 二.选中Custom font,然后点击旁边的Monospace Regular 20. 三.在该界面可以选择字体类型,右下角可以调整字体大小.

  2. Day2-D-Oil Deposits-POJ-1562

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...

  3. 循环调用spring的dao,数个过后无响应

    循环调用spring的dao,数个过后无响应 博客分类: spring daospringssh      最近遇到这么一个问题:前台按钮发送AJax请求到后台,后台是SSH框架.每点击一下按钮就发送 ...

  4. Java系列之:看似简单的问题 静态方法和实例化方法的区别

    (2011-12-06 15:28:26) 转载▼ 标签: 杂谈 分类: study 今天看书时一直没真正弄明白静态方法和实例方法的区别,就在网上搜索,找到一篇很好的文章,和大家分享一下: 这是一个经 ...

  5. Lesson 47 The great escape

    What is one of the features of modern camping where nationality is concerned? Economy is one powerfu ...

  6. redis.rpm 安装

    yum install jemalloc wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/redis-3.0.7 ...

  7. mysql 安装完以后没有mysql服务

    用管理员身份打开命令控制台(cmd),然后将mysql的安装文件的路径打开(bin文件的路径),然后再路径下打上mysqld.exe -install, 会出现提示  Service successf ...

  8. 2-10 就业课(2.0)-oozie:11、hadoop的federation(联邦机制,了解一下)

    ==================================================== Hadoop Federation 背景概述 单NameNode的架构使得HDFS在集群扩展性 ...

  9. 实验吧——Recursive

    环境:win10,kali虚拟机 工具:ida 虚拟机打开看看,发现是ELF文件,运行一下,额没有什么发现. Ida打开看看,发现是在文件内部运行python解释器,百度搜索了一个基本上可以找到Py_ ...

  10. 转载-select、poll、epoll区别总结

    I/O多路复用——epoll函数 select.poll.epoll区别总结 一.select.poll.epoll区别总结   1 本质上都是同步I/O 三者都是I/O复用,本质上都属于同步I/O. ...